mirror of
https://github.com/Rushilwiz/SkoolOS.git
synced 2025-04-16 02:10:19 -04:00
Merge branch 'development' of https://github.com/rushilwiz/SkoolOs into development
This commit is contained in:
commit
37451e7071
|
@ -1 +0,0 @@
|
||||||
{"username": "2022rkhondak", "grade": 10, "is_student": true, "password": "hackgroup1"}
|
|
203
CLI/teacher.py
203
CLI/teacher.py
|
@ -9,7 +9,18 @@ import time
|
||||||
import pyperclip
|
import pyperclip
|
||||||
from distutils.dir_util import copy_tree
|
from distutils.dir_util import copy_tree
|
||||||
from datetime import datetime
|
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 ==> <student-id>/classes/assignments
|
#git clone student directory ==> <student-id>/classes/assignments
|
||||||
|
|
||||||
#get teacher info from api
|
#get teacher info from api
|
||||||
|
@ -33,6 +44,10 @@ def getDB(url):
|
||||||
r = requests.get(url = url, auth=('raffukhondaker','hackgroup1'))
|
r = requests.get(url = url, auth=('raffukhondaker','hackgroup1'))
|
||||||
print("GET:" + str(r.status_code))
|
print("GET:" + str(r.status_code))
|
||||||
return(r.json())
|
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):
|
def postDB(data, url):
|
||||||
r = requests.post(url = url, data=data, auth=('raffukhondaker','hackgroup1'))
|
r = requests.post(url = url, data=data, auth=('raffukhondaker','hackgroup1'))
|
||||||
|
@ -69,25 +84,11 @@ class Teacher:
|
||||||
self.git=data['git']
|
self.git=data['git']
|
||||||
self.username=data['ion_user']
|
self.username=data['ion_user']
|
||||||
self.url= "http://127.0.0.1:8000/api/teachers/" + self.username + "/"
|
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)
|
#classes in id form (Example: 4,5)
|
||||||
|
|
||||||
cid=data['classes'].split(",")
|
#array
|
||||||
try:
|
self.classes=data['classes']
|
||||||
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'])
|
|
||||||
if(os.path.isdir(self.username + "/Students")):
|
if(os.path.isdir(self.username + "/Students")):
|
||||||
print("Synced to " + self.username)
|
print("Synced to " + self.username)
|
||||||
else:
|
else:
|
||||||
|
@ -149,41 +150,31 @@ class Teacher:
|
||||||
|
|
||||||
#make class from existing directory, add to git and api
|
#make class from existing directory, add to git and api
|
||||||
def addClass(self, path):
|
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)):
|
if (self.checkClass(path)):
|
||||||
cname = path.split("/")
|
|
||||||
cname = cname[len(cname)-1]
|
|
||||||
cpath = self.username + "/" + cname
|
cpath = self.username + "/" + cname
|
||||||
data = {
|
data = {
|
||||||
"name": cname,
|
"name": cname,
|
||||||
"repo": "",
|
"repo": "",
|
||||||
"path": cpath,
|
"path": cpath,
|
||||||
"teacher": self.username,
|
"teacher": self.username,
|
||||||
"assignments": "",
|
"owner":self.id
|
||||||
"default_file": "",
|
|
||||||
"confirmed": "",
|
|
||||||
"unconfirmed": ""
|
|
||||||
}
|
}
|
||||||
#make class instance in db
|
#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
|
#add to instance
|
||||||
#upate self.classes
|
#upate self.classes
|
||||||
self.classes.append(data)
|
data = {
|
||||||
if(len(self.sclass)==0):
|
'classes':self.classes
|
||||||
self.sclass = data['name']
|
|
||||||
else:
|
|
||||||
self.sclass = self.sclass + "," + str(data['name'])
|
|
||||||
|
|
||||||
#update teacher instance in db, classes field
|
|
||||||
teacher={
|
|
||||||
'git':self.git,
|
|
||||||
'ion_user':self.username,
|
|
||||||
'url':self.url,
|
|
||||||
'classes':self.sclass,
|
|
||||||
}
|
}
|
||||||
putDB(teacher, self.url)
|
print(self.username)
|
||||||
|
print(patchDB(data, 'http://127.0.0.1:8000/api/teachers/' + self.username + "/"))
|
||||||
return teacher
|
|
||||||
|
|
||||||
|
|
||||||
#make a new class from scratch
|
#make a new class from scratch
|
||||||
#subject: string, assignments: list
|
#subject: string, assignments: list
|
||||||
|
@ -219,8 +210,7 @@ class Teacher:
|
||||||
# f.close()
|
# f.close()
|
||||||
# os.chdir(cdir)
|
# os.chdir(cdir)
|
||||||
|
|
||||||
data = self.addClass(path)
|
self.addClass(path)
|
||||||
return data
|
|
||||||
|
|
||||||
def deleteClass(self, path):
|
def deleteClass(self, path):
|
||||||
if(os.path.exists(path) == False):
|
if(os.path.exists(path) == False):
|
||||||
|
@ -235,22 +225,12 @@ class Teacher:
|
||||||
print("DELETE: " + self.classes[i]['name'])
|
print("DELETE: " + self.classes[i]['name'])
|
||||||
for i in range(len(self.classes)):
|
for i in range(len(self.classes)):
|
||||||
c = self.classes[i]
|
c = self.classes[i]
|
||||||
if(c['name'] == cname):
|
if(c == cname):
|
||||||
del self.classes[i]
|
del self.classes[i]
|
||||||
s=""
|
# data={
|
||||||
#recreate sclass field, using ids
|
# 'classes':self.classes,
|
||||||
for c in self.classes:
|
# }
|
||||||
s = s + str(c['name']) + ","
|
# print(patchDB(data, self.url))
|
||||||
print(s)
|
|
||||||
s = s[:-1]
|
|
||||||
print(s)
|
|
||||||
data={
|
|
||||||
'git':self.git,
|
|
||||||
'ion_user':self.username,
|
|
||||||
'url':self.url,
|
|
||||||
'classes':s,
|
|
||||||
}
|
|
||||||
print(putDB(data, self.url))
|
|
||||||
delDB("http://127.0.0.1:8000/api/classes/" + cname + "/")
|
delDB("http://127.0.0.1:8000/api/classes/" + cname + "/")
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -274,49 +254,37 @@ class Teacher:
|
||||||
print(sname + " does not exist.")
|
print(sname + " does not exist.")
|
||||||
return False
|
return False
|
||||||
course = getDB("http://127.0.0.1:8000/api/classes/" + cname)
|
course = getDB("http://127.0.0.1:8000/api/classes/" + cname)
|
||||||
if(sname in course['unconfirmed']):
|
# if(sname in str(course['unconfirmed'])):
|
||||||
print (sname + " already requested.")
|
# print (sname + " already requested.")
|
||||||
return True
|
# return True
|
||||||
if(sname in course['confirmed']):
|
# if(sname in str(course['confirmed'])):
|
||||||
print (sname + " alredy enrolled.")
|
# print (sname + " alredy enrolled.")
|
||||||
return False
|
# return False
|
||||||
|
|
||||||
student = getDB("http://127.0.0.1:8000/api/students/" + sname)
|
# student = getDB("http://127.0.0.1:8000/api/students/" + sname)
|
||||||
try:
|
# try:
|
||||||
if(student['added_to']==""):
|
# if(student['added_to']==""):
|
||||||
student['added_to']=course['name']
|
# student['added_to']=course['name']
|
||||||
else:
|
# else:
|
||||||
student['added_to']=student['added_to']+ "," + course['name']
|
# student['added_to']=student['added_to']+ "," + course['name']
|
||||||
except:
|
# except:
|
||||||
print(sname + " does not exist.")
|
# print(sname + " does not exist.")
|
||||||
return False
|
# return False
|
||||||
print(student['added_to'])
|
# print(student['added_to'])
|
||||||
s={
|
# data={
|
||||||
'git':student["git"],
|
# 'added_to':student['added_to'],
|
||||||
'ion_user':student["ion_user"],
|
# }
|
||||||
'added_to':student['added_to'],
|
# student = patchDB(data, "http://localhost:8000/api/students/" + student['ion_user'] + "/")
|
||||||
'classes':student["classes"],
|
student = getDB( "http://localhost:8000/api/students/" + (sname)+ "/")
|
||||||
'grade':student["grade"],
|
if(course['unconfirmed']==[]):
|
||||||
'completed':student["completed"],
|
|
||||||
'repo':student["repo"]
|
|
||||||
}
|
|
||||||
student = putDB(s, student['url'])
|
|
||||||
|
|
||||||
if(course['unconfirmed']==""):
|
|
||||||
course['unconfirmed']=student['ion_user']
|
course['unconfirmed']=student['ion_user']
|
||||||
else:
|
else:
|
||||||
course['unconfirmed']=course['unconfirmed']+ "," + student['ion_user']
|
course['unconfirmed']=course['unconfirmed'].append(student['ion_user'])
|
||||||
cinfo = {
|
cinfo = {
|
||||||
"name": course['name'],
|
|
||||||
"repo": "",
|
|
||||||
"path": self.username + "/" + course['name'],
|
|
||||||
"teacher": self.username,
|
|
||||||
"assignments": course['assignments'],
|
|
||||||
"default_file": "",
|
|
||||||
"confirmed": course["confirmed"],
|
|
||||||
"unconfirmed": course['unconfirmed']
|
"unconfirmed": course['unconfirmed']
|
||||||
}
|
}
|
||||||
print(putDB(cinfo, course['url']))
|
print(cinfo)
|
||||||
|
patchDB(cinfo, "http://localhost:8000/api/classes/" + course['name'] + "/")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
#Student should have confirmed on their endd, but class had not been updated yet
|
#Student should have confirmed on their endd, but class had not been updated yet
|
||||||
|
@ -378,16 +346,10 @@ class Teacher:
|
||||||
course['unconfirmed']= course['unconfirmed'].replace(student['ion_user']+",", "")
|
course['unconfirmed']= course['unconfirmed'].replace(student['ion_user']+",", "")
|
||||||
|
|
||||||
cinfo = {
|
cinfo = {
|
||||||
"name": course['name'],
|
|
||||||
"repo": "",
|
|
||||||
"path": course['path'],
|
|
||||||
"teacher": self.username,
|
|
||||||
"assignments": course['assignments'],
|
|
||||||
"default_file": "",
|
|
||||||
"confirmed": course["confirmed"],
|
"confirmed": course["confirmed"],
|
||||||
"unconfirmed": course['unconfirmed']
|
"unconfirmed": course['unconfirmed']
|
||||||
}
|
}
|
||||||
print(putDB(cinfo, course['url']))
|
print(patchDB(cinfo, "http://localhost:8000/api/classes/" + course['name'] + "/"))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
#goes through list of studennts, tries to add, then request, return unconfirmed students
|
#goes through list of studennts, tries to add, then request, return unconfirmed students
|
||||||
|
@ -405,10 +367,10 @@ class Teacher:
|
||||||
parts = path.split("/")
|
parts = path.split("/")
|
||||||
aname = parts[len(parts)-1]
|
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.")
|
print("Not valid path.")
|
||||||
return False
|
return False
|
||||||
if((parts[1] in self.sclass) == False):
|
if((parts[1] in str(self.classes)) == False):
|
||||||
print("Not in valid class directory")
|
print("Not in valid class directory")
|
||||||
return False
|
return False
|
||||||
#parts of assignment name (Essay1, APLit)
|
#parts of assignment name (Essay1, APLit)
|
||||||
|
@ -433,7 +395,7 @@ class Teacher:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
course = getDB("http://127.0.0.1:8000/api/classes/" + course)
|
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.")
|
print("Assignment name already taken.")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -447,7 +409,7 @@ class Teacher:
|
||||||
slist = os.listdir(os.getcwd() + "/" + self.username + "/Students/" + course['name'])
|
slist = os.listdir(os.getcwd() + "/" + self.username + "/Students/" + course['name'])
|
||||||
cdir = os.getcwd()
|
cdir = os.getcwd()
|
||||||
for st in slist:
|
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)
|
spath = os.path.join(os.getcwd() + "/" + self.username + "/Students/" + course['name'], st)
|
||||||
if(os.path.exists(spath + "/" + aname) == False):
|
if(os.path.exists(spath + "/" + aname) == False):
|
||||||
os.mkdir(spath + "/" + aname)
|
os.mkdir(spath + "/" + aname)
|
||||||
|
@ -475,21 +437,14 @@ class Teacher:
|
||||||
}
|
}
|
||||||
postDB(ass, 'http://127.0.0.1:8000/api/assignments/')
|
postDB(ass, 'http://127.0.0.1:8000/api/assignments/')
|
||||||
if(course['assignments'] == ""):
|
if(course['assignments'] == ""):
|
||||||
course['assignments'] = aname
|
course['assignments'] = ass
|
||||||
else:
|
else:
|
||||||
course['assignments'] = course['assignments'] + "," + aname
|
course['assignments'] = course['assignments'].append(ass)
|
||||||
|
|
||||||
cinfo = {
|
cinfo = {
|
||||||
"name": course['name'],
|
|
||||||
"repo": "",
|
|
||||||
"path": course['path'],
|
|
||||||
"teacher": "eharris1",
|
|
||||||
"assignments": course['assignments'],
|
"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
|
return True
|
||||||
else:
|
else:
|
||||||
print("Assignment already addedd")
|
print("Assignment already addedd")
|
||||||
|
@ -498,18 +453,22 @@ class Teacher:
|
||||||
#try to avoid
|
#try to avoid
|
||||||
#copy modified assignments to student directories
|
#copy modified assignments to student directories
|
||||||
def updateAssignment(self, path, course, due):
|
def updateAssignment(self, path, course, due):
|
||||||
|
parts = path.split("/")
|
||||||
|
aname = parts[len(parts)-1]
|
||||||
if(os.path.isdir(path) == False):
|
if(os.path.isdir(path) == False):
|
||||||
print(path + " is not an assignment.")
|
print(path + " is not an assignment.")
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
if(due != None or due == ""):
|
if(due != None or due == ""):
|
||||||
datetime.strptime(due, '%Y-%m-%d %H:%M:%S.%f')
|
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:
|
except:
|
||||||
print("Due-date format is incorrect")
|
print("Due-date is the same")
|
||||||
return
|
|
||||||
input()
|
input()
|
||||||
parts = path.split("/")
|
|
||||||
aname = parts[len(parts)-1]
|
|
||||||
course = getDB("http://127.0.0.1:8000/api/classes/" + course)
|
course = getDB("http://127.0.0.1:8000/api/classes/" + course)
|
||||||
slist = os.listdir(os.getcwd() + "/" + self.username + "/Students/" + course['name'])
|
slist = os.listdir(os.getcwd() + "/" + self.username + "/Students/" + course['name'])
|
||||||
cdir = os.getcwd()
|
cdir = os.getcwd()
|
||||||
|
@ -642,12 +601,12 @@ class Teacher:
|
||||||
|
|
||||||
data = getTeacher("eharris1")
|
data = getTeacher("eharris1")
|
||||||
t = Teacher(data)
|
t = Teacher(data)
|
||||||
# t.makeClass("APLit_eharris1")
|
#t.addClass("eharris1/APLit_eharris1")
|
||||||
#t.addAssignment("eharris1/APLit_eharris1/Lab3_APLit_eharris1", "APLit_eharris1", '2020-08-11 16:58:33.383124')
|
#t.addAssignment("eharris1/APLit_eharris1/Essay1_eharris1", "APLit_eharris1", '2020-08-11 16:58:33.383124')
|
||||||
#ar = ['2022rkhondak','2022inafi','2023rumareti']
|
#ar = ['2022rkhondak','2022inafi','2023rumareti']
|
||||||
#extra = t.reqAddStudentList(ar, "APLit_eharris1")
|
#extra = t.reqAddStudentList(ar, "APLit_eharris1")
|
||||||
#print(extra)
|
#print(extra)
|
||||||
# t.getStudents('2022rkhondak')
|
t.reqStudent('2022rkhondak', 'APLit_eharris1')
|
||||||
# t.getChanges('2022rkhondak','APLit_eharris1', 10)
|
# t.getChanges('2022rkhondak','APLit_eharris1', 10)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -6,7 +6,7 @@ import secrets
|
||||||
|
|
||||||
class Student(models.Model):
|
class Student(models.Model):
|
||||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||||
ion_user = models.CharField(max_length=100)
|
ion_user = models.CharField(max_length=100, primary_key=True)
|
||||||
grade = models.IntegerField(default=0, blank=True)
|
grade = models.IntegerField(default=0, blank=True)
|
||||||
git=models.CharField(default="", max_length=100, blank=True)
|
git=models.CharField(default="", max_length=100, blank=True)
|
||||||
repo=models.URLField(default="", blank=True)
|
repo=models.URLField(default="", blank=True)
|
||||||
|
@ -20,12 +20,28 @@ class Student(models.Model):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.user.username}'s Profile"
|
return f"{self.user.username}'s Profile"
|
||||||
|
|
||||||
|
class Assignment(models.Model):
|
||||||
|
owner = models.ForeignKey('auth.User', related_name='assignments', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
name=models.CharField(max_length=100, primary_key=True)
|
||||||
|
due_date=models.DateTimeField()
|
||||||
|
# files = models.ManyToManyField(DefFiles)
|
||||||
|
files=models.CharField(max_length=100, default="", blank=True)
|
||||||
|
path=models.CharField(max_length=100)
|
||||||
|
classes=models.CharField(max_length=100)
|
||||||
|
teacher=models.CharField(max_length=100)
|
||||||
|
def __str__(self):
|
||||||
|
return '%s' % (self.name)
|
||||||
|
|
||||||
class Class(models.Model):
|
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)
|
name = models.CharField(primary_key=True, max_length=100)
|
||||||
id = models.CharField(max_length=8, blank=True, null=True)
|
id = models.CharField(max_length=8, blank=True, null=True)
|
||||||
description = models.CharField(default="Class Description", max_length=500)
|
description = models.CharField(default="Class Description", max_length=500)
|
||||||
repo=models.URLField(default="", blank=True)
|
repo=models.URLField(default="", blank=True)
|
||||||
path=models.CharField(blank=True, max_length=100, default="")
|
path=models.CharField(max_length=100, default="")
|
||||||
|
assignments=models.ManyToManyField(Assignment, blank=True)
|
||||||
default_file=models.CharField(max_length=100, default="", blank=True)
|
default_file=models.CharField(max_length=100, default="", blank=True)
|
||||||
confirmed=models.ManyToManyField(Student, blank=True, related_name='confirmed')
|
confirmed=models.ManyToManyField(Student, blank=True, related_name='confirmed')
|
||||||
unconfirmed=models.ManyToManyField(Student, blank=True, related_name='unconfirmed')
|
unconfirmed=models.ManyToManyField(Student, blank=True, related_name='unconfirmed')
|
||||||
|
@ -48,13 +64,12 @@ class Teacher(models.Model):
|
||||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||||
classes=models.ManyToManyField(Class, blank=True, related_name='classes')
|
classes=models.ManyToManyField(Class, blank=True, related_name='classes')
|
||||||
git=models.CharField(max_length=100, default="", blank=True)
|
git=models.CharField(max_length=100, default="", blank=True)
|
||||||
ion_user=models.CharField(primary_key=True, blank=True, max_length=100)
|
ion_user=models.CharField(primary_key=True, max_length=100)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.user.username}'s Profile"
|
return f"{self.user.username}'s Profile"
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
self.ion_user = self.user.username
|
|
||||||
super(Teacher, self).save(*args, **kwargs)
|
super(Teacher, self).save(*args, **kwargs)
|
||||||
|
|
||||||
# class Student(models.Model):
|
# class Student(models.Model):
|
||||||
|
@ -68,19 +83,6 @@ class Teacher(models.Model):
|
||||||
# completed=models.TextField(default="", blank=True)
|
# completed=models.TextField(default="", blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Assignment(models.Model):
|
|
||||||
myClass = models.ForeignKey(Class, related_name='assignments', on_delete=models.CASCADE)
|
|
||||||
name=models.CharField(max_length=100, primary_key=True)
|
|
||||||
due_date=models.DateTimeField()
|
|
||||||
# files = models.ManyToManyField(DefFiles)
|
|
||||||
files=models.CharField(max_length=100, default="", blank=True)
|
|
||||||
path=models.CharField(max_length=100, blank=True)
|
|
||||||
def __str__(self):
|
|
||||||
return f'{self.name}'
|
|
||||||
|
|
||||||
|
|
||||||
class DefFiles(models.Model):
|
class DefFiles(models.Model):
|
||||||
name=models.CharField(max_length=100)
|
name=models.CharField(max_length=100)
|
||||||
path=models.CharField(max_length=100)
|
path=models.CharField(max_length=100)
|
||||||
|
|
|
@ -25,18 +25,18 @@ class AssignmentSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Assignment
|
model = Assignment
|
||||||
# fields = ['url','name', 'due_date', 'path' , "Class","teacher",'owner']
|
# fields = ['url','name', 'due_date', 'path' , "Class","teacher",'owner']
|
||||||
fields = ['name', 'due_date', 'path' , "Class","teacher",'owner']
|
fields = ['name', 'due_date', 'path' ,"teacher",'owner']
|
||||||
|
|
||||||
class ClassSerializer(serializers.HyperlinkedModelSerializer):
|
class ClassSerializer(serializers.ModelSerializer):
|
||||||
# assignments = AssignmentSerializer(many=True, read_only=True,allow_null=True)
|
# assignments = AssignmentSerializer(many=True, read_only=True,allow_null=True)
|
||||||
# default_file=DefFilesSerializer(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:
|
class Meta:
|
||||||
model = Class
|
model = Class
|
||||||
# fields = ['url','name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner']
|
# fields = ['url','name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner']
|
||||||
fields = ['name', 'repo','path','assignments',"default_file", 'confirmed', 'unconfirmed']
|
fields = ['name', 'repo','path','assignments',"teacher","default_file", 'confirmed', 'unconfirmed','owner']
|
||||||
|
|
||||||
class StudentSerializer(serializers.HyperlinkedModelSerializer):
|
class StudentSerializer(serializers.ModelSerializer):
|
||||||
# Class = ClassSerializer(many=True, read_only=True,allow_null=True)
|
# Class = ClassSerializer(many=True, read_only=True,allow_null=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Student
|
model = Student
|
||||||
|
@ -44,7 +44,7 @@ class StudentSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
fields = ['url','grade', 'ion_user','git','user','classes','added_to','completed', 'repo']
|
fields = ['url','grade', 'ion_user','git','user','classes','added_to','completed', 'repo']
|
||||||
|
|
||||||
class TeacherSerializer(serializers.ModelSerializer):
|
class TeacherSerializer(serializers.ModelSerializer):
|
||||||
# Class = ClassSerializer(many=True, read_only=True,allow_null=True)
|
#classes = ClassSerializer(many=True, read_only=True,allow_null=True)
|
||||||
#owner = serializers.ReadOnlyField(source='owner.username')
|
#owner = serializers.ReadOnlyField(source='owner.username')
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Teacher
|
model = Teacher
|
||||||
|
|
|
@ -24,8 +24,6 @@ class StudentViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Student.objects.all()
|
queryset = Student.objects.all()
|
||||||
serializer_class = StudentSerializer
|
serializer_class = StudentSerializer
|
||||||
permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
|
permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
|
||||||
g, created = Group.objects.get_or_create(name='teachers')
|
|
||||||
|
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
serializer.save(user=self.request.user)
|
serializer.save(user=self.request.user)
|
||||||
|
|
|
@ -2,6 +2,7 @@ import time
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import pyinotify
|
import pyinotify
|
||||||
|
import checker
|
||||||
|
|
||||||
|
|
||||||
class EventHandler(pyinotify.ProcessEvent):
|
class EventHandler(pyinotify.ProcessEvent):
|
||||||
|
@ -77,18 +78,24 @@ class EventHandler(pyinotify.ProcessEvent):
|
||||||
|
|
||||||
NOTIFIER = None
|
NOTIFIER = None
|
||||||
STDOUT = sys.stdout
|
STDOUT = sys.stdout
|
||||||
|
DIR = None
|
||||||
|
START_TIME = None
|
||||||
|
|
||||||
|
|
||||||
def watch_dir(watched_dir="/tmp", logdir="/tmp/skooloslogs"):
|
def watch_dir(watched_dir="/tmp", logdir="/tmp/skooloslogs"):
|
||||||
|
global DIR
|
||||||
|
global START_TIME
|
||||||
|
global NOTIFIER
|
||||||
|
DIR = watched_dir
|
||||||
if not os.path.exists(logdir):
|
if not os.path.exists(logdir):
|
||||||
os.makedirs(logdir)
|
os.makedirs(logdir)
|
||||||
logfile = open(
|
logfile = open(
|
||||||
logdir + "/skoolos_" +
|
logdir + "/skoolos_" +
|
||||||
time.strftime("%m%d%Y-%H%M%S", time.localtime()), 'w')
|
time.strftime("%m%d%Y-%H%M%S", time.localtime()), 'w')
|
||||||
sys.stdout = logfile
|
sys.stdout = logfile
|
||||||
|
START_TIME = time.time()
|
||||||
print("Start time: " +
|
print("Start time: " +
|
||||||
time.strftime("%A, %B %d, %Y %H:%M:%S", time.localtime()) + "\n\n")
|
time.strftime("%A, %B %d, %Y %H:%M:%S", time.localtime()) + "\n\n")
|
||||||
global NOTIFIER
|
|
||||||
wm = pyinotify.WatchManager()
|
wm = pyinotify.WatchManager()
|
||||||
mask = pyinotify.IN_CREATE | pyinotify.IN_CLOSE_WRITE | pyinotify.IN_DELETE | \
|
mask = pyinotify.IN_CREATE | pyinotify.IN_CLOSE_WRITE | pyinotify.IN_DELETE | \
|
||||||
pyinotify.IN_MOVED_TO | pyinotify.IN_MOVED_FROM | pyinotify.IN_OPEN
|
pyinotify.IN_MOVED_TO | pyinotify.IN_MOVED_FROM | pyinotify.IN_OPEN
|
||||||
|
@ -99,7 +106,17 @@ def watch_dir(watched_dir="/tmp", logdir="/tmp/skooloslogs"):
|
||||||
|
|
||||||
def stop_watching():
|
def stop_watching():
|
||||||
NOTIFIER.stop()
|
NOTIFIER.stop()
|
||||||
|
now = time.time()
|
||||||
print("End time: " +
|
print("End time: " +
|
||||||
time.strftime("%A, %B %d, %Y %H:%M:%S", time.localtime()))
|
time.strftime("%A, %B %d, %Y %H:%M:%S", time.localtime()))
|
||||||
|
print("\nTotal work time: " +
|
||||||
|
time.strftime("%H:%M:%S", time.gmtime(now - START_TIME)))
|
||||||
|
suspicious_files = checker.file_check(DIR)
|
||||||
|
if suspicious_files != []:
|
||||||
|
print(
|
||||||
|
"\n\n--------------------------------------------------\n\n\n" +
|
||||||
|
"WARNING: One or more file did not have file extensions that are acceptable.\n"
|
||||||
|
+ "The paths to these files are listed below:\n")
|
||||||
|
print(*suspicious_files, sep='\n')
|
||||||
sys.stdout = STDOUT
|
sys.stdout = STDOUT
|
||||||
print("Done watching.\n")
|
print("Done watching.\n")
|
||||||
|
|
100
bgservice/checker.py
Normal file
100
bgservice/checker.py
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
import os
|
||||||
|
from glob import glob
|
||||||
|
|
||||||
|
file_whitelist = [
|
||||||
|
# text and document files
|
||||||
|
".doc",
|
||||||
|
".docx",
|
||||||
|
".odt",
|
||||||
|
".pdf",
|
||||||
|
".rtf",
|
||||||
|
".tex",
|
||||||
|
".txt",
|
||||||
|
".wpd",
|
||||||
|
# video files
|
||||||
|
".3g2",
|
||||||
|
".3gp",
|
||||||
|
".avi",
|
||||||
|
".flv",
|
||||||
|
".h264",
|
||||||
|
".m4v",
|
||||||
|
".mkv",
|
||||||
|
".mov",
|
||||||
|
".mp4",
|
||||||
|
".mpg",
|
||||||
|
".mpeg",
|
||||||
|
".rm",
|
||||||
|
".swf",
|
||||||
|
".vob",
|
||||||
|
".wmv",
|
||||||
|
# spreadsheet files
|
||||||
|
".ods",
|
||||||
|
".xls",
|
||||||
|
".xlsm",
|
||||||
|
".xlsx",
|
||||||
|
".csv",
|
||||||
|
# programming files
|
||||||
|
".c",
|
||||||
|
".class",
|
||||||
|
".cpp",
|
||||||
|
".cs",
|
||||||
|
".go",
|
||||||
|
".h",
|
||||||
|
".java",
|
||||||
|
".pl",
|
||||||
|
".sh",
|
||||||
|
".swift",
|
||||||
|
".vb",
|
||||||
|
# presentation files
|
||||||
|
".key",
|
||||||
|
".odp",
|
||||||
|
".pps",
|
||||||
|
".ppt",
|
||||||
|
".pptx",
|
||||||
|
# image files
|
||||||
|
".ai",
|
||||||
|
".bmp",
|
||||||
|
".gif",
|
||||||
|
".ico",
|
||||||
|
".jpeg",
|
||||||
|
".jpg",
|
||||||
|
".png",
|
||||||
|
".ps",
|
||||||
|
".psd",
|
||||||
|
".svg",
|
||||||
|
".tif",
|
||||||
|
".tiff",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def shell_check():
|
||||||
|
bash_history = [
|
||||||
|
line.strip()
|
||||||
|
for line in open(os.path.expanduser("~/.bash_history"), 'r')
|
||||||
|
]
|
||||||
|
zsh_history = [
|
||||||
|
line.strip() for line in open(os.path.expanduser("~/.histfile"), 'r')
|
||||||
|
]
|
||||||
|
report = "Suspicios commands found:\n"
|
||||||
|
for i in bash_history + zsh_history:
|
||||||
|
if "git" in i:
|
||||||
|
report += i + "\n"
|
||||||
|
if report != "Suspicios commands found:\n":
|
||||||
|
return report
|
||||||
|
return "Nothing suspicious found in bash or zsh history."
|
||||||
|
|
||||||
|
|
||||||
|
def verify_file(file_):
|
||||||
|
for ext in file_whitelist:
|
||||||
|
if file_[len(file_) - len(ext):] == ext:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def file_check(dir_):
|
||||||
|
files = glob(dir_ + "/**/*", recursive=True)
|
||||||
|
suspicious_files = []
|
||||||
|
for file_ in files:
|
||||||
|
if not verify_file(file_):
|
||||||
|
suspicious_files.append(file_)
|
||||||
|
return suspicious_files
|
0
eharris1/APLit_eharris1/README.md
Normal file
0
eharris1/APLit_eharris1/README.md
Normal file
|
@ -23,6 +23,7 @@ lazy-object-proxy==1.4.3
|
||||||
mccabe==0.6.1
|
mccabe==0.6.1
|
||||||
meson==0.53.2
|
meson==0.53.2
|
||||||
msgpack==0.6.2
|
msgpack==0.6.2
|
||||||
|
numpy==1.18.5
|
||||||
oauthlib==3.1.0
|
oauthlib==3.1.0
|
||||||
ordered-set==3.1.1
|
ordered-set==3.1.1
|
||||||
packaging==20.1
|
packaging==20.1
|
||||||
|
@ -59,3 +60,4 @@ webencodings==0.5.1
|
||||||
Werkzeug==1.0.1
|
Werkzeug==1.0.1
|
||||||
wpgtk==6.1.3
|
wpgtk==6.1.3
|
||||||
wrapt==1.12.1
|
wrapt==1.12.1
|
||||||
|
yapf==0.30.0
|
||||||
|
|
|
@ -40,7 +40,7 @@ def main():
|
||||||
URL = "http://127.0.0.1:8000/api/"
|
URL = "http://127.0.0.1:8000/api/"
|
||||||
r = requests.get(url = URL)
|
r = requests.get(url = URL)
|
||||||
except:
|
except:
|
||||||
print("Stop any processes running on http://127.0.0.1:8000/ before continuing")
|
print("Run Django server on http://127.0.0.1:8000/ before continuing")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
input("Welcome to SkoolOS. Press any key to create an account")
|
input("Welcome to SkoolOS. Press any key to create an account")
|
||||||
|
|
17
snew.py
17
snew.py
|
@ -84,16 +84,17 @@ class Students:
|
||||||
|
|
||||||
# c = Class.objects.get(name='Math5')
|
# c = Class.objects.get(name='Math5')
|
||||||
data = requests.get(url = "http://localhost:8000/api/classes/Math5", auth=('raffukhondaker','hackgroup1')).json()
|
data = requests.get(url = "http://localhost:8000/api/classes/Math5", auth=('raffukhondaker','hackgroup1')).json()
|
||||||
c = Class(
|
|
||||||
name="data['name']"
|
r = requests.post(url = "http://localhost:8000/api/classes/", data={'name':'English11', 'teacher':'eharris1', 'owner':2}, auth=('raffukhondaker','hackgroup1'))
|
||||||
)
|
|
||||||
# print("POST:" + str(r.status_code))
|
print("POST:" + str(r.json()))
|
||||||
# print(r.json())
|
# print(r.json())
|
||||||
c = {
|
# print(c.name)
|
||||||
'classes':"http://localhost:8000/api/classes/Math5/"
|
# c = {
|
||||||
}
|
# 'classes':c
|
||||||
|
# }
|
||||||
# print(c)
|
# print(c)
|
||||||
r = requests.patch(url = "http://localhost:8000/api/teachers/2/", data=c, auth=('raffukhondaker','hackgroup1'))
|
r = requests.patch(url = "http://localhost:8000/api/teachers/eharris1/", data={'classes':['English11']}, auth=('raffukhondaker','hackgroup1'))
|
||||||
print(r.json())
|
print(r.json())
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user