From 4d7314f964f14e5bf7e5ff12b753a22ce182369c Mon Sep 17 00:00:00 2001
From: Aaron <Aaron8.jones@live.uwe.ac.uk>
Date: Thu, 27 Mar 2025 15:56:17 +0000
Subject: [PATCH] admin screen "finished" mostly, can update user roles and
 delete with an error, idk how to fix ill fix it later.

---
 ActualProjectCode/DjangoProject/core/forms.py | 24 +++++-
 .../core/migrations/0001_initial.py           | 23 ------
 .../DjangoProject/core/models.py              | 11 +--
 ActualProjectCode/DjangoProject/core/views.py | 74 +++++++++++++++----
 .../DjangoProject/mlModels/main.py            | 12 +++
 .../DjangoProject/server/urls.py              | 12 ++-
 .../templates/dashboards/admin_dashboard.html | 11 ---
 .../templates/dashboards/ai_dashboard.html    | 11 ---
 .../dashboards/finance_dashboard.html         | 11 ---
 .../templates/dashboards/user_dashboard.html  | 27 -------
 .../templates/modelForms/deleteUsers.html     | 19 +++++
 .../templates/modelForms/genBillings.html     | 17 +++++
 .../templates/modelForms/manageUsers.html     | 21 ++++++
 .../templates/modelForms/mlUpload.html        | 15 ++++
 .../templates/modelForms/updateUsers.html     | 15 ++++
 .../templates/modelForms/userUpload.html      | 17 +++++
 .../DjangoProject/templates/profile.html      | 25 ++++---
 17 files changed, 224 insertions(+), 121 deletions(-)
 delete mode 100644 ActualProjectCode/DjangoProject/core/migrations/0001_initial.py
 create mode 100644 ActualProjectCode/DjangoProject/mlModels/main.py
 delete mode 100644 ActualProjectCode/DjangoProject/templates/dashboards/admin_dashboard.html
 delete mode 100644 ActualProjectCode/DjangoProject/templates/dashboards/ai_dashboard.html
 delete mode 100644 ActualProjectCode/DjangoProject/templates/dashboards/finance_dashboard.html
 delete mode 100644 ActualProjectCode/DjangoProject/templates/dashboards/user_dashboard.html
 create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/deleteUsers.html
 create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/genBillings.html
 create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/manageUsers.html
 create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html
 create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html
 create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html

diff --git a/ActualProjectCode/DjangoProject/core/forms.py b/ActualProjectCode/DjangoProject/core/forms.py
index 4dc71124..603a1e44 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 5732ba1f..00000000
--- 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 ebf45c53..9885224e 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 8ef49d71..1b43c5a0 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 00000000..ce14de2c
--- /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 c3b59eba..30973c44 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 a1ef3a95..00000000
--- 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 a1ef3a95..00000000
--- 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 a1ef3a95..00000000
--- 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 894505fd..00000000
--- 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 00000000..012beb10
--- /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 00000000..c121bf6d
--- /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 00000000..e27bece2
--- /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 00000000..260d0f3e
--- /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 00000000..417f73e0
--- /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 00000000..c87103c6
--- /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 21b2bc99..6c5a34e1 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>
 
 
 
-- 
GitLab