diff --git a/ActualProjectCode/DjangoProject/core/forms.py b/ActualProjectCode/DjangoProject/core/forms.py index 4273e28130a4df5b6317c5f7d0ffcd594aa65509..8479d6be7ab40b79a8e74f5261c835cce7cc1147 100644 --- a/ActualProjectCode/DjangoProject/core/forms.py +++ b/ActualProjectCode/DjangoProject/core/forms.py @@ -17,7 +17,7 @@ class UploadModelForm(forms.ModelForm): username = forms.CharField(max_length=100, widget=forms.HiddenInput) class Meta: model = models.mlModel - fields = ['username', 'modelName'] + fields = ['username', 'modelName', 'modelDescription'] class GenerateBillingsForm(forms.ModelForm): username = forms.CharField(max_length=100, widget=forms.HiddenInput) @@ -28,4 +28,9 @@ class GenerateBillingsForm(forms.ModelForm): class UpdateUser(forms.ModelForm): class Meta: model = models.Profile - fields = ['user', 'role'] \ No newline at end of file + fields = ['user', 'role'] + +class UpdateModel(forms.ModelForm): + class Meta: + model = models.mlModel + fields = ['modelName', 'modelDescription'] \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/core/models.py b/ActualProjectCode/DjangoProject/core/models.py index 0927f75b2983da9854ececd148f4e6d3394adda8..d35b76bca106e1a1017099be42f9da5d70347397 100644 --- a/ActualProjectCode/DjangoProject/core/models.py +++ b/ActualProjectCode/DjangoProject/core/models.py @@ -1,6 +1,7 @@ from django.contrib.auth.models import User from django.contrib import admin from django.db import models +import os class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) @@ -12,11 +13,16 @@ class Profile(models.Model): class mlModel(models.Model): modelID = models.AutoField(primary_key=True) username = models.CharField(max_length=100, default="default") - modelName = models.FileField(upload_to="./mlModels/modelName", null=True, blank=True) + modelName = models.FileField(upload_to="mlModels/", null=True, blank=True) + modelDescription = models.TextField(null=True, blank=True) def __str__(self): return f"{self.username} NEW MODEL ID: {self.modelID} Path: {self.modelName}" + def modelTitle(self): # used for CSV upload + string = str(self.modelName) + return os.path.splitext(os.path.basename(string))[0] + class Billing(models.Model): billingID = models.AutoField(primary_key=True) amount = models.FloatField() @@ -29,10 +35,10 @@ class Billing(models.Model): class Record(models.Model): recordID = models.AutoField(primary_key=True) username = models.CharField(max_length=100, default="default") - uploadedFile = models.FileField(upload_to='./records/', null=True, blank=True) + uploadedFile = models.FileField(upload_to='records/', null=True, blank=True) chosenML = models.CharField(max_length=100, default="baseML") - targetColumn = models.CharField(max_length=100, default="DEFAULT") # temporary fix for choosing CSV column. - responseByML = models.CharField(max_length=10000, default="PLACEHOLDER RESPONSE") # change to actual response by ML# + targetColumn = models.CharField(max_length=100, default="DEFAULT") + responseByML = models.FileField(upload_to='records/', null=True, blank=True) def __str__(self): return f"{self.chosenML} Response to {self.username}. ID = {self.recordID}" diff --git a/ActualProjectCode/DjangoProject/core/views.py b/ActualProjectCode/DjangoProject/core/views.py index 514d619772338d7961000abde1f6c255300d1577..d7fc82fbf71273e9a123aa0a66f0223ba045292e 100644 --- a/ActualProjectCode/DjangoProject/core/views.py +++ b/ActualProjectCode/DjangoProject/core/views.py @@ -1,4 +1,5 @@ from django.contrib.auth import authenticate, login, logout +from django.core.files import File from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from django.shortcuts import render, redirect @@ -7,7 +8,7 @@ from django.http import HttpResponse import subprocess import sys from .models import Profile, mlModel, Billing, Record -from .forms import UserLoginForm, UserUploadForm, UploadModelForm, GenerateBillingsForm, UpdateUser +from .forms import UserLoginForm, UserUploadForm, UploadModelForm, GenerateBillingsForm, UpdateUser, UpdateModel # Registration view @@ -46,11 +47,14 @@ def login_view(request): form = UserLoginForm() return render(request, 'login.html', {'form': form}) +@login_required def profile(request): return render(request, 'profile.html') +@login_required def userUpload(request): form = UserUploadForm(initial={'username': request.user.username}) # sets username in form. + models = mlModel.objects.all() if request.method == 'POST': form = UserUploadForm(request.POST or None, request.FILES or None) if form.is_valid(): @@ -68,18 +72,21 @@ def userUpload(request): capture_output=True, text=True ) - output = result.stdout - + output = result.stdout.strip() # Appending DB - response = Record.objects.get(recordID=tempID.recordID) - response.responseByML = output - response.save() + with open(output, 'rb') as f: + djangoFile = File(f) + fileName = output + + response = Record.objects.get(recordID=tempID.recordID) + response.responseByML.save(fileName, djangoFile, save=True) + return redirect('profile') - context = {'form': form} - return render(request, 'modelForms/userUpload.html', context) + return render(request, 'modelForms/userUpload.html', {'form': form, 'models': models}) +@login_required def mlUpload(request): form = UploadModelForm(initial={'username': request.user.username}) if request.method == 'POST': @@ -90,6 +97,7 @@ def mlUpload(request): context = {'form': form} return render(request, 'modelForms/mlUpload.html', context) +@login_required def genBillings(request): form = GenerateBillingsForm(initial={'username': request.user.username}) if request.method == 'POST': @@ -100,10 +108,17 @@ def genBillings(request): context = {'form': form} return render(request, 'modelForms/genBillings.html', context) +@login_required def manageUsers(request): profile = Profile.objects.all() return render(request, 'modelForms/manageUsers.html', {'profile': profile}) +@login_required +def manageModels(request): + models = mlModel.objects.all() + return render(request, 'modelForms/manageModels.html', {'models': models}) + +@login_required def updateUsers(request, id): user = Profile.objects.get(id=id) form = UpdateUser(instance=user) @@ -117,22 +132,48 @@ def updateUsers(request, id): context = {'form': form} return render(request, 'modelForms/updateUsers.html', context) +@login_required +def updateModel(request, modelID): + model = mlModel.objects.get(modelID=modelID) + form = UpdateModel(instance=model) + + if request.method == 'POST': + form=UpdateModel(request.POST, instance=model) + if form.is_valid(): + form.save() + return redirect('manageModels') + + context = {'form': form} + return render(request, 'modelForms/updateModel.html', context) + +# Views +@login_required def interactionView(request): interactions = Record.objects.all() context = {} context = {'interactions': interactions} return render(request, 'modelForms/interactionView.html', context) +@login_required def billingsView(request): billings = Billing.objects.all() context = {} context = {'billings': billings} return render(request, 'modelForms/billingsView.html', context) +@login_required +def viewUploads(request): + userUploader = request.user + uploads = Record.objects.filter(username=userUploader) + context= {} + context = {'uploads': uploads} + return render(request, 'modelForms/viewUploads.html', context) + ##### DELETION SECTIONS -def deleteRecord(request, id): - record = Record.objects.get(id=id) +@login_required +def deleteRecord(request, recordID): + record = Record.objects.get(recordID=recordID) if request.method == 'POST': record.delete() # figure out how to delete file in records directory at same time. @@ -140,6 +181,7 @@ def deleteRecord(request, id): context = {'record': record} return render(request, 'modelForms/deleteRecord.html', context) +@login_required def deleteBillings(request, billingID): record = Billing.objects.get(billingID=billingID) if request.method == 'POST': @@ -148,6 +190,7 @@ def deleteBillings(request, billingID): context = {'record': record} return render(request, 'modelForms/deleteBillings.html', context) +@login_required def deleteUsers(request, id): user = Profile.objects.get(user_id=id) user2 = User.objects.get(id=id) @@ -160,6 +203,14 @@ def deleteUsers(request, id): context = {'user': user} return render(request, 'modelForms/deleteUsers.html', context) +@login_required +def deleteModel(request, modelID): + model = mlModel.objects.get(modelID=modelID) + if request.method == 'POST': + model.delete() + return redirect('manageModels') + return render(request, 'modelForms/deleteModel.html', {'model': model}) + ##### LOGOUT LOGIN STUFF def logout_view(request): diff --git a/ActualProjectCode/DjangoProject/main.py b/ActualProjectCode/DjangoProject/main.py index 9ad534361a71c5f07f59cc518433fe4035073bda..5de96b78b47c4285e9a207575879242cd077fbd5 100644 --- a/ActualProjectCode/DjangoProject/main.py +++ b/ActualProjectCode/DjangoProject/main.py @@ -2,7 +2,7 @@ import sys import subprocess result = subprocess.run( - [sys.executable, f'./mlModels/modelName/{sys.argv[1]}.py', sys.argv[2], sys.argv[3]], + [sys.executable, f'media/mlModels/{sys.argv[1]}.py', sys.argv[2], f'media/{sys.argv[3]}'], capture_output=True, text=True ) diff --git a/ActualProjectCode/DjangoProject/mlModels/modelName/model1.py b/ActualProjectCode/DjangoProject/mlModels/modelName/model1.py deleted file mode 100644 index e9e5534baf59c2ed650c6741f6a7f9ff27d40469..0000000000000000000000000000000000000000 --- a/ActualProjectCode/DjangoProject/mlModels/modelName/model1.py +++ /dev/null @@ -1,96 +0,0 @@ -import os -import pandas as pd -import numpy as np -from gplearn.genetic import SymbolicRegressor -from sklearn.model_selection import train_test_split -from sklearn.metrics import mean_squared_error, r2_score -import matplotlib.pyplot as plt -from sklearn.preprocessing import StandardScaler -import seaborn as sns - -# Load the data -project_root = os.path.dirname(os.path.dirname(__file__)) -file_path = r"C:\Users\Charlie1\PycharmProjects\shallowsinks\ActualProjectCode\DjangoProject\records\Synthetic_Data_For_Students.csv" -data = pd.read_csv(file_path) - -# Will need to be changed to work with different csv files maybe ask user for their target column? -target_col = 'SettlementValue' -X = data.drop(target_col, axis=1) -y = data[target_col] - -# dropping non numeric and nan features -numeric_columns = X.select_dtypes(include=[np.number]).columns.tolist() -X = X[numeric_columns] -print(f"Features used: {len(numeric_columns)} numeric features") - - -data_clean = data.dropna(subset=[*numeric_columns, target_col]) -print(f"Rows after dropping missing values: {data_clean.shape[0]} out of {data.shape[0]} ({data_clean.shape[0]/data.shape[0]*100:.1f}%)") - -# Redefine X and y with clean data -X_clean = data_clean[numeric_columns] -y_clean = data_clean[target_col] - -# Split the data -X_train, X_test, y_train, y_test = train_test_split(X_clean, y_clean, test_size=0.2, random_state=42) - -# Scale the features -scaler = StandardScaler() -X_train_scaled = scaler.fit_transform(X_train) -X_test_scaled = scaler.transform(X_test) - -# Configure and training the model -print("Training the Symbolic Regressor...") -symbolic_reg = SymbolicRegressor( - population_size=5000, - generations=20, - p_crossover=0.7, - p_subtree_mutation=0.1, - p_hoist_mutation=0.05, - p_point_mutation=0.1, - max_samples=0.9, - verbose=1, - parsimony_coefficient=0.01, - random_state=42, - function_set=('add', 'sub', 'mul', 'div', 'sqrt', 'log', 'sin', 'cos') -) - -symbolic_reg.fit(X_train_scaled, y_train) - -# Make predictions -y_pred_train = symbolic_reg.predict(X_train_scaled) -y_pred_test = symbolic_reg.predict(X_test_scaled) - -# Evaluate the model -train_rmse = np.sqrt(mean_squared_error(y_train, y_pred_train)) -test_rmse = np.sqrt(mean_squared_error(y_test, y_pred_test)) -train_r2 = r2_score(y_train, y_pred_train) -test_r2 = r2_score(y_test, y_pred_test) - -print(f"Train RMSE: {train_rmse:.2f}") -print(f"Test RMSE: {test_rmse:.2f}") -print(f"Train R² Score: {train_r2:.4f}") -print(f"Test R² Score: {test_r2:.4f}") - -# Display the learned expression -print("\nBest symbolic expression:") -print(symbolic_reg._program) - -# Plot actual vs predicted values -plt.figure(figsize=(10, 6)) -plt.scatter(y_test, y_pred_test, alpha=0.5) -plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--') -plt.xlabel('Actual SettlementValue') -plt.ylabel('Predicted SettlementValue') -plt.title('Actual vs Predicted Values') -plt.savefig('symbolic_regression_results.png') -plt.show() - -# Save the model expression to a file -with open('symbolic_regression_formula.txt', 'w') as f: - f.write(str(symbolic_reg._program)) - f.write('\n\nModel Performance:\n') - f.write(f"Train RMSE: {train_rmse:.2f}\n") - f.write(f"Test RMSE: {test_rmse:.2f}\n") - f.write(f"Train R² Score: {train_r2:.4f}\n") - f.write(f"Test R² Score: {test_r2:.4f}\n") \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/server/settings.py b/ActualProjectCode/DjangoProject/server/settings.py index 52b3245d2022234a23042fce9e86848bb24061bc..ce798c1c5365b96731498ceb99378ced9158f84c 100644 --- a/ActualProjectCode/DjangoProject/server/settings.py +++ b/ActualProjectCode/DjangoProject/server/settings.py @@ -28,6 +28,7 @@ DEBUG = True ALLOWED_HOSTS = [] +MEDIA_URL = '/' # Application definition @@ -129,3 +130,6 @@ STATICFILES_DIRS = [ # https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') diff --git a/ActualProjectCode/DjangoProject/server/urls.py b/ActualProjectCode/DjangoProject/server/urls.py index 71cffa888de5afa4c99909f8e6cf693535c8ba58..c96d2cb256c9ac88c76913312ec2082a02a19916 100644 --- a/ActualProjectCode/DjangoProject/server/urls.py +++ b/ActualProjectCode/DjangoProject/server/urls.py @@ -17,7 +17,8 @@ Including another URLconf from django.contrib.auth.views import LogoutView # from django.contrib import admin from django.urls import path - +from django.conf.urls.static import static +from django.conf import settings from django.contrib import admin from django.urls import path from django.urls import include @@ -41,8 +42,12 @@ urlpatterns = [ 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"), - path('modelForms/deleteRecord/<str:id>/', views.deleteRecord, name="deleteRecord"), + path('modelForms/updateModel/<str:modelID>/', views.updateModel, name="updateModel"), + path('modelForms/deleteModel/<str:modelID>/', views.deleteModel, name="deleteModel"), + path('modelForms/deleteRecord/<str:recordID>/', views.deleteRecord, name="deleteRecord"), path('modelForms/interactionView/', views.interactionView, name="interactionView"), path('modelForms/billingsView/', views.billingsView, name="billingsView"), path('modelForms/deleteBillings/<str:billingID>', views.deleteBillings, name="deleteBillings"), -] \ No newline at end of file + path('modelForms/viewUploads/', views.viewUploads, name="viewUploads"), + path('modelForms/manageModels/', views.manageModels, name="manageModels"), +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/deleteModel.html b/ActualProjectCode/DjangoProject/templates/modelForms/deleteModel.html new file mode 100644 index 0000000000000000000000000000000000000000..a00e87a46bed21fc3ac6cb975433a259b623c166 --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/deleteModel.html @@ -0,0 +1,72 @@ +<html> +<head> + <style> + body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + color: #333; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + } + + .container { + background: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); + text-align: center; + width: 350px; + } + + p { + font-size: 16px; + margin-bottom: 20px; + } + + a { + text-decoration: none; + color: #333; + font-weight: bold; + margin-right: 15px; + padding: 8px 12px; + border-radius: 5px; + border: 1px solid #333; + display: inline-block; + } + + a:hover { + background: #333; + color: white; + } + + input[type="submit"] { + background: #c0392b; + color: white; + border: none; + padding: 10px 20px; + font-size: 16px; + cursor: pointer; + border-radius: 5px; + } + + input[type="submit"]:hover { + background: #a93226; + } + </style> +</head> +<body> + + <div class="container"> + <p>Are you sure you want to delete this model named "<strong>{{ model.modelTitle }}</strong>"</p> + <form action="{% url 'deleteModel' model.modelID %}" method="POST"> + {% csrf_token %} + <a href="{% url 'manageModels' %}">Cancel</a> + <input type="submit" name="confirm" value="Delete"> + </form> + </div> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/deleteRecord.html b/ActualProjectCode/DjangoProject/templates/modelForms/deleteRecord.html index 803a8b9131096d2e6393836c2762a6c0d67e304d..10b6685fb14baec6771f9fa8089dd731d4e97dc3 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/deleteRecord.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/deleteRecord.html @@ -58,7 +58,7 @@ <div class="container"> <p>Are you sure you want to delete this record?</p> - <form action="{% url 'deleteRecord' record.id %}" method="POST"> + <form action="{% url 'deleteRecord' record.recordID %}" method="POST"> {% csrf_token %} <a href="{% url 'interactionView' %}">Go Back</a> <input type="submit" name="confirm" value="Delete"> diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/interactionView.html b/ActualProjectCode/DjangoProject/templates/modelForms/interactionView.html index ec750cdd7e06ac667ed261b61ca1cb2659371b47..f1fe7747eb15f0ac9c187b053ba933fddf06d926 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/interactionView.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/interactionView.html @@ -78,12 +78,12 @@ {% for record in interactions %} <div class="record"> - <p><strong>Record ID:</strong> {{ record.id }}</p> + <p><strong>Record ID:</strong> {{ record.recordID }}</p> <p><strong>Name:</strong> {{ record.username }}</p> - <p><strong>File Path:</strong> {{ record.uploadedFile }}</p> + <p><strong>File Uploaded:</strong> <a href="{{ record.uploadedFile.url }}" download> Download </a> </p> <p><strong>ML Model Selected:</strong> {{ record.chosenML }}</p> - <p><strong>Response:</strong> {{ record.responseByML }}</p> - <a href="{% url 'deleteRecord' record.id %}" class="delete-btn">Delete Record</a> + <p><strong>Uploaded Response:</strong> <a href="{{ record.responseByML.url }}" download> Download </a></p> + <a href="{% url 'deleteRecord' record.recordID %}" class="delete-btn">Delete Record</a> </div> <hr> {% endfor %} diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/manageModels.html b/ActualProjectCode/DjangoProject/templates/modelForms/manageModels.html new file mode 100644 index 0000000000000000000000000000000000000000..7ce256763bbce782c010b495102776bad8e4ef36 --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/manageModels.html @@ -0,0 +1,109 @@ +<html> +<head> + <title>Manage Models</title> + <style> + body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + color: #333; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + min-height: 100vh; + margin: 0; + } + + .container { + background: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); + width: 60%; + max-width: 600px; + text-align: center; + } + + a { + text-decoration: none; + color: #333; + font-weight: bold; + } + + a:hover { + color: #555; + } + + .user-card { + background: #fff; + padding: 15px; + margin: 15px 0; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + text-align: left; + } + + .user-card p { + margin: 5px 0; + } + + .action-buttons { + margin-top: 10px; + } + + .update-btn, .delete-btn { + display: inline-block; + margin: 5px; + padding: 8px 12px; + border-radius: 5px; + text-decoration: none; + font-weight: bold; + } + + .update-btn { + background: #4CAF50; + color: white; + } + + .update-btn:hover { + background: #388E3C; + } + + .delete-btn { + background: #ff4d4d; + color: white; + } + + .delete-btn:hover { + background: #cc0000; + } + + hr { + border: 0; + height: 1px; + background: #ccc; + margin: 15px 0; + } + </style> +</head> +<body> + + <div class="container"> + <p><a href="{% url 'profile' %}">Return To Profile</a></p> + + {% for model in models %} + <div class="user-card"> + <p><strong>Modelname:</strong> {{ model.modelTitle }}</p> + <p><strong>Description:</strong> {{ model.modelDescription }}</p> + <div class="action-buttons"> + <a href="{% url 'updateModel' model.modelID %}" class="update-btn">Update</a> + <a href="{% url 'deleteModel' model.modelID %}" class="delete-btn">Delete</a> + </div> + </div> + {% endfor %} + + + </div> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html b/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html index 0cc7356c03d858e9c6b71d25b167a65148838122..cd5806b2b1cdb0fec6318a1b0eda05e5f31f5ba9 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/mlUpload.html @@ -57,12 +57,8 @@ </head> <body> -<!-- - Drop down section which connect to mlModels folder - --> - <div class="container"> - <h2>Upload Machine Learning Model</h2> + <h2>Upload a new ML model</h2> <form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/updateModel.html b/ActualProjectCode/DjangoProject/templates/modelForms/updateModel.html new file mode 100644 index 0000000000000000000000000000000000000000..e6be531b9f4781ae6451af0b61f666be0e8acf7c --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/updateModel.html @@ -0,0 +1,89 @@ +<html> +<head> + <style> + body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + color: #333; + margin: 0; + padding: 0; + } + + .container { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + padding: 20px; + } + + form { + background-color: white; + padding: 30px; + border-radius: 8px; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 400px; + text-align: center; + } + + h2 { + margin-bottom: 20px; + font-size: 24px; + color: #333; + } + + input[type="submit"] { + background-color: #333; + color: white; + border: none; + padding: 10px 20px; + font-size: 16px; + border-radius: 5px; + cursor: pointer; + margin-top: 20px; + width: 100%; + } + + input[type="submit"]:hover { + background-color: #555; + } + + .form-group { + margin-bottom: 15px; + } + + label { + display: block; + text-align: left; + font-weight: bold; + margin-bottom: 5px; + } + + input[type="text"], input[type="email"], input[type="password"], select { + width: 100%; + padding: 10px; + margin-top: 5px; + border: 1px solid #ddd; + border-radius: 5px; + font-size: 16px; + } + + input[type="text"]:focus, input[type="email"]:focus, input[type="password"]:focus, select:focus { + border-color: #333; + } + </style> +</head> +<body> + + <div class="container"> + <form action="" method="POST"> + <h2>Updating Model <strong>{{ model.modelTitle }}</strong></h2> + {% csrf_token %} + {{ form.as_p }} + <input type="submit" value="Submit"> + </form> + </div> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html b/ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html index 482c0971e3711a94e2e1d1eff78f12a2d4acf56e..c15d3678f591db18cd2780d409eb387a88e726e2 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/updateUsers.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <html> <head> - <title>Form Page</title> + <title>Update Users</title> <style> body { font-family: Arial, sans-serif; diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html b/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html index 942b14fb52e2e09f08f6b0d6ebc58452b0c3ff9e..1e41304e7b090a4e4ded18f49892980ab92a742b 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/userUpload.html @@ -77,12 +77,19 @@ </style> </head> <body> - <div class="container"> <form action="" method="POST" enctype="multipart/form-data"> - <h2>Upload Your ML Model</h2> + {% for model in models %} + <h2> {{ model.modelTitle }}</h2> + <p> Uploaded by: {{ model.username }} </p> + <p> {{ model.modelDescription }}</p> + <hr> + {% endfor %} + <h1>Upload your CSV</h1> + {% csrf_token %} {{ form.as_p }} + <input type="submit" value="Submit"> </form> </div> diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/viewUploads.html b/ActualProjectCode/DjangoProject/templates/modelForms/viewUploads.html new file mode 100644 index 0000000000000000000000000000000000000000..eb0ccbfd2703c1a0a01e5372c8edb8b7866c5dbc --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/viewUploads.html @@ -0,0 +1,89 @@ +<html> +<head> + <title>View your uploads.</title> + <style> + body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + color: #333; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + min-height: 100vh; + margin: 0; + } + + .container { + background: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); + width: 60%; + max-width: 600px; + text-align: center; + } + + a { + text-decoration: none; + color: #333; + font-weight: bold; + } + + a:hover { + color: #555; + } + + .record { + background: #fff; + padding: 15px; + margin: 15px 0; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + text-align: left; + } + + .record p { + margin: 5px 0; + } + + .delete-btn { + display: inline-block; + margin-top: 10px; + padding: 8px 12px; + background: #ff4d4d; + color: white; + border-radius: 5px; + text-decoration: none; + font-weight: bold; + } + + .delete-btn:hover { + background: #cc0000; + } + + hr { + border: 0; + height: 1px; + background: #ccc; + margin: 15px 0; + } + </style> + +</head> +<body> + + <div class="container"> + <p><a href="{% url 'profile' %}">Return to Profile</a></p> + {% for i in uploads %} + <div class="record"> + <p><strong>Record ID: </strong> {{ i.recordID }} </p> + <p><strong>Chosen ML Model: </strong> {{ i.chosenML }} </p> + <p><strong>Column Targeted: </strong> {{ i.targetColumn }} </p> + <p><strong>File Uploaded: </strong> <a href="{{ i.uploadedFile.url }}" download> Download Here</a> </p> + <p><strong>Response: </strong> <a href="{{ i.responseByML.url }}" download> Download Here </a> </p> + </div> + {% endfor %} + </div> +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/profile.html b/ActualProjectCode/DjangoProject/templates/profile.html index 4c2a182fd53269c23b14ba893977239079ca88d4..3c6be37b48c4877b7871381f949adbe08024defc 100644 --- a/ActualProjectCode/DjangoProject/templates/profile.html +++ b/ActualProjectCode/DjangoProject/templates/profile.html @@ -164,8 +164,14 @@ <h1>Upload new ML Model</h1> <h2><a href="{% url 'mlUpload' %}">Upload</a></h2> <hr> + <h2>View your uploads</h2> + <h1><a href="{% url 'viewUploads' %}">Here</a></h1> + <hr> <h1>Access ML Interactions</h1> <h2><a href="{% url 'interactionView' %}">All Interactions</a></h2> + <hr> + <h1>Manage Models</h1> + <h2><a href="{% url 'manageModels' %}">Manage</a></h2> {% elif user.profile.role == 'finance' %} <!-- Finance Dashboard --> @@ -195,6 +201,9 @@ <hr> <h2>Upload Files to ML</h2> <h1><a href="{% url 'userUpload' %}">Upload CSV</a></h1> + <hr> + <h2>View your uploads</h2> + <h1><a href="{% url 'viewUploads' %}">Here</a></h1> {% endif %}