diff --git a/ActualProjectCode/DjangoProject/core/forms.py b/ActualProjectCode/DjangoProject/core/forms.py index 4dc71124dd6e348e9b3fde47e1de7c2a9b666e5f..603a1e442b7659a655fe795f3c43532f95814f44 100644 --- a/ActualProjectCode/DjangoProject/core/forms.py +++ b/ActualProjectCode/DjangoProject/core/forms.py @@ -1,13 +1,31 @@ from django import forms from django.forms import ModelForm from django.contrib.auth.models import User -from .models import Record +from . import models class UserLoginForm(forms.Form): username = forms.CharField(max_length=100) password = forms.CharField(widget=forms.PasswordInput) class UserUploadForm(forms.ModelForm): + username = forms.CharField(max_length=100, widget=forms.HiddenInput) class Meta: - model = Record - fields = '__all__' \ No newline at end of file + model = models.Record + fields = ['username', 'uploadedFile','chosenML'] + +class UploadModelForm(forms.ModelForm): + username = forms.CharField(max_length=100, widget=forms.HiddenInput) + class Meta: + model = models.mlModel + fields = ['username','modelName'] + +class GenerateBillingsForm(forms.ModelForm): + username = forms.CharField(max_length=100, widget=forms.HiddenInput) + class Meta: + model = models.Billing + fields = ['amount', 'username', 'companyName'] + +class UpdateUser(forms.ModelForm): + class Meta: + model = models.Profile + fields = ['user', 'role'] \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/core/migrations/0001_initial.py b/ActualProjectCode/DjangoProject/core/migrations/0001_initial.py deleted file mode 100644 index 5732ba1f309de0df7bb726221fce903e1aacb973..0000000000000000000000000000000000000000 --- a/ActualProjectCode/DjangoProject/core/migrations/0001_initial.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.1.7 on 2025-03-13 15:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='user', - fields=[ - ('userID', models.IntegerField(primary_key=True, serialize=False)), - ('username', models.CharField(max_length=100)), - ('password', models.CharField(max_length=100)), - ('usertypes', models.CharField(max_length=100)), - ], - ), - ] diff --git a/ActualProjectCode/DjangoProject/core/models.py b/ActualProjectCode/DjangoProject/core/models.py index ebf45c53107f3518c4f063d944e9386ce5a3eca0..9885224e5c99c3c2d2a10d00c0b5c531c435b7a0 100644 --- a/ActualProjectCode/DjangoProject/core/models.py +++ b/ActualProjectCode/DjangoProject/core/models.py @@ -11,10 +11,10 @@ class Profile(models.Model): class mlModel(models.Model): modelID = models.AutoField(primary_key=True) username = models.CharField(max_length=100, default="default") - modelName = models.CharField(max_length=100) + modelName = models.FileField(upload_to="./mlModels/modelName", null=True, blank=True) def __str__(self): - return self.modelName + return f"{self.username} NEW MODEL ID: {self.modelID} Path: {self.modelName}" class Interaction(models.Model): interactionID = models.AutoField(primary_key=True) @@ -32,13 +32,14 @@ class Billing(models.Model): companyName = models.CharField(max_length=100) def __str__(self): - return f"{self.companyName} - {self.billingID}" + return f"{self.companyName} Billing - ID: {self.billingID}" class Record(models.Model): username = models.CharField(max_length=100, default="default") - uploadedFile = models.FileField(upload_to='./records/') + uploadedFile = models.FileField(upload_to='./records/', null=True, blank=True) chosenML = models.CharField(max_length=100, default="baseML") responseByML = models.CharField(max_length=100, default="PLACEHOLDER RESPONSE") # change to actual response by ML + def __str__(self): - return f"{self.chosenML} Response to {self.userID}" \ No newline at end of file + return f"{self.chosenML} Response to {self.username}" \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/core/views.py b/ActualProjectCode/DjangoProject/core/views.py index 8ef49d7181067f5eaf2e8fe832bb2f02faedf41f..1b43c5a0742497ff361f93653692dd953c1c8937 100644 --- a/ActualProjectCode/DjangoProject/core/views.py +++ b/ActualProjectCode/DjangoProject/core/views.py @@ -1,10 +1,11 @@ from django.contrib.auth import authenticate, login, logout from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.http import HttpResponse from .models import Profile, mlModel, Billing, Interaction, Record -from .forms import UserLoginForm, UserUploadForm +from .forms import UserLoginForm, UserUploadForm, UploadModelForm, GenerateBillingsForm, UpdateUser # Registration view @@ -35,12 +36,7 @@ def login_view(request): profile = user.profile role = profile.role # Redirect to the correct profile page based on the user's role - if role == 'ai_engineer': - return redirect('ai_dashboard') - elif role == 'finance': - return redirect('finance_dashboard') - else: - return redirect('user_dashboard') + return redirect('profile') else: # Handle invalid login return render(request, 'login.html', {'error': 'Invalid credentials'}) @@ -48,17 +44,65 @@ def login_view(request): form = UserLoginForm() return render(request, 'login.html', {'form': form}) -def user_dashboard(request): - return render(request, 'dashboards/user_dashboard.html') +def profile(request): + return render(request, 'profile.html') -def ai_dashboard(request): - return render(request, 'dashboards/ai_dashboard.html') +def userUpload(request): + form = UserUploadForm(initial={'username': request.user.username}) # sets username in form. + if request.method == 'POST': + form = UserUploadForm(request.POST or None, request.FILES or None) + if form.is_valid(): + form.save() + return redirect('profile') + context = {'form': form} + return render(request, 'modelForms/userUpload.html', context) + +def mlUpload(request): + form = UploadModelForm(initial={'username': request.user.username}) + if request.method == 'POST': + form = UploadModelForm(request.POST or None, request.FILES or None) + if form.is_valid(): + form.save() + return redirect('profile') + context = {'form': form} + return render(request, 'modelForms/mlUpload.html', context) + +def genBillings(request): + form = GenerateBillingsForm(initial={'username': request.user.username}) + if request.method == 'POST': + form = GenerateBillingsForm(request.POST) + if form.is_valid(): + form.save() + return redirect('profile') + context = {'form': form} + return render(request, 'modelForms/genBillings.html', context) -def admin_dashboard(request): - return render(request, 'dashboards/admin_dashboard.html') +def manageUsers(request): + profile = Profile.objects.all() + return render(request, 'modelForms/manageUsers.html', {'profile': profile}) + +def updateUsers(request, id): + user = Profile.objects.get(id=id) + form = UpdateUser(instance=user) + + if request.method == 'POST': + form=UpdateUser(request.POST, instance=user) + if form.is_valid(): + form.save() + return redirect('profile') + + context = {'form': form} + return render(request, 'modelForms/updateUsers.html', context) + +def deleteUsers(request, id): + user = Profile.objects.get(id=id) + if request.method == 'POST': + user.delete() + # because of how users are stored, we need to delete from both Profile and User + return('profile') -def finance_dashboard(request): - return render(request, 'dashboards/finance_dashboard.html') + context = {'user': user} + return render(request, 'modelForms/deleteUsers.html', context) def logout_view(request): logout(request) diff --git a/ActualProjectCode/DjangoProject/mlModels/main.py b/ActualProjectCode/DjangoProject/mlModels/main.py new file mode 100644 index 0000000000000000000000000000000000000000..ce14de2cad0c0609960c4b6750c99752b5e2c34a --- /dev/null +++ b/ActualProjectCode/DjangoProject/mlModels/main.py @@ -0,0 +1,12 @@ +# point of this file is do be the driver of a selected ML model / IPYNB file in modelName directory + +# This file is planned to be called when a end-user uploads a file. + +# + + +# receive form from main website + +# contact model in directory and get response from it - store in variable + +# return response by ml back into db. \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/server/urls.py b/ActualProjectCode/DjangoProject/server/urls.py index c3b59eba97a50f59f27e4e2ee74e5e907e77161e..30973c4475bc0da841348b1deb0024afc9091fc9 100644 --- a/ActualProjectCode/DjangoProject/server/urls.py +++ b/ActualProjectCode/DjangoProject/server/urls.py @@ -34,8 +34,12 @@ urlpatterns = [ path('logout/', views.logout_view, name='logout'), path('login/', views.login_view, name='login'), path('register/', views.register_view, name='register'), - path('admin_dashboard/', views.admin_dashboard, name="admin_dashboard"), - path('user_dashboard/', views.user_dashboard, name='user_dashboard'), - path('ai_dashboard/', views.ai_dashboard, name='ai_dashboard'), - path('finance_dashboard/', views.finance_dashboard, name='finance_dashboard'), + path('profile/', views.profile, name="profile"), + path('modelForms/userUpload', views.userUpload, name="userUpload"), + path('modelForms/mlUpload', views.mlUpload, name="mlUpload"), + path('modelForms/genBillings', views.genBillings, name="genBillings"), + path('modelForms/manageUsers/', views.manageUsers, name="manageUsers"), + path('modelForms/updateUsers/<str:id>/', views.updateUsers, name="updateUsers"), + path('modelForms/deleteUsers/<str:id>/', views.deleteUsers, name="deleteUsers"), + ] \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/dashboards/admin_dashboard.html b/ActualProjectCode/DjangoProject/templates/dashboards/admin_dashboard.html deleted file mode 100644 index a1ef3a95fa480bdc680facc094900eb1143dd1d9..0000000000000000000000000000000000000000 --- a/ActualProjectCode/DjangoProject/templates/dashboards/admin_dashboard.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>User Dashboard</title> -</head> - -<body> - -</body> - -</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/dashboards/ai_dashboard.html b/ActualProjectCode/DjangoProject/templates/dashboards/ai_dashboard.html deleted file mode 100644 index a1ef3a95fa480bdc680facc094900eb1143dd1d9..0000000000000000000000000000000000000000 --- a/ActualProjectCode/DjangoProject/templates/dashboards/ai_dashboard.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>User Dashboard</title> -</head> - -<body> - -</body> - -</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/dashboards/finance_dashboard.html b/ActualProjectCode/DjangoProject/templates/dashboards/finance_dashboard.html deleted file mode 100644 index a1ef3a95fa480bdc680facc094900eb1143dd1d9..0000000000000000000000000000000000000000 --- a/ActualProjectCode/DjangoProject/templates/dashboards/finance_dashboard.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>User Dashboard</title> -</head> - -<body> - -</body> - -</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/dashboards/user_dashboard.html b/ActualProjectCode/DjangoProject/templates/dashboards/user_dashboard.html deleted file mode 100644 index 894505fd4d2a8c050dca1c48549c96eaba4f42ae..0000000000000000000000000000000000000000 --- a/ActualProjectCode/DjangoProject/templates/dashboards/user_dashboard.html +++ /dev/null @@ -1,27 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>{{ user.username }}'s Dashboard</title> -</head> - -<body> - <nav> - <ul> - <li><a href="{% url 'logout' %}">Logout</a></li> - </ul> - </nav> - <h1>Welcome, {{ user.username }}!</h1> - <h2>User Dashboard</h2> - <p>Manage your tasks and profile.</p> - <br> - <h2>Upload Files to ML</h2> - {% block content %} - <form method="post"> - {% csrf_token %} - {{form.as_p}} - <input type="submit"> - </form> - {% endblock %} -</body> - -</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/deleteUsers.html b/ActualProjectCode/DjangoProject/templates/modelForms/deleteUsers.html new file mode 100644 index 0000000000000000000000000000000000000000..012beb107294f38e0e9b43086ba80a4263cc840b --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/deleteUsers.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> + +</head> +<body> + +<p> Are you sure you want to delete the account named "{{user.user}}"? </p> + +<form action="{% url 'deleteUsers' user.id %}" method="POST"> + {% csrf_token %} + + <a href="{% url 'manageUsers' %}">Cancel</a> + + <input type="submit" name="confirm"> +</form> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/genBillings.html b/ActualProjectCode/DjangoProject/templates/modelForms/genBillings.html new file mode 100644 index 0000000000000000000000000000000000000000..c121bf6dff0a53597221ff8bbb5d17fda5282622 --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/genBillings.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html> +<head> + <title>Billing Page</title> +</head> + +<body> + + <form action="" method="POST"> + {% csrf_token %} + {{ form }} + <input type="submit"> + </form> + +</body> + +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/manageUsers.html b/ActualProjectCode/DjangoProject/templates/modelForms/manageUsers.html new file mode 100644 index 0000000000000000000000000000000000000000..e27bece28b72627e8846620368586fc4e6338dba --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/manageUsers.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<head> + +</head> +<body> + <br> + <p><a href="{% url 'profile' %}">Return to admin profile</a></p> + <br> + <br> + {% for p in profile %} + + <p> Username -- {{ p.user }} </p> + <p> Role -- {{ p.role }} </p> + <p><a href="{% url 'updateUsers' p.id %}"> Update </a></p> + <p><a href="{% url 'deleteUsers' p.id %}">Delete </a></p> + <h1>-------------------------------------------------</h1> + {% endfor %} + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html b/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html new file mode 100644 index 0000000000000000000000000000000000000000..260d0f3e214c882b150ee4d712e398ce0fedc969 --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> +<head> + <title>Upload ML Model</title> +</head> +<body> + +<form action="" method="post" enctype="multipart/form-data"> + {% csrf_token %} + {{form.as_p}} + <input type="submit"> +</form> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html b/ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html new file mode 100644 index 0000000000000000000000000000000000000000..417f73e07136065cc45f277b08acceda33d8d07d --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> +<head> + +</head> +<body> + + <form action="" method="POST"> + {% csrf_token %} + {{ form.as_p }} + <input type="submit"> + </form> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html b/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html new file mode 100644 index 0000000000000000000000000000000000000000..c87103c6b44e3f60bb39814b012e776baeea6661 --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>User Upload</title> +</head> +<body> + + <form action="" method="post" enctype="multipart/form-data"> + {% csrf_token %} + {{ form.as_p }} + + <!-- eventually, this will connect to ML container and fill in responsebyML to an actual response --> + <input type="submit"> + </form> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/profile.html b/ActualProjectCode/DjangoProject/templates/profile.html index 21b2bc997561834e6a17d44e8df771285fe1ae14..6c5a34e14884854bbdd06ba6627fccbe4d975844 100644 --- a/ActualProjectCode/DjangoProject/templates/profile.html +++ b/ActualProjectCode/DjangoProject/templates/profile.html @@ -13,7 +13,12 @@ {% if user.profile.role == 'ai_engineer' %} <!-- AI Dashboard --> <h2>AI Engineer Dashboard</h2> <p>Access AI-related tools and data.</p> - + <br> + <h1>Upload new ML Model</h1> + <h2><a href="{% url 'mlUpload' %}">Upload</a></h2> + <br> + <h1>Access Records</h1> + <h2><a href="">All Records</a></h2> <!-- TO DO --> @@ -21,7 +26,8 @@ {% elif user.profile.role == 'finance' %} <!-- Finance Dashboard --> <h2>Finance Dashboard</h2> <p>View financial reports and tools.</p> - + <br> + <h1><a href="{% url 'genBillings' %}">Generate Billings</a></h1> @@ -29,7 +35,11 @@ {% elif user.profile.role == 'admin' %} <!-- Admin Dashboard --> <h2>Admin Page</h2> <p>View all Activity</p> - <p>Manage Users</p> + + <!-- for each record in record db --> + <!-- display --> + <p><a href="{% url 'manageUsers' %}">Manage Users<a></a></p> + <!-- for each user in profile db: --> @@ -41,14 +51,7 @@ <br> <h2>Upload Files to ML</h2> - <form method="post"> - {% csrf_token %} - {{ form }} - <label for="uploadedFile">File </label> - <input type="file" name="uploadedFile" id="uploadedFile"> - <br> - <input type="submit">Submit - </form> + <h1><a href="{% url 'userUpload' %}"> Upload Thing </a></h1>