diff --git a/ActualProjectCode/DjangoProject/Dockerfile b/ActualProjectCode/DjangoProject/Dockerfile index 2e49ee6935ed03f18264413f286cdbcd99b05104..932f82ff6a7ed62e9cfa721fc2ae37afa3526179 100644 --- a/ActualProjectCode/DjangoProject/Dockerfile +++ b/ActualProjectCode/DjangoProject/Dockerfile @@ -9,7 +9,10 @@ COPY requirements.txt . RUN apk add --update --upgrade --no-cache postgresql-client && \ apk add --update --upgrade --no-cache --virtual .tmp \ - build-base postgresql-dev + build-base postgresql-dev && \ + apk add --update --upgrade --no-cache libgomp && \ + apk add --update --upgrade --no-cache libstdc++ + RUN pip install --no-cache-dir -r requirements.txt && apk del .tmp diff --git a/ActualProjectCode/DjangoProject/core/forms.py b/ActualProjectCode/DjangoProject/core/forms.py index 156c5b3a9b0990119fed34c3b1f091a1196c9d89..4273e28130a4df5b6317c5f7d0ffcd594aa65509 100644 --- a/ActualProjectCode/DjangoProject/core/forms.py +++ b/ActualProjectCode/DjangoProject/core/forms.py @@ -11,13 +11,13 @@ class UserUploadForm(forms.ModelForm): username = forms.CharField(max_length=100, widget=forms.HiddenInput) class Meta: model = models.Record - fields = ['username','uploadedFile','chosenML'] + fields = ['username','uploadedFile', 'targetColumn', 'chosenML'] class UploadModelForm(forms.ModelForm): username = forms.CharField(max_length=100, widget=forms.HiddenInput) class Meta: model = models.mlModel - fields = ['username','modelName'] + fields = ['username', 'modelName'] class GenerateBillingsForm(forms.ModelForm): username = forms.CharField(max_length=100, widget=forms.HiddenInput) diff --git a/ActualProjectCode/DjangoProject/core/models.py b/ActualProjectCode/DjangoProject/core/models.py index 1a2acf41aa068456b5097eb70fdbba3ebb8ed549..0927f75b2983da9854ececd148f4e6d3394adda8 100644 --- a/ActualProjectCode/DjangoProject/core/models.py +++ b/ActualProjectCode/DjangoProject/core/models.py @@ -1,4 +1,5 @@ from django.contrib.auth.models import User +from django.contrib import admin from django.db import models class Profile(models.Model): @@ -26,10 +27,12 @@ class Billing(models.Model): return f"{self.companyName} Billing - ID: {self.billingID}" 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) chosenML = models.CharField(max_length=100, default="baseML") - responseByML = models.CharField(max_length=100, default="PLACEHOLDER RESPONSE") # change to actual response by ML + 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# def __str__(self): - return f"{self.chosenML} Response to {self.username}" \ No newline at end of file + 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 7ac33eb5bf464ceaeac27231f6b90ab7f5370fa5..514d619772338d7961000abde1f6c255300d1577 100644 --- a/ActualProjectCode/DjangoProject/core/views.py +++ b/ActualProjectCode/DjangoProject/core/views.py @@ -4,7 +4,8 @@ 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 -import os +import subprocess +import sys from .models import Profile, mlModel, Billing, Record from .forms import UserLoginForm, UserUploadForm, UploadModelForm, GenerateBillingsForm, UpdateUser @@ -54,6 +55,27 @@ def userUpload(request): form = UserUploadForm(request.POST or None, request.FILES or None) if form.is_valid(): form.save() + + # CONNECTING WITH ML MODELS. + uName = form.cleaned_data['username'] + chosenML = form.cleaned_data['chosenML'] + tColumn = form.cleaned_data['targetColumn'] + tempID = Record.objects.latest('recordID') + filePath = tempID.uploadedFile # janky way of doing it, but it works??? fix in the future. + + result = subprocess.run( + [sys.executable, 'main.py', f'{chosenML}', f'{tColumn}', f'{filePath}'], + capture_output=True, + text=True + ) + output = result.stdout + + # Appending DB + + response = Record.objects.get(recordID=tempID.recordID) + response.responseByML = output + response.save() + return redirect('profile') context = {'form': form} return render(request, 'modelForms/userUpload.html', context) diff --git a/ActualProjectCode/DjangoProject/main.py b/ActualProjectCode/DjangoProject/main.py index e1d3ad6e2cb1eaa48cd75b2bf81ea713bd8bbc41..9ad534361a71c5f07f59cc518433fe4035073bda 100644 --- a/ActualProjectCode/DjangoProject/main.py +++ b/ActualProjectCode/DjangoProject/main.py @@ -1,13 +1,15 @@ -# 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. - -# - -print("Hello!") - -# 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 +import sys +import subprocess + +result = subprocess.run( + [sys.executable, f'./mlModels/modelName/{sys.argv[1]}.py', sys.argv[2], sys.argv[3]], + capture_output=True, + text=True +) + +# Error Handling +if result.returncode != 0: + print("Script Failed") + print(result.stderr) +else: + print(result.stdout) \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/requirements.txt b/ActualProjectCode/DjangoProject/requirements.txt index 734c063ee9348a185bb8e0a7cdd7cba2ab6546c7..49c06b391ca58d0d3525cc8bb877f1ce64d6d681 100644 Binary files a/ActualProjectCode/DjangoProject/requirements.txt and b/ActualProjectCode/DjangoProject/requirements.txt differ diff --git a/ActualProjectCode/DjangoProject/server/urls.py b/ActualProjectCode/DjangoProject/server/urls.py index f79a9058818a40bdfdd9ab3ae2af2cc73bb23d09..71cffa888de5afa4c99909f8e6cf693535c8ba58 100644 --- a/ActualProjectCode/DjangoProject/server/urls.py +++ b/ActualProjectCode/DjangoProject/server/urls.py @@ -45,5 +45,4 @@ urlpatterns = [ 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 diff --git a/ActualProjectCode/DjangoProject/templates/profile.html b/ActualProjectCode/DjangoProject/templates/profile.html index f30bd27e42884d436ad801e8b630a754dcb476db..4c2a182fd53269c23b14ba893977239079ca88d4 100644 --- a/ActualProjectCode/DjangoProject/templates/profile.html +++ b/ActualProjectCode/DjangoProject/templates/profile.html @@ -194,7 +194,7 @@ <p>Manage your tasks and profile.</p> <hr> <h2>Upload Files to ML</h2> - <h1><a href="{% url 'userUpload' %}">Upload Thing</a></h1> + <h1><a href="{% url 'userUpload' %}">Upload CSV</a></h1> {% endif %}