diff --git a/.gitignore b/.gitignore
index a70aeeb..9972c6c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,6 +60,10 @@ coverage.xml
local_settings.py
db.sqlite3
db.sqlite3-journal
+migrations/
+*/migrations/
+**/**/migrations
+**/migrations
# Flask stuff:
instance/
diff --git a/BackgroundService/bgservice.py b/BackgroundService/bgservice.py
deleted file mode 100644
index ed26c76..0000000
--- a/BackgroundService/bgservice.py
+++ /dev/null
@@ -1,58 +0,0 @@
-import os
-import sys
-import signal
-import time
-import event_processor
-
-
-class SkoolOSDaemon:
- """Constructor"""
- def __init__(self, work_dir='/tmp'):
- self.work_dir = work_dir
- self.start_time = None
- self.end_time = None
- self.log_file = None
- def __write_pid_file(self):
- try:
- dirName = "/tmp/skooloslogs"
- # Create log Directory
- os.mkdir(dirName)
- except FileExistsError:
- pass
- pid = str(os.getpid())
- file_ = open('/tmp/skoolosdaemonpid', 'w')
- file_.write(pid)
- file_.close()
- def readable_time(self, input_time):
- return time.strftime("%A, %B %d, %Y %H:%M:%S", time.localtime(input_time))
- def start(self):
- self.__write_pid_file()
- self.start_time = time.time()
- self.log_file = open('/tmp/skooloslogs/' + str(self.start_time), 'w')
- self.log_file.write("Start time: \n" + self.readable_time(self.start_time) + "\n\n")
- sys.stdout = self.log_file
- event_processor.watch_dir(self.work_dir)
- def stop(self):
- event_processor.stop_watching()
- self.end_time = time.time()
- self.log_file.write("Stop time: \n" + self.readable_time(self.end_time))
- self.log_file.write("Total work time: " +
- time.strftime("%H:%M:%S", time.gmtime(self.end_time - self.start_time)))
-
-
-
-
-logger = None
-
-def Main():
- def signal_handler(signum, frame):
- logger.stop()
- signal.signal(signal.SIGINT, signal_handler)
- # signal.signal(signal.SIGTERM, signal_handler)
- global logger
- logger = SkoolOSDaemon("/tmp")
- logger.start()
-
-
-if __name__ == "__main__":
- Main()
diff --git a/BackgroundService/event_processor.py b/BackgroundService/event_processor.py
deleted file mode 100644
index 55c5e15..0000000
--- a/BackgroundService/event_processor.py
+++ /dev/null
@@ -1,65 +0,0 @@
-import time
-import pyinotify
-
-
-def readable_time(input_time):
- return time.strftime("%A, %B %d, %Y %H:%M:%S", time.localtime(input_time))
-
-
-class EventProcessor(pyinotify.ProcessEvent):
- _methods = ["IN_OPEN",
- "IN_CREATE",
- "IN_CLOSE_WRITE",
- "IN_DELETE",
- "IN_MOVED_TO",
- "IN_MOVED_FROM",
- ]
-
-
-def __method_format(method):
- return {
- "IN_OPEN":"Opened a file",
- "IN_CREATE":"Created a file",
- "IN_CLOSE_WRITE":"Wrote to a file",
- "IN_DELETE":"Deleted a file",
- "IN_MOVED_TO":"Moved a file or directory in from elsewhere",
- "IN_MOVED_FROM":"Moved a file or directory elsewhere",
- }.get(method, "Unknown event")
-
-
-def __process_generator(cls, method):
- def _method_name(self, event):
- description = "Event description: {}\n" \
- "Path name: {}\n" \
- "Event Name: {}\n" \
- "Timestamp: {}\n".format(__method_format(method),
- event.pathname,
- event.maskname,
- readable_time(time.time())
- )
- if "IN_DELETE" in description:
- description += "WARNING: Unexpected file deletion\n"
- if "IN_MOVED_TO" in description:
- description += "WARNING: Unexpected file add to work\n"
- if "IN_MOVED_FROM" in description:
- description += "WARNING: Unexpected file moved out of directory\n"
- print(description)
- _method_name.__name__ = "process_{}".format(method)
- setattr(cls, _method_name.__name__, _method_name)
-
-
-EVENT_NOTIFIER = None
-
-
-def watch_dir(dir_to_watch):
- global EVENT_NOTIFIER
- for method in EventProcessor._methods:
- __process_generator(EventProcessor, method)
- watch_manager = pyinotify.WatchManager()
- EVENT_NOTIFIER = pyinotify.ThreadedNotifier(watch_manager, EventProcessor())
- watch_manager.add_watch(dir_to_watch, pyinotify.ALL_EVENTS, rec=True)
- EVENT_NOTIFIER.loop()
-
-
-def stop_watching():
- EVENT_NOTIFIER.stop()
diff --git a/BackgroundService/test.py b/BackgroundService/test.py
deleted file mode 100644
index b797228..0000000
--- a/BackgroundService/test.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from bgservice import SkoolOSDaemon as sod
-import threading
-
-logger = sod()
-
-
-if __name__ == "__main__":
- line=1
- print(line)
- line+=1
- logger.start()
- print(line)
- line+=1
- input("Enter any key when you are done modifyng the /tmp/ directory")
- print(line)
- line+=1
- logger.stop()
- print(line)
- line+=1
diff --git a/CLI/oauth/index.html b/CLI/oauth/index.html
deleted file mode 100644
index 9ffd6ef..0000000
--- a/CLI/oauth/index.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- Sign into Ion
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/CLI/student.py b/CLI/student.py
index 711c99e..5d6ad51 100644
--- a/CLI/student.py
+++ b/CLI/student.py
@@ -43,6 +43,11 @@ def putDB(data, url):
print("PUT:" + str(r.status_code))
return(r.json())
+def patchDB(data, url):
+ r = requests.patch(url = url, data=data, auth=('raffukhondaker','hackgroup1'))
+ print("PATH:" + str(r.status_code))
+ return(r.json())
+
def delDB(url):
r = requests.delete(url = url, auth=('raffukhondaker','hackgroup1'))
print("DELETE:" + str(r.status_code))
@@ -66,15 +71,12 @@ class Student:
def __init__(self, data):
# teacher info already stored in API
# intitialze fields after GET request
- self.first_name=data['first_name']
- self.last_name=data['last_name']
self.git=data['git']
self.username=data['ion_user']
self.url= "http://127.0.0.1:8000/api/students/" + self.username + "/"
- self.email = data['email']
self.grade = data['grade']
- self.student_id=data['student_id']
self.completed = data['completed']
+ self.user = data['user']
#classes in id form (Example: 4,5)
#storing actual classes
cid=data['classes'].split(",")
@@ -132,20 +134,9 @@ class Student:
os.chdir(cdir)
self.repo = 'https://github.com/' + self.git + '/' + self.username + '.git'
data={
- 'first_name':self.first_name,
- 'last_name':self.last_name,
- 'git':self.git,
- 'ion_user':self.username,
- 'student_id':self.student_id,
- 'added_to':self.snew,
- 'url':self.url,
- 'classes':self.sclass,
- 'email':self.email,
- 'grade':self.grade,
- 'completed':self.completed,
'repo':self.repo
}
- print(putDB(data, self.url))
+ print(patchDB(data, self.url))
print("Synced to " + self.username)
def getClasses(self):
@@ -169,7 +160,7 @@ class Student:
zero = datetime.timedelta(0,0)
#check due ddate is in span range is now past date (- timdelta)
if(diff < span and diff > zero):
- print((now-due))
+ print(a + " due in:" + str(now-due))
except Exception as e:
print(e)
@@ -284,20 +275,11 @@ class Student:
#update teacher instance in db, classes field
data={
- 'first_name':self.first_name,
- 'last_name':self.last_name,
- 'git':self.git,
- 'ion_user':self.username,
- 'student_id':self.student_id,
+ 'user':self.user,
'added_to':self.snew,
- 'url':self.url,
- 'classes':self.sclass,
- 'email':self.email,
- 'grade':self.grade,
- 'completed':self.completed
}
print(self.url)
- print(putDB(data, self.url))
+ print(patchDB(data, self.url))
return data
def submit(self, path):
@@ -327,15 +309,13 @@ class Student:
command("git push -u origin " + self.username + " --tags")
self.completed = self.completed + "," + parts[1] + "/" + parts[2]
data={
- 'first_name':self.first_name,
- 'last_name':self.last_name,
+ 'user':self.user,
'git':self.git,
'ion_user':self.username,
'student_id':self.student_id,
'added_to':self.snew,
'url':self.url,
'classes':self.sclass,
- 'email':self.email,
'grade':self.grade,
'completed':self.completed
}
diff --git a/CLI/teacher.py b/CLI/teacher.py
index d34ae79..8062406 100644
--- a/CLI/teacher.py
+++ b/CLI/teacher.py
@@ -9,7 +9,18 @@ import time
import pyperclip
from distutils.dir_util import copy_tree
from datetime import datetime
+# from django.conf import settings
+# import django
+# from Website.config.settings import DATABASES, INSTALLED_APPS
+# INSTALLED_APPS.remove('users.apps.UsersConfig')
+# INSTALLED_APPS.remove('api')
+# INSTALLED_APPS.remove('skoolos.apps.SkoolosConfig')
+# INSTALLED_APPS.append('Website.api')
+# settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS)
+# django.setup()
+
+# from ..Website.api.models import *
#git clone student directory ==> /classes/assignments
#get teacher info from api
@@ -33,6 +44,10 @@ def getDB(url):
r = requests.get(url = url, auth=('raffukhondaker','hackgroup1'))
print("GET:" + str(r.status_code))
return(r.json())
+def patchDB(data, url):
+ r = requests.patch(url = url, data=data, auth=('raffukhondaker','hackgroup1'))
+ print("PATCH:" + str(r.status_code))
+ return(r.json())
def postDB(data, url):
r = requests.post(url = url, data=data, auth=('raffukhondaker','hackgroup1'))
@@ -66,30 +81,14 @@ class Teacher:
def __init__(self, data):
# teacher info already stored in API
# intitialze fields after GET request
- self.first_name=data['first_name']
- self.last_name=data['last_name']
self.git=data['git']
self.username=data['ion_user']
self.url= "http://127.0.0.1:8000/api/teachers/" + self.username + "/"
- self.email = data['email']
+ self.id = data['user']
#classes in id form (Example: 4,5)
- cid=data['classes'].split(",")
- try:
- cid.remove('')
- except:
- pass
- try:
- cid.remove("")
- except:
- pass
- classes=[]
- for c in cid:
- url = "http://127.0.0.1:8000/api/classes/" + str(c) + "/"
- classes.append(getDB(url))
-
- self.classes = classes
- self.sclass=str(data['classes'])
+ #array
+ self.classes=data['classes']
if(os.path.isdir(self.username + "/Students")):
print("Synced to " + self.username)
else:
@@ -151,44 +150,31 @@ class Teacher:
#make class from existing directory, add to git and api
def addClass(self, path):
+ cname = path.split("/")
+ cname = cname[len(cname)-1]
+ for c in self.classes:
+ if c == cname:
+ print(cname + " already exists.")
+ return
if (self.checkClass(path)):
- cname = path.split("/")
- cname = cname[len(cname)-1]
cpath = self.username + "/" + cname
data = {
"name": cname,
"repo": "",
"path": cpath,
"teacher": self.username,
- "assignments": "",
- "default_file": "",
- "confirmed": "",
- "unconfirmed": ""
+ "owner":self.id
}
#make class instance in db
- data = postDB(data, 'http://127.0.0.1:8000/api/classes/')
+ postDB(data, 'http://127.0.0.1:8000/api/classes/')
+ self.classes.append(cname)
#add to instance
#upate self.classes
- self.classes.append(data)
- if(len(self.sclass)==0):
- self.sclass = data['name']
- else:
- self.sclass = self.sclass + "," + str(data['name'])
-
- #update teacher instance in db, classes field
- teacher={
- 'first_name':self.first_name,
- 'last_name':self.last_name,
- 'git':self.git,
- 'ion_user':self.username,
- 'url':self.url,
- 'classes':self.sclass,
- 'email':self.email
+ data = {
+ 'classes':self.classes
}
- putDB(teacher, self.url)
-
- return teacher
-
+ print(self.username)
+ print(patchDB(data, 'http://127.0.0.1:8000/api/teachers/' + self.username + "/"))
#make a new class from scratch
#subject: string, assignments: list
@@ -224,8 +210,7 @@ class Teacher:
# f.close()
# os.chdir(cdir)
- data = self.addClass(path)
- return data
+ self.addClass(path)
def deleteClass(self, path):
if(os.path.exists(path) == False):
@@ -240,25 +225,12 @@ class Teacher:
print("DELETE: " + self.classes[i]['name'])
for i in range(len(self.classes)):
c = self.classes[i]
- if(c['name'] == cname):
+ if(c == cname):
del self.classes[i]
- s=""
- #recreate sclass field, using ids
- for c in self.classes:
- s = s + str(c['name']) + ","
- print(s)
- s = s[:-1]
- print(s)
- data={
- 'first_name':self.first_name,
- 'last_name':self.last_name,
- 'git':self.git,
- 'ion_user':self.username,
- 'url':self.url,
- 'classes':s,
- 'email':self.email
- }
- print(putDB(data, self.url))
+ # data={
+ # 'classes':self.classes,
+ # }
+ # print(patchDB(data, self.url))
delDB("http://127.0.0.1:8000/api/classes/" + cname + "/")
break
@@ -282,53 +254,37 @@ class Teacher:
print(sname + " does not exist.")
return False
course = getDB("http://127.0.0.1:8000/api/classes/" + cname)
- if(sname in course['unconfirmed']):
- print (sname + " already requested.")
- return True
- if(sname in course['confirmed']):
- print (sname + " alredy enrolled.")
- return False
+ # if(sname in str(course['unconfirmed'])):
+ # print (sname + " already requested.")
+ # return True
+ # if(sname in str(course['confirmed'])):
+ # print (sname + " alredy enrolled.")
+ # return False
- student = getDB("http://127.0.0.1:8000/api/students/" + sname)
- try:
- if(student['added_to']==""):
- student['added_to']=course['name']
- else:
- student['added_to']=student['added_to']+ "," + course['name']
- except:
- print(sname + " does not exist.")
- return False
- print(student['added_to'])
- s={
- 'first_name':student["first_name"],
- 'last_name':student["last_name"],
- 'git':student["git"],
- 'ion_user':student["ion_user"],
- 'student_id':student["student_id"],
- 'added_to':student['added_to'],
- 'classes':student["classes"],
- 'email':student["email"],
- 'grade':student["grade"],
- 'completed':student["completed"],
- 'repo':student["repo"]
- }
- student = putDB(s, student['url'])
-
- if(course['unconfirmed']==""):
+ # student = getDB("http://127.0.0.1:8000/api/students/" + sname)
+ # try:
+ # if(student['added_to']==""):
+ # student['added_to']=course['name']
+ # else:
+ # student['added_to']=student['added_to']+ "," + course['name']
+ # except:
+ # print(sname + " does not exist.")
+ # return False
+ # print(student['added_to'])
+ # data={
+ # 'added_to':student['added_to'],
+ # }
+ # student = patchDB(data, "http://localhost:8000/api/students/" + student['ion_user'] + "/")
+ student = getDB( "http://localhost:8000/api/students/" + (sname)+ "/")
+ if(course['unconfirmed']==[]):
course['unconfirmed']=student['ion_user']
else:
- course['unconfirmed']=course['unconfirmed']+ "," + student['ion_user']
+ course['unconfirmed']=course['unconfirmed'].append(student['ion_user'])
cinfo = {
- "name": course['name'],
- "repo": "",
- "path": self.username + "/" + course['name'],
- "teacher": self.username,
- "assignments": course['assignments'],
- "default_file": "",
- "confirmed": course["confirmed"],
"unconfirmed": course['unconfirmed']
}
- print(putDB(cinfo, course['url']))
+ print(cinfo)
+ patchDB(cinfo, "http://localhost:8000/api/classes/" + course['name'] + "/")
return True
#Student should have confirmed on their endd, but class had not been updated yet
@@ -390,16 +346,10 @@ class Teacher:
course['unconfirmed']= course['unconfirmed'].replace(student['ion_user']+",", "")
cinfo = {
- "name": course['name'],
- "repo": "",
- "path": course['path'],
- "teacher": self.username,
- "assignments": course['assignments'],
- "default_file": "",
"confirmed": course["confirmed"],
"unconfirmed": course['unconfirmed']
}
- print(putDB(cinfo, course['url']))
+ print(patchDB(cinfo, "http://localhost:8000/api/classes/" + course['name'] + "/"))
return True
#goes through list of studennts, tries to add, then request, return unconfirmed students
@@ -417,10 +367,10 @@ class Teacher:
parts = path.split("/")
aname = parts[len(parts)-1]
- if(os.path.isdir(path) == 0 or len(parts) < 3) or aname in self.sclass:
+ if(os.path.isdir(path) == 0 or len(parts) < 3) or aname in str(self.classes):
print("Not valid path.")
return False
- if((parts[1] in self.sclass) == False):
+ if((parts[1] in str(self.classes)) == False):
print("Not in valid class directory")
return False
#parts of assignment name (Essay1, APLit)
@@ -445,7 +395,7 @@ class Teacher:
return False
course = getDB("http://127.0.0.1:8000/api/classes/" + course)
- if(aname in course['assignments']):
+ if(aname in str(course['assignments'])):
print("Assignment name already taken.")
return False
@@ -459,7 +409,7 @@ class Teacher:
slist = os.listdir(os.getcwd() + "/" + self.username + "/Students/" + course['name'])
cdir = os.getcwd()
for st in slist:
- if st in course['confirmed']:
+ if st in str(course['confirmed']):
spath = os.path.join(os.getcwd() + "/" + self.username + "/Students/" + course['name'], st)
if(os.path.exists(spath + "/" + aname) == False):
os.mkdir(spath + "/" + aname)
@@ -487,21 +437,14 @@ class Teacher:
}
postDB(ass, 'http://127.0.0.1:8000/api/assignments/')
if(course['assignments'] == ""):
- course['assignments'] = aname
+ course['assignments'] = ass
else:
- course['assignments'] = course['assignments'] + "," + aname
+ course['assignments'] = course['assignments'].append(ass)
cinfo = {
- "name": course['name'],
- "repo": "",
- "path": course['path'],
- "teacher": "eharris1",
"assignments": course['assignments'],
- "default_file": "",
- "confirmed": course["confirmed"],
- "unconfirmed": course['unconfirmed']
}
- putDB(cinfo, "http://127.0.0.1:8000/api/classes/" + course['name'] + "/")
+ patchDB(cinfo, "http://127.0.0.1:8000/api/classes/" + course['name'] + "/")
return True
else:
print("Assignment already addedd")
@@ -510,18 +453,22 @@ class Teacher:
#try to avoid
#copy modified assignments to student directories
def updateAssignment(self, path, course, due):
+ parts = path.split("/")
+ aname = parts[len(parts)-1]
if(os.path.isdir(path) == False):
print(path + " is not an assignment.")
return
try:
if(due != None or due == ""):
datetime.strptime(due, '%Y-%m-%d %H:%M:%S.%f')
+ d = {
+ 'due_date':due,
+ }
+ patchDB(d, 'http://localhost:8000/api/assignments/' + aname + "/")
+ print("Due-date changed " + due)
except:
- print("Due-date format is incorrect")
- return
+ print("Due-date is the same")
input()
- parts = path.split("/")
- aname = parts[len(parts)-1]
course = getDB("http://127.0.0.1:8000/api/classes/" + course)
slist = os.listdir(os.getcwd() + "/" + self.username + "/Students/" + course['name'])
cdir = os.getcwd()
@@ -654,12 +601,12 @@ class Teacher:
data = getTeacher("eharris1")
t = Teacher(data)
-# t.makeClass("APLit_eharris1")
-#t.addAssignment("eharris1/APLit_eharris1/Lab3_APLit_eharris1", "APLit_eharris1", '2020-08-11 16:58:33.383124')
+#t.addClass("eharris1/APLit_eharris1")
+#t.addAssignment("eharris1/APLit_eharris1/Essay1_eharris1", "APLit_eharris1", '2020-08-11 16:58:33.383124')
#ar = ['2022rkhondak','2022inafi','2023rumareti']
#extra = t.reqAddStudentList(ar, "APLit_eharris1")
#print(extra)
-# t.getStudents('2022rkhondak')
+t.reqStudent('2022rkhondak', 'APLit_eharris1')
# t.getChanges('2022rkhondak','APLit_eharris1', 10)
'''
diff --git a/Website/api/admin.py b/Website/api/admin.py
index 8446cf4..5f8cd8c 100644
--- a/Website/api/admin.py
+++ b/Website/api/admin.py
@@ -2,7 +2,7 @@ from django.contrib import admin
from .models import (
DefFiles,
Assignment,
- Classes,
+ Class,
Teacher,
Student
)
@@ -13,4 +13,4 @@ admin.site.register(Teacher)
admin.site.register(Student)
admin.site.register(DefFiles)
admin.site.register(Assignment)
-admin.site.register(Classes)
+admin.site.register(Class)
diff --git a/Website/api/maker.py b/Website/api/maker.py
index fb383ed..18afd33 100644
--- a/Website/api/maker.py
+++ b/Website/api/maker.py
@@ -1,3 +1,7 @@
+from django.contrib.auth.models import Group
+
+g, created = Group.objects.get_or_create(name='teachers')
+
# from datetime import datetime
#
# f1 = DefFiles(
@@ -30,7 +34,7 @@
#
# ####################################
#
-# from api.models import Assignment, Student, Classes, Teacher, DefFiles
+# from api.models import Assignment, Student, Class, Teacher, DefFiles
# from datetime import datetime
#
# f1 = DefFiles(
@@ -76,8 +80,8 @@
# A3.files.add(f4)
# A3.save()
#
-# #classes
-# math = Classes(
+# #Class
+# math = Class(
# name='Math5',
#
# )
@@ -86,7 +90,7 @@
# math.assignments.add(A2)
# math.save()
#
-# english = Classes(
+# english = Class(
# name='English',
# )
# english.save()
@@ -104,8 +108,8 @@
# repo="https://github.com/therealraffi/2022rkhondak.git",
# )
# raffu.save()
-# raffu.classes.add(math)
-# raffu.classes.add(english)
+# raffu.Class.add(math)
+# raffu.Class.add(english)
# raffu.save()
#
# #teachers
@@ -115,7 +119,7 @@
# ion_user="eharris1"
# )
# ng.save()
-# ng.classes.add(math)
+# ng.Class.add(math)
# ng.save()
#
# chao = Teacher(
@@ -124,5 +128,5 @@
# ion_user="AKBailey"
# )
# chao.save()
-# chao.classes.add(english)
+# chao.Class.add(english)
# chao.save()
diff --git a/Website/api/migrations/0001_initial.py b/Website/api/migrations/0001_initial.py
deleted file mode 100644
index 96b239b..0000000
--- a/Website/api/migrations/0001_initial.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# Generated by Django 3.0.7 on 2020-06-14 19:14
-
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ]
-
- operations = [
- migrations.CreateModel(
- name='DefFiles',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('name', models.CharField(max_length=100)),
- ('path', models.CharField(max_length=100)),
- ('assignment', models.CharField(default='', max_length=100)),
- ('classes', models.CharField(max_length=100)),
- ('teacher', models.CharField(max_length=100)),
- ],
- ),
- migrations.CreateModel(
- name='Teacher',
- fields=[
- ('created', models.DateTimeField(auto_now_add=True)),
- ('first_name', models.CharField(max_length=100)),
- ('last_name', models.CharField(max_length=100)),
- ('classes', models.CharField(blank=True, default='', max_length=100)),
- ('ion_user', models.CharField(max_length=100, primary_key=True, serialize=False)),
- ('git', models.CharField(max_length=100)),
- ('email', models.CharField(blank=True, default='', max_length=100)),
- ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.CreateModel(
- name='Student',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('website', models.CharField(blank=True, default='https://google.com', max_length=150)),
- ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.CreateModel(
- name='Classes',
- fields=[
- ('name', models.CharField(max_length=100, primary_key=True, serialize=False)),
- ('repo', models.URLField(blank=True, default='')),
- ('path', models.CharField(default='', max_length=100)),
- ('teacher', models.CharField(default='', max_length=100)),
- ('assignments', models.TextField(blank=True, default='')),
- ('default_file', models.CharField(blank=True, default='', max_length=100)),
- ('confirmed', models.TextField(blank=True, default='')),
- ('unconfirmed', models.TextField(blank=True, default='')),
- ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- ],
- ),
- migrations.CreateModel(
- name='Assignment',
- fields=[
- ('name', models.CharField(max_length=100, primary_key=True, serialize=False)),
- ('due_date', models.DateTimeField()),
- ('files', models.CharField(blank=True, default='', max_length=100)),
- ('path', models.CharField(max_length=100)),
- ('classes', models.CharField(max_length=100)),
- ('teacher', models.CharField(max_length=100)),
- ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to=settings.AUTH_USER_MODEL)),
- ],
- ),
- ]
diff --git a/Website/api/migrations/0002_auto_20200614_2034.py b/Website/api/migrations/0002_auto_20200614_2034.py
deleted file mode 100644
index f6c6f87..0000000
--- a/Website/api/migrations/0002_auto_20200614_2034.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Generated by Django 3.0.7 on 2020-06-14 20:34
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('api', '0001_initial'),
- ]
-
- operations = [
- migrations.RemoveField(
- model_name='student',
- name='website',
- ),
- migrations.AddField(
- model_name='student',
- name='added_to',
- field=models.CharField(blank=True, default='', max_length=100),
- ),
- migrations.AddField(
- model_name='student',
- name='classes',
- field=models.CharField(blank=True, default='', max_length=100),
- ),
- migrations.AddField(
- model_name='student',
- name='completed',
- field=models.TextField(blank=True, default=''),
- ),
- migrations.AddField(
- model_name='student',
- name='git',
- field=models.CharField(blank=True, default='https://github.com/', max_length=100),
- ),
- migrations.AddField(
- model_name='student',
- name='grade',
- field=models.IntegerField(blank=True, default=9),
- ),
- migrations.AddField(
- model_name='student',
- name='repo',
- field=models.URLField(blank=True, default=''),
- ),
- migrations.AddField(
- model_name='student',
- name='student_id',
- field=models.IntegerField(blank=True, default=0),
- ),
- ]
diff --git a/Website/api/migrations/0003_auto_20200614_2044.py b/Website/api/migrations/0003_auto_20200614_2044.py
deleted file mode 100644
index d5a7a69..0000000
--- a/Website/api/migrations/0003_auto_20200614_2044.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Generated by Django 3.0.7 on 2020-06-14 20:44
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('api', '0002_auto_20200614_2034'),
- ]
-
- operations = [
- migrations.RemoveField(
- model_name='student',
- name='student_id',
- ),
- migrations.RemoveField(
- model_name='teacher',
- name='created',
- ),
- migrations.RemoveField(
- model_name='teacher',
- name='email',
- ),
- migrations.RemoveField(
- model_name='teacher',
- name='first_name',
- ),
- migrations.RemoveField(
- model_name='teacher',
- name='last_name',
- ),
- migrations.AlterField(
- model_name='student',
- name='git',
- field=models.CharField(blank=True, default='', max_length=100),
- ),
- migrations.AlterField(
- model_name='student',
- name='grade',
- field=models.IntegerField(blank=True),
- ),
- ]
diff --git a/Website/api/migrations/0004_auto_20200614_2107.py b/Website/api/migrations/0004_auto_20200614_2107.py
deleted file mode 100644
index 75e2a7c..0000000
--- a/Website/api/migrations/0004_auto_20200614_2107.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 3.0.7 on 2020-06-14 21:07
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('api', '0003_auto_20200614_2044'),
- ]
-
- operations = [
- migrations.AlterField(
- model_name='student',
- name='grade',
- field=models.IntegerField(blank=True, default=0),
- ),
- ]
diff --git a/Website/api/models.py b/Website/api/models.py
index e8bb2b3..d5b5aee 100644
--- a/Website/api/models.py
+++ b/Website/api/models.py
@@ -1,12 +1,24 @@
from django.db import models
from django.contrib.auth.models import User
+import secrets
-class DefFiles(models.Model):
- name=models.CharField(max_length=100)
- path=models.CharField(max_length=100)
- assignment=models.CharField(max_length=100, default="")
- classes=models.CharField(max_length=100)
- teacher=models.CharField(max_length=100)
+
+
+class Student(models.Model):
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+ ion_user = models.CharField(max_length=100, primary_key=True)
+ grade = models.IntegerField(default=0, blank=True)
+ git=models.CharField(default="", max_length=100, blank=True)
+ repo=models.URLField(default="", blank=True)
+ classes=models.CharField(max_length=100, default="", blank=True)
+ added_to=models.CharField(max_length=100, default="", blank=True)
+ completed=models.TextField(default="", blank=True)
+
+ def save(self, *args, **kwargs):
+ super(Student, self).save(*args, **kwargs)
+
+ def __str__(self):
+ return f"{self.user.username}'s Profile"
class Assignment(models.Model):
owner = models.ForeignKey('auth.User', related_name='assignments', on_delete=models.CASCADE)
@@ -21,44 +33,59 @@ class Assignment(models.Model):
def __str__(self):
return '%s' % (self.name)
-class Classes(models.Model):
- user = models.OneToOneField(User, on_delete=models.CASCADE)
-
+class Class(models.Model):
+ owner = models.ForeignKey('auth.User', related_name='classes', on_delete=models.CASCADE)
+ teacher = models.CharField(max_length=100)
name = models.CharField(primary_key=True, max_length=100)
+ id = models.CharField(max_length=8, blank=True, null=True)
+ description = models.CharField(default="Class Description", max_length=500)
repo=models.URLField(default="", blank=True)
path=models.CharField(max_length=100, default="")
- teacher=models.CharField(max_length=100, default="")
- assignments=models.TextField(default="", blank=True)
+ assignments=models.ManyToManyField(Assignment, blank=True)
default_file=models.CharField(max_length=100, default="", blank=True)
- confirmed=models.TextField(default="", blank=True)
- unconfirmed=models.TextField(default="", blank=True)
+ confirmed=models.ManyToManyField(Student, blank=True, related_name='confirmed')
+ unconfirmed=models.ManyToManyField(Student, blank=True, related_name='unconfirmed')
# assignments = models.ManyToManyField(Assignment, default="")
# default_file = models.ManyToManyField(DefFiles)
def save(self, *args, **kwargs):
- return super(Classes, self).save(*args, **kwargs)
+ id = self.id
+ if not id:
+ id = secrets.token_urlsafe()[:8].lower()
+ while Class.objects.filter(id=id).exclude(pk=self.pk).exists():
+ id = sercrets.token_urlsafe()[:8].lower()
+ self.id = id
+ return super(Class, self).save(*args, **kwargs)
+
+ def __str__(self):
+ return self.name
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
- # classes = models.ManyToManyField(Classes, default="")
- classes=models.CharField(max_length=100, default="", blank=True)
+ classes=models.ManyToManyField(Class, blank=True, related_name='classes')
+ git=models.CharField(max_length=100, default="", blank=True)
ion_user=models.CharField(primary_key=True, max_length=100)
- git=models.CharField(max_length=100)
+
+ def __str__(self):
+ return f"{self.user.username}'s Profile"
def save(self, *args, **kwargs):
super(Teacher, self).save(*args, **kwargs)
-class Student(models.Model):
- user = models.OneToOneField(User, on_delete=models.CASCADE)
- grade = models.IntegerField(default=0, blank=True)
- git=models.CharField(default="", max_length=100, blank=True)
- repo=models.URLField(default="", blank=True)
- classes=models.CharField(max_length=100, default="", blank=True)
- added_to=models.CharField(max_length=100, default="", blank=True)
- completed=models.TextField(default="", blank=True)
+# class Student(models.Model):
+# user = models.OneToOneField(User, on_delete=models.CASCADE)
+# ion_user=models.CharField(primary_key=True, max_length=100)
+# grade = models.IntegerField(default=0, blank=True)
+# git=models.CharField(default="", max_length=100, blank=True)
+# repo=models.URLField(default="", blank=True)
+# classes=models.CharField(max_length=100, default="", blank=True)
+# added_to=models.CharField(max_length=100, default="", blank=True)
+# completed=models.TextField(default="", blank=True)
- def save(self, *args, **kwargs):
- super(Student, self).save(*args, **kwargs)
- def __str__(self):
- return f"{self.user.username}'s Profile"
+class DefFiles(models.Model):
+ name=models.CharField(max_length=100)
+ path=models.CharField(max_length=100)
+ assignment=models.CharField(max_length=100, default="")
+ classes=models.CharField(max_length=100)
+ teacher=models.CharField(max_length=100)
diff --git a/Website/api/permissions.py b/Website/api/permissions.py
index 2d64429..7e0591c 100644
--- a/Website/api/permissions.py
+++ b/Website/api/permissions.py
@@ -13,7 +13,7 @@ class IsOwnerOrReadOnly(permissions.BasePermission):
return True
# Write permissions are only allowed to the owner of the snippet.
- return obj.owner == request.user or request.user.is_superuser
+ return obj.user == request.user or request.user.is_superuser
class isTeacher(permissions.BasePermission):
#only teachers can make classes and assignmenst
diff --git a/Website/api/serializers.py b/Website/api/serializers.py
index 2a05750..40521ac 100644
--- a/Website/api/serializers.py
+++ b/Website/api/serializers.py
@@ -1,12 +1,12 @@
from django.contrib.auth.models import User, Group
-from .models import Student, Teacher, Classes, Assignment, DefFiles
+from .models import Student, Teacher, Class, Assignment, DefFiles
from rest_framework import serializers, permissions
from django.contrib.auth.models import User
from .permissions import IsOwnerOrReadOnly,isTeacher
class UserSerializer(serializers.HyperlinkedModelSerializer):
- students = serializers.PrimaryKeyRelatedField(many=True, queryset=Student.objects.all())
- teachers = serializers.PrimaryKeyRelatedField(many=True, queryset=Teacher.objects.all())
+ # students = serializers.PrimaryKeyRelatedField(many=True, queryset=Student.objects.all())
+ # teachers = serializers.PrimaryKeyRelatedField(many=True, queryset=Teacher.objects.all())
class Meta:
model = User
@@ -15,41 +15,38 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
# class DefFilesSerializer(serializers.HyperlinkedModelSerializer):
# class Meta:
# model = DefFiles
-# fields = ['name', 'path','assignment','classes', "teacher",'url', 'id']
+# fields = ['name', 'path','assignment','Class', "teacher",'url', 'id']
class AssignmentSerializer(serializers.HyperlinkedModelSerializer):
- #permissions_classes = [permissions.IsAuthenticatedOrReadOnly]
+ #permissions_Class = [permissions.IsAuthenticatedOrReadOnly]
# files = DefFilesSerializer(many=True, read_only=True,allow_null=True)
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Assignment
- # fields = ['url','name', 'due_date', 'path' , "classes","teacher",'owner']
- fields = ['name', 'due_date', 'path' , "classes","teacher",'owner']
+ # fields = ['url','name', 'due_date', 'path' , "Class","teacher",'owner']
+ fields = ['name', 'due_date', 'path' ,"teacher",'owner']
-class ClassesSerializer(serializers.HyperlinkedModelSerializer):
+class ClassSerializer(serializers.ModelSerializer):
# assignments = AssignmentSerializer(many=True, read_only=True,allow_null=True)
# default_file=DefFilesSerializer(many=True, read_only=True,allow_null=True)
- owner = serializers.ReadOnlyField(source='owner.username')
+ #owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
- model = Classes
+ model = Class
# fields = ['url','name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner']
- fields = ['name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner']
+ fields = ['name', 'repo','path','assignments',"teacher","default_file", 'confirmed', 'unconfirmed','owner']
-class StudentSerializer(serializers.HyperlinkedModelSerializer):
- # classes = ClassesSerializer(many=True, read_only=True,allow_null=True)
- owner = serializers.ReadOnlyField(source='owner.username')
+class StudentSerializer(serializers.ModelSerializer):
+ # Class = ClassSerializer(many=True, read_only=True,allow_null=True)
class Meta:
model = Student
- # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner']
- fields = ['first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner']
+ # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','Class','added_to','completed', 'repo','owner']
+ fields = ['url','grade', 'ion_user','git','user','classes','added_to','completed', 'repo']
class TeacherSerializer(serializers.ModelSerializer):
- # classes = ClassesSerializer(many=True, read_only=True,allow_null=True)
- owner = serializers.ReadOnlyField(source='owner.username')
+ #classes = ClassSerializer(many=True, read_only=True,allow_null=True)
+ #owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Teacher
- # fields = ['url','first_name', 'last_name','git','ion_user', 'email','classes','owner']
- fields = ['first_name', 'last_name','git','ion_user', 'email','classes','owner']
-
-
+ # fields = ['url','first_name', 'last_name','git','ion_user', 'email','Class','owner']
+ fields = ['git','ion_user','classes','user']
diff --git a/Website/api/urls.py b/Website/api/urls.py
index f130d15..6434309 100644
--- a/Website/api/urls.py
+++ b/Website/api/urls.py
@@ -9,8 +9,8 @@ urlpatterns = [
path('teachers//', views.TeacherDetail.as_view()),
path('assignments/', views.AssignmentList.as_view()),
path('assignments//', views.AssignmentDetail.as_view()),
- path('classes/', views.ClassesList.as_view()),
- path('classes//', views.ClassesDetail.as_view()),
+ path('classes/', views.ClassList.as_view()),
+ path('classes//', views.ClassDetail.as_view()),
]
-urlpatterns = format_suffix_patterns(urlpatterns)
\ No newline at end of file
+urlpatterns = format_suffix_patterns(urlpatterns)
diff --git a/Website/api/views.py b/Website/api/views.py
index 3876c0a..fb95e11 100644
--- a/Website/api/views.py
+++ b/Website/api/views.py
@@ -1,5 +1,5 @@
-from .models import Student, Teacher, Classes, Assignment, DefFiles
-from .serializers import StudentSerializer, TeacherSerializer, ClassesSerializer, AssignmentSerializer, UserSerializer
+from .models import Student, Teacher, Class, Assignment, DefFiles
+from .serializers import StudentSerializer, TeacherSerializer, ClassSerializer, AssignmentSerializer, UserSerializer
from rest_framework import generics, viewsets, permissions, response, status
from django.http import Http404
from rest_framework.views import APIView
@@ -8,13 +8,13 @@ from .permissions import isTeacher, IsOwnerOrReadOnly
from django.shortcuts import render, redirect
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
-
+from django.contrib.auth.models import Group
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
- permission_classes = [permissions.IsAuthenticated]
+ permission_Class = [permissions.IsAuthenticated]
class StudentViewSet(viewsets.ModelViewSet):
@@ -23,10 +23,10 @@ class StudentViewSet(viewsets.ModelViewSet):
"""
queryset = Student.objects.all()
serializer_class = StudentSerializer
- permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
+ permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
def perform_create(self, serializer):
- serializer.save(owner=self.request.user)
+ serializer.save(user=self.request.user)
class TeacherViewSet(viewsets.ModelViewSet):
"""
@@ -34,25 +34,25 @@ class TeacherViewSet(viewsets.ModelViewSet):
"""
queryset = Teacher.objects.all()
serializer_class = TeacherSerializer
- permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
+ permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
def perform_create(self, serializer):
- serializer.save(owner=self.request.user)
+ serializer.save(user=self.request.user)
-class ClassesViewSet(viewsets.ModelViewSet):
+class ClassViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
- queryset = Classes.objects.all()
- serializer_class = ClassesSerializer
- permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
+ queryset = Class.objects.all()
+ serializer_class = ClassSerializer
+ permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
- def perform_create(self, serializer):
- if(self.request.user.groups.filter(name__in=['teachers']).exists() or self.request.user.is_superuser):
- serializer.save(owner=self.request.user)
- else:
- print("UNAUTHORIZED POST")
- return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
+ # def perform_create(self, serializer):
+ # if(self.request.user.groups.filter(name__in=['teachers']).exists() or self.request.user.is_superuser):
+ # serializer.save(owner=self.request.user)
+ # else:
+ # print("UNAUTHORIZED POST")
+ # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class AssignmentViewSet(viewsets.ModelViewSet):
@@ -61,7 +61,7 @@ class AssignmentViewSet(viewsets.ModelViewSet):
"""
queryset = Assignment.objects.all()
serializer_class = AssignmentSerializer
- permission_classes = [permissions.IsAuthenticated, isTeacher, IsOwnerOrReadOnly]
+ permission_Class = [permissions.IsAuthenticated, isTeacher, IsOwnerOrReadOnly]
def perform_create(self, serializer):
if(self.request.user.groups.filter(name__in=['teachers']).exists() or self.request.user.is_superuser):
@@ -76,4 +76,4 @@ class AssignmentViewSet(viewsets.ModelViewSet):
# """
# queryset = DefFiles.objects.all()
# serializer_class = DefFilesSerializer
-# permissions_classes = [permissions.IsAuthenticatedOrReadOnly]
+# permissions_Class = [permissions.IsAuthenticatedOrReadOnly]
diff --git a/Website/config/urls.py b/Website/config/urls.py
index 420beb6..297739c 100644
--- a/Website/config/urls.py
+++ b/Website/config/urls.py
@@ -9,7 +9,7 @@ router = routers.DefaultRouter()
router.register(r'students', api_views.StudentViewSet)
router.register(r'teachers', api_views.TeacherViewSet)
router.register(r'assignments', api_views.AssignmentViewSet)
-router.register(r'classes', api_views.ClassesViewSet)
+router.register(r'classes', api_views.ClassViewSet)
# router.register(r'files', api_views.DefFilesViewSet)
router.register(r'users', api_views.UserViewSet)
diff --git a/Website/skoolos/forms.py b/Website/skoolos/forms.py
new file mode 100644
index 0000000..6374f97
--- /dev/null
+++ b/Website/skoolos/forms.py
@@ -0,0 +1,28 @@
+from django import forms
+from django.contrib.auth.models import User
+from api.models import Student, Teacher
+import re
+
+class UserUpdateForm(forms.ModelForm):
+
+ username = forms.CharField(max_length=50, disabled=True)
+ first_name = forms.CharField(max_length=50, disabled=True)
+ last_name = forms.CharField(max_length=50, disabled=True)
+ email = forms.EmailField()
+
+ def __init__(self, *args, **kwargs):
+ super(UserUpdateForm, self).__init__(*args, **kwargs)
+
+ class Meta:
+ model = User
+ fields = ['username','first_name','last_name','email']
+
+class StudentUpdateForm(forms.ModelForm):
+ class Meta:
+ model = Student
+ fields = ['git']
+
+class TeacherUpdateForm(forms.ModelForm):
+ class Meta:
+ model = Teacher
+ fields = ['git']
diff --git a/Website/skoolos/static/skoolos/styles.css b/Website/skoolos/static/skoolos/styles.css
index 8eb8163..0f86d92 100644
--- a/Website/skoolos/static/skoolos/styles.css
+++ b/Website/skoolos/static/skoolos/styles.css
@@ -13,22 +13,20 @@ body {
color: #333333;
margin-top: 5rem;
font-family: 'Segoe UI';
+ margin-left: 2.5rem;
+ margin-right: 2.5rem;
}
h1, h2, h3, h4, h5, h6 {
color: #444444;
}
-ul {
- margin: 0;
-}
-
.bg-steel {
background: #3cba54;
}
.site-header .navbar-nav .nav-link {
- color: #cbd5db;
+ color: #e1e1e1;
}
.site-header .navbar-nav .nav-link:hover {
@@ -69,7 +67,8 @@ a.article-title:hover {
.article-metadata {
padding-bottom: 1px;
margin-bottom: 4px;
- border-bottom: 1px solid #e3e3e3
+ border-bottom: 1px solid #e3e3e3;
+ font-size: 1.5em;
}
.article-metadata a:hover {
@@ -93,8 +92,3 @@ a.article-title:hover {
.account-heading {
font-size: 2.5rem;
}
-
-.nounderline {
- text-decoration: none !important;
- color: black !important;
-}
diff --git a/Website/skoolos/static/skoolos/tj_trans.png b/Website/skoolos/static/skoolos/tj_trans.png
new file mode 100644
index 0000000..873c249
Binary files /dev/null and b/Website/skoolos/static/skoolos/tj_trans.png differ
diff --git a/Website/skoolos/templates/skoolos/base.html b/Website/skoolos/templates/skoolos/base.html
index ce0d628..2ec152d 100644
--- a/Website/skoolos/templates/skoolos/base.html
+++ b/Website/skoolos/templates/skoolos/base.html
@@ -21,8 +21,8 @@