diff --git a/.gitignore b/.gitignore index f48ddc72ffb73c6af1e3f1b717610b9c02a966bf..e093c59e03a0b81cc7e954c487083935f5e42d8a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,8 @@ myproject/node_modules myproject/env myproject/myapp/static/CACHE myproject/myapp/__pycache__ +.DS_Store +myproject/myproject/__pycache__/__init__.cpython-312.pyc +myproject/myproject/__pycache__/settings.cpython-312.pyc +myproject/myproject/__pycache__/urls.cpython-312.pyc .venv/ -.DS_Store \ No newline at end of file diff --git a/myproject/.env b/myproject/.env index ef6b41180fb05251bb604bd805a5edcf6e910373..e4a94e923637c072c2af1336d677b2d7ea0fef1f 100644 --- a/myproject/.env +++ b/myproject/.env @@ -1,17 +1,7 @@ # Django DJANGO_SECRET_KEY='django-insecure-t%k1f1!c4_9f#x@r_z_k69oz21@0eadh2qb_k3pm3=gknej9f@' - DEBUG=True -# # Database -# DATABASE_NAME=mlaas -# DATABASE_USER=user -# DATABASE_PASSWORD=password -# DATABASE_HOST=db -# DATABASE_PORT=3306 - - - #postgres POSTGRES_DB=mlaas POSTGRES_NAME=mlaas diff --git a/myproject/docker-compose.yml b/myproject/docker-compose.yml index 69db97839f54bb548e9dc9cefbb17c94e269407f..84ac46fcb7746ef1f31bc090b71aa5ad58bdb5ca 100644 --- a/myproject/docker-compose.yml +++ b/myproject/docker-compose.yml @@ -1,48 +1,3 @@ -# version: '3.8' -# services: -# db: -# image: mysql:8.3 -# volumes: -# - mysql_data:/var/lib/mysql -# #- ./db_script.sql:/docker-entrypoint-initdb.d/init-db.sql -# restart: unless-stopped -# ports: -# - "3307:3306" -# environment: -# MYSQL_ROOT_PASSWORD: root_password -# MYSQL_DATABASE: mlaas -# MYSQL_USER: user -# MYSQL_PASSWORD: password -# web: -# build: . -# command: /bin/sh -c "/entrypoint.sh" -# volumes: -# - .:/usr/src/app -# - static_volume:/usr/src/app/static -# depends_on: -# - db -# environment: -# #DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY} -# #DEBUG: ${DEBUG} -# DATABASE_NAME: ${DATABASE_NAME} -# DATABASE_USER: ${DATABASE_USER} -# DATABASE_PASSWORD: ${DATABASE_PASSWORD} -# DATABASE_HOST: ${DATABASE_HOST} -# DATABASE_PORT: ${DATABASE_PORT} -# ports: -# - "8000:8000" -# tailwind: -# image: node:20.11.1-slim -# working_dir: /usr/src/app -# volumes: -# - .:/usr/src/app -# - static_volume:/usr/src/app/static - - -# volumes: -# static_volume: -# mysql_data: - version: '3.8' services: @@ -74,9 +29,7 @@ services: POSTGRES_PORT: ${POSTGRES_PORT} ports: - "8000:8000" -#legacy env file - # env_file: - # - ./.end.dev + tailwind: image: node:20.11.1-slim working_dir: /usr/src/app diff --git a/myproject/myapp/forms.py b/myproject/myapp/forms.py index a693ce7226a8bf4d18f4e5a830222f296c943e7c..57f77dcfaeddf2e1b9e333f18d26456c77c6625f 100644 --- a/myproject/myapp/forms.py +++ b/myproject/myapp/forms.py @@ -1,5 +1,20 @@ -# forms.py +<<<<<<< myproject/myapp/forms.py from django import forms +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User + +class CustomRegistrationForm(UserCreationForm): + #UserCreationForm comes with username, password1, password2 by default + #only email needs to be added for our custom users + email = forms.EmailField() + + class Meta(UserCreationForm.Meta): + model = User + fields = ["username", "email", "password1", "password2"] + +class LoginForm(forms.Form): + username = forms.CharField() + password = forms.CharField(widget=forms.PasswordInput) class InstrumentDetectionForm(forms.Form): audio_file = forms.FileField( @@ -13,3 +28,4 @@ class InstrumentDetectionForm(forms.Form): }) ) + diff --git a/myproject/myapp/models.py b/myproject/myapp/models.py index ce6212efa138aaf18cc1f7b83b88607e3e25fdef..f61b35dc0b7786e576c90f0f5e481fc4991e0552 100644 --- a/myproject/myapp/models.py +++ b/myproject/myapp/models.py @@ -1,8 +1,38 @@ from django.db import models -from django.contrib.auth.models import User -from django.contrib.postgres.fields import JSONField +from django.contrib.auth import get_user_model +from django.contrib.auth.models import User, Group, Permission +from django.contrib.contenttypes.models import ContentType from enum import Enum +# class UserTypes(User): +# USER_TYPE_CHOICES = ( +# 0, 'Basic User', +# 1, 'Admin', +# 2, 'ML Engineer', +# 3, 'Accountant' +# ) + +# usertype = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES) # should we declare default=0 here? + +# group_names = ['Basic User', 'Admin', 'ML Engineer', 'Accountant'] +# for group_name in group_names: +# Group.objects.get_or_create(name=group_name) + +# assign group permissions +# content_type = ContentType.objects.get_for_model(UserTypes) +# permission = Permission.objects.create(codename='can_view_user', +# name='Can View User', +# content_type=content_type) +# group = Group.objects.get(name='Admin') +# group.permissions.add(permission) + + +# User = get_user_model() + +# user = User.objects.create_user('username', 'email', 'password') +#names are not necessary - reduces gdpr concerns aswell + + class Action(Enum): UPLOAD_FILE = 'upload_file' LOGIN = 'login' @@ -16,29 +46,6 @@ class Action(Enum): USER_DOES_NOT_EXIST = 'user_does_not_exist' DOWNLOAD_BREAKDOWN = 'download_breakdown' UNKNOWN = 'unknown' -# # Usertypes -# # --------- -# # 0 - Basic User -# # 1 - Admin -# # 2 - ML Engineer -# # 3 - Accountant - -# # Create your models here. -# class User(models.Model): -# """ -# * User model -# """ -# username = models.CharField(max_length=150) -# password = models.CharField(max_length=16) -# email = models.EmailField(max_length=200) -# usertype = models.ForeignKey("UserType", on_delete=models.DO_NOTHING) - -# class UserType(models.Model): -# """ -# * Usertype model -# """ -# usertype = models.CharField(max_length=15) - # class Logs(models.Model): # """ diff --git a/myproject/myapp/templates/_base.html b/myproject/myapp/templates/_base.html index 5e35e256a65a6f7ea62658e727a4d1ee916fa7fb..c7cc36d4c38097ecd5f55efe699670f5a1234528 100644 --- a/myproject/myapp/templates/_base.html +++ b/myproject/myapp/templates/_base.html @@ -58,7 +58,7 @@ </li> <li> <a - href="{% url 'login' %}" + href="{% url 'user_login' %}" class="block py-2 px-3 text-gray-900 rounded hover:bg-gray-100 md:hover:bg-transparent md:border-0 md:hover:text-blue-700 md:p-0 dark:text-white md:dark:hover:text-blue-500 dark:hover:bg-gray-700 dark:hover:text-white md:dark:hover:bg-transparent" >Login</a > diff --git a/myproject/myapp/templates/login.html b/myproject/myapp/templates/login.html index be83014bdd899f2b53b057eb3ed1da78d91b9592..bbd3d038acf13d9f84ce685393d7ed8a73f2653c 100644 --- a/myproject/myapp/templates/login.html +++ b/myproject/myapp/templates/login.html @@ -6,7 +6,28 @@ <h1 class="text-xl font-bold leading-tight tracking-tight text-gray-900 md:text-2xl dark:text-white"> Sign in to your account </h1> - <form class="space-y-4 md:space-y-6" action="#"> + + + <form method="POST"> + {% csrf_token %} + {{ form.as_p }} + <br> + <button type="submit">Login</button> + <br> + <a href="{% url 'register' %}">New User: Create Account</a> + </form> + + </div> + </div> + </div> + </section> +{% endblock content%} + +{% comment %} + + +<form class="space-y-4 md:space-y-6" action="#" method="POST"> + {% csrf_token %} <div> <label for="email" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Your email</label> <input type="email" name="email" id="email" class="bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" required=""> @@ -31,8 +52,6 @@ Don’t have an account yet? <a href="#" class="font-medium text-primary-600 hover:underline dark:text-primary-500">Sign up</a> </p> </form> - </div> - </div> - </div> - </section> -{% endblock content%} \ No newline at end of file + + +{% endcomment %} \ No newline at end of file diff --git a/myproject/myapp/templates/register.html b/myproject/myapp/templates/register.html index baed31f98e5325c326a4449cd4838af0a34e44ca..d6cb1d0e32d7131901279ee374a0afb5ee1dfd6f 100644 --- a/myproject/myapp/templates/register.html +++ b/myproject/myapp/templates/register.html @@ -6,7 +6,29 @@ <h1 class="text-xl font-bold leading-tight tracking-tight text-gray-900 md:text-2xl dark:text-white"> Create an account </h1> - <form class="space-y-4 md:space-y-6" action="#"> + <form method="POST"> + {% csrf_token %} + {{ form.as_p }} + <br> + <button type="submit">Register</button> + <br> + <a href="{% url 'user_login' %}">Already created an account? Login</a> + </form> + </div> + </div> + </div> + </section> +{% endblock content%} + +{% comment %} +<h1> Register </h1> + + + + + <form class="space-y-4 md:space-y-6" action="#" method="POST"> + {% csrf_token %} + <div> <label for="email" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Your email</label> <input type="email" name="email" id="email" class="bg-gray-50 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-primary-600 focus:border-primary-600 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500" placeholder="name@company.com" required=""> @@ -32,8 +54,5 @@ Already have an account? <a href="#" class="font-medium text-primary-600 hover:underline dark:text-primary-500">Login here</a> </p> </form> - </div> - </div> - </div> - </section> -{% endblock content%} \ No newline at end of file + +{% endcomment %} diff --git a/myproject/myapp/urls.py b/myproject/myapp/urls.py index e4a569e47d050e54dd3ffb487a607712ac8d55fb..22aeca3b6be4e9a1c48177666d6ff362f2ef9783 100644 --- a/myproject/myapp/urls.py +++ b/myproject/myapp/urls.py @@ -1,28 +1,18 @@ from django.urls import path -from .views import index -from .views import users -from .views import maintenance -from .views import handler404 -from .views import handler500 -from .views import register -from .views import login -from .views import terms_conditions -from .views import privacy_policy -from .views import handling_music_file +<<<<<<< myproject/myapp/urls.py +from .views import index, users, maintenance, handler404, handler500, register, user_login, terms_conditions, privacy_policy, handling_music_file, pricing, generate_pdf -from .views import pricing -from .views import generate_pdf - urlpatterns = [ # path('', index, name='index'), <- uncomment when index/main page will be ready path('', index), + path('user/', users, name='users'), path('404/', handler404), path('500/', handler500), path('maintenance/', maintenance), path('register/', register, name='register'), - path('login/', login, name='login'), + path('login/', user_login, name='user_login'), path('terms_conditions/', terms_conditions, name='terms_conditions'), path('pricay_policy/', privacy_policy, name='privacy_policy'), path('pricing/', pricing, name='pricing'), diff --git a/myproject/myapp/views.py b/myproject/myapp/views.py index cfa8ed3c0d10a6aa466db187952e316b3a5e6363..0c4fea8ed905f4a3cc49a0927463f7e7cdeff0de 100644 --- a/myproject/myapp/views.py +++ b/myproject/myapp/views.py @@ -1,11 +1,17 @@ -from django.shortcuts import render -from django.template import RequestContext -import logging +from django.contrib.auth import authenticate, login, logout +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User +from django.contrib import messages from django.http import HttpResponse from django.utils import timezone +from django.shortcuts import render, redirect +from django.template import RequestContext +import logging +from reportlab.pdfgen import canvas + +from .forms import InstrumentDetectionForm, CustomRegistrationForm, LoginForm +from .models import Log, Action, User -from .forms import InstrumentDetectionForm -from .models import Log, Action logger = logging.getLogger(__name__) @@ -34,9 +40,8 @@ def handling_music_file(request): log_data = get_log_data(Action.invalid_file, 'error') # create_log(None, log_data) return HttpResponse('File invalid',log_data) -from .models import User -from django.http import HttpResponse -from reportlab.pdfgen import canvas + + def index(request): #for now this authenication just returns the main view @@ -69,11 +74,43 @@ def handler500(request, *args, **kwargs): def maintenance(request): return render(request, 'maintenance.html') -def login(request): - return render(request, 'login.html') +def user_login(request): + if request.method == 'POST': + form = LoginForm(request.POST) + + if form.is_valid(): + username = form.cleaned_data.get('username') + password = form.cleaned_data.get('password') + + user = authenticate(request, username=username, password=password) # Passing request along with username and password + + if user: + login(request, user=user) # Passing request along with user + return redirect('users') + else: + messages.error(request, 'Invalid username or password.') + else: + pass + + else: + form = LoginForm() + return render(request, 'login.html', {'form': form}) + def register(request): - return render(request, 'register.html') + if request.method == 'POST': + form = CustomRegistrationForm(request.POST) + if form.is_valid(): + form.save() + return redirect('user_login') + else: + form = CustomRegistrationForm() + + return render(request, 'register.html', {'form': form}) + +def user_logout(request): + logout(request) + return redirect('user_login') def terms_conditions(request): return render(request, 'terms_conditions.html') diff --git a/myproject/myproject/settings.py b/myproject/myproject/settings.py index ae24b76ecb344efe76bc54fa8d2c153678f04532..1725ba2e02c1db575915dd7a88a048763feab2c3 100644 --- a/myproject/myproject/settings.py +++ b/myproject/myproject/settings.py @@ -170,3 +170,5 @@ STATIC_URL = 'static/' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' IMAGE_URL = 'static/src/images/' + +LOGIN_REDIRECT_URL = '/' diff --git a/myproject/requirements.txt b/myproject/requirements.txt index ba83400cc62f6f10a76948b71e3ca5b25081e705..770ecd9861ebf9de2482dfe22b18c693de53bf54 100644 --- a/myproject/requirements.txt +++ b/myproject/requirements.txt @@ -2,6 +2,7 @@ asgiref==3.7.2 Django==5.0.1 django-appconf==1.0.6 django-compressor==4.4 +django-tailwind==3.8.0 mysqlclient==2.2.3 rcssmin==1.1.1 rjsmin==1.2.1