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
044a767bab
1
.profiles
Normal file
1
.profiles
Normal file
|
@ -0,0 +1 @@
|
|||
{"username": "2022rkhondak", "grade": 10, "is_student": true, "password": "hackgroup1"}
|
|
@ -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))
|
||||
|
@ -129,17 +134,9 @@ class Student:
|
|||
os.chdir(cdir)
|
||||
self.repo = 'https://github.com/' + self.git + '/' + self.username + '.git'
|
||||
data={
|
||||
'user':self.user,
|
||||
'git':self.git,
|
||||
'ion_user':self.username,
|
||||
'added_to':self.snew,
|
||||
'url':self.url,
|
||||
'classes':self.sclass,
|
||||
'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):
|
||||
|
@ -163,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)
|
||||
|
@ -279,17 +276,10 @@ class Student:
|
|||
#update teacher instance in db, classes field
|
||||
data={
|
||||
'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,
|
||||
'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):
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -1,85 +0,0 @@
|
|||
# Generated by Django 3.0.7 on 2020-06-15 21:54
|
||||
|
||||
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='Class',
|
||||
fields=[
|
||||
('name', models.CharField(max_length=100, primary_key=True, serialize=False)),
|
||||
('description', models.CharField(default='Class Description', max_length=500)),
|
||||
('repo', models.URLField(blank=True, default='')),
|
||||
('path', models.CharField(default='', max_length=100)),
|
||||
('assignments', models.TextField(blank=True, default='')),
|
||||
('default_file', models.CharField(blank=True, default='', max_length=100)),
|
||||
],
|
||||
),
|
||||
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=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('ion_user', models.CharField(max_length=100)),
|
||||
('git', models.CharField(blank=True, default='', max_length=100)),
|
||||
('classes', models.ManyToManyField(blank=True, related_name='classes', to='api.Class')),
|
||||
('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')),
|
||||
('ion_user', models.CharField(max_length=100)),
|
||||
('grade', models.IntegerField(blank=True, default=0)),
|
||||
('git', models.CharField(blank=True, default='', max_length=100)),
|
||||
('repo', models.URLField(blank=True, default='')),
|
||||
('classes', models.CharField(blank=True, default='', max_length=100)),
|
||||
('added_to', models.CharField(blank=True, default='', max_length=100)),
|
||||
('completed', models.TextField(blank=True, default='')),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='class',
|
||||
name='confirmed',
|
||||
field=models.ManyToManyField(blank=True, related_name='confirmed', to='api.Student'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='class',
|
||||
name='unconfirmed',
|
||||
field=models.ManyToManyField(blank=True, related_name='unconfirmed', to='api.Student'),
|
||||
),
|
||||
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)),
|
||||
],
|
||||
),
|
||||
]
|
|
@ -13,6 +13,7 @@ class Student(models.Model):
|
|||
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)
|
||||
ion_user=models.CharField(primary_key=True, max_length=100)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
super(Student, self).save(*args, **kwargs)
|
||||
|
@ -47,10 +48,9 @@ class Class(models.Model):
|
|||
|
||||
class Teacher(models.Model):
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||
ion_user = models.CharField(max_length=100)
|
||||
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)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.user.username}'s Profile"
|
||||
|
@ -58,6 +58,16 @@ class Teacher(models.Model):
|
|||
def save(self, *args, **kwargs):
|
||||
super(Teacher, self).save(*args, **kwargs)
|
||||
|
||||
# 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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -30,23 +30,23 @@ class AssignmentSerializer(serializers.HyperlinkedModelSerializer):
|
|||
class ClassSerializer(serializers.HyperlinkedModelSerializer):
|
||||
# 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 = 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',"default_file", 'confirmed', 'unconfirmed']
|
||||
|
||||
class StudentSerializer(serializers.HyperlinkedModelSerializer):
|
||||
# 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','Class','added_to','completed', 'repo','owner']
|
||||
fields = ['url','grade', 'ion_user','git','user','Class','added_to','completed', 'repo']
|
||||
fields = ['url','grade', 'ion_user','git','user','classes','added_to','completed', 'repo']
|
||||
|
||||
class TeacherSerializer(serializers.ModelSerializer):
|
||||
# Class = ClassSerializer(many=True, read_only=True,allow_null=True)
|
||||
owner = serializers.ReadOnlyField(source='owner.username')
|
||||
#owner = serializers.ReadOnlyField(source='owner.username')
|
||||
class Meta:
|
||||
model = Teacher
|
||||
# fields = ['url','first_name', 'last_name','git','ion_user', 'email','Class','owner']
|
||||
fields = ['first_name', 'last_name','git','ion_user', 'email','Class','owner']
|
||||
fields = ['git','ion_user','classes','user']
|
||||
|
|
|
@ -8,7 +8,7 @@ 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):
|
||||
|
@ -24,9 +24,11 @@ class StudentViewSet(viewsets.ModelViewSet):
|
|||
queryset = Student.objects.all()
|
||||
serializer_class = StudentSerializer
|
||||
permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
|
||||
g, created = Group.objects.get_or_create(name='teachers')
|
||||
|
||||
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(owner=self.request.user)
|
||||
serializer.save(user=self.request.user)
|
||||
|
||||
class TeacherViewSet(viewsets.ModelViewSet):
|
||||
"""
|
||||
|
@ -37,7 +39,7 @@ class TeacherViewSet(viewsets.ModelViewSet):
|
|||
permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
|
||||
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(owner=self.request.user)
|
||||
serializer.save(user=self.request.user)
|
||||
|
||||
class ClassViewSet(viewsets.ModelViewSet):
|
||||
"""
|
||||
|
@ -47,12 +49,12 @@ class ClassViewSet(viewsets.ModelViewSet):
|
|||
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):
|
||||
|
|
|
@ -8,6 +8,7 @@ from django.contrib import messages
|
|||
|
||||
from .models import Token
|
||||
from api.models import Student, Teacher
|
||||
from django.contrib.auth.models import Group
|
||||
|
||||
from .forms import UserCreationForm
|
||||
|
||||
|
@ -97,12 +98,15 @@ def create_account (request):
|
|||
last_name=last_name,
|
||||
password=password)
|
||||
user.save()
|
||||
|
||||
g, created = Group.objects.get_or_create(name='teachers')
|
||||
|
||||
if isStudent:
|
||||
profile = Student(user=user, git=git, grade=grade, ion_user=username)
|
||||
else:
|
||||
profile = Teacher(user=user, git=git, ion_user=usernam)
|
||||
profile = Teacher(user=user, git=git, ion_user=username)
|
||||
group = Group.objects.get(name='teachers')
|
||||
user.groups.add(group)
|
||||
|
||||
|
||||
profile.save()
|
||||
token.delete()
|
||||
|
|
108
skoolos.py
108
skoolos.py
|
@ -12,6 +12,7 @@ from werkzeug.urls import url_decode
|
|||
import pprint
|
||||
from PyInquirer import prompt, print_json
|
||||
import json
|
||||
import datetime
|
||||
import os
|
||||
import argparse
|
||||
import webbrowser
|
||||
|
@ -65,66 +66,91 @@ def studentCLI(user, password):
|
|||
from CLI import student
|
||||
data = getUser(user, password)
|
||||
student = student.Student(data)
|
||||
choices = ['1) View Class','2) Exit SkoolOS']
|
||||
questions = [
|
||||
carray = student.sclass.split(",")
|
||||
if(len(carray) == 1 and carray[0] == ""):
|
||||
print("No classes")
|
||||
return
|
||||
|
||||
carray.append("Exit SkoolOS")
|
||||
courses = [
|
||||
{
|
||||
'type': 'list',
|
||||
'name': 'choice',
|
||||
'choices':choices,
|
||||
'name': 'course',
|
||||
'choices':carray,
|
||||
'message': 'Select class: ',
|
||||
},
|
||||
]
|
||||
choice = prompt(questions)
|
||||
choice = int(choice['choice'].split(")")[0])
|
||||
if(choice == 1):
|
||||
carray = student.sclass.split(",")
|
||||
if(len(carray) == 1 and carray[0] == ""):
|
||||
print("No classes")
|
||||
return
|
||||
courses = [
|
||||
{
|
||||
'type': 'list',
|
||||
'name': 'course',
|
||||
'choices':carray,
|
||||
'message': 'Select class: ',
|
||||
},
|
||||
]
|
||||
course = prompt(courses)
|
||||
if(choice == 2):
|
||||
course = prompt(courses)
|
||||
if course == "Exit SkoolOS":
|
||||
student.exitCLI()
|
||||
|
||||
else:
|
||||
student.viewClass(course)
|
||||
student.getAssignments(course, datetime.datetime.now())
|
||||
|
||||
def teacherCLI(user, password):
|
||||
from CLI import teacher
|
||||
data = getUser(user, password)
|
||||
teacher = teacher.Teacher(data)
|
||||
choices = ['1) View Class','2) Exit SkoolOS']
|
||||
questions = [
|
||||
# 1. make a class
|
||||
# 2. add studeents to an existing class
|
||||
# 3. Get progress logs on a student
|
||||
# 2. make an assignment for a class
|
||||
# 3. view student submissions for an assignment
|
||||
carray = teacher.sclass.split(",")
|
||||
carray.remove("")
|
||||
carray.append("Exit SkoolOS")
|
||||
carray.append("Make New Class")
|
||||
courses = [
|
||||
{
|
||||
'type': 'list',
|
||||
'name': 'choice',
|
||||
'choices':choices,
|
||||
'name': 'course',
|
||||
'choices':carray,
|
||||
'message': 'Select class: ',
|
||||
},
|
||||
]
|
||||
choice = prompt(questions)
|
||||
choice = int(choice['choice'].split(")")[0])
|
||||
if(choice == 1):
|
||||
carray = student.sclass.split(",")
|
||||
if(len(carray) == 1 and carray[0] == ""):
|
||||
print("No classes")
|
||||
return
|
||||
courses = [
|
||||
course = prompt(courses)
|
||||
if course == "Exit SkoolOS":
|
||||
teacher.exitCLI()
|
||||
if course == "Make New Class":
|
||||
questions = [
|
||||
{
|
||||
'type': 'input',
|
||||
'name': 'cname',
|
||||
'message': 'Class Name: ',
|
||||
},
|
||||
]
|
||||
cname = prompt(questions)
|
||||
teacher.makeClass(cname)
|
||||
soption = ["1) Add individual student", "2) Add list of students through path", "3) Exit"]
|
||||
questions = [
|
||||
{
|
||||
'type': 'list',
|
||||
'choices':soption,
|
||||
'name': 'students',
|
||||
'message': 'Add list of students (input path): ',
|
||||
},
|
||||
]
|
||||
choice = prompt(questions).split(")")
|
||||
if("1" == choice):
|
||||
s = input("Student name: ")
|
||||
teacher.addStudent(s, cname)
|
||||
if("2" == choice):
|
||||
p = input("Relativee Path: ")
|
||||
if(os.path.exists(p)):
|
||||
print(p + " does not exist.")
|
||||
|
||||
else:
|
||||
print("Class: " + cname)
|
||||
options = ['1) Add student', "2) Add assignment", "3) View student information"]
|
||||
questions = [
|
||||
{
|
||||
'type': 'list',
|
||||
'name': 'course',
|
||||
'choices':carray,
|
||||
'message': 'Select class: ',
|
||||
'choices':options,
|
||||
'message': 'Select option: ',
|
||||
},
|
||||
]
|
||||
course = prompt(courses)
|
||||
if(choice == 2):
|
||||
student.exitCLI()
|
||||
option = prompt(questions)
|
||||
|
||||
def getUser(ion_user, password):
|
||||
URL = "http://127.0.0.1:8000/api/students/" + ion_user + "/"
|
||||
|
@ -141,6 +167,10 @@ def getUser(ion_user, password):
|
|||
else:
|
||||
return None
|
||||
print(r.status_code)
|
||||
def patchDB(data, url):
|
||||
r = requests.patch(url = url, data=data, auth=('raffukhondaker','hackgroup1'))
|
||||
print("PATH:" + str(r.status_code))
|
||||
return(r.json())
|
||||
|
||||
def getDB(url):
|
||||
r = requests.get(url = url, auth=('raffukhondaker','hackgroup1'))
|
||||
|
|
99
snew.py
Normal file
99
snew.py
Normal file
|
@ -0,0 +1,99 @@
|
|||
import sys
|
||||
from urllib.parse import urlparse
|
||||
import requests
|
||||
from requests_oauthlib import OAuth2Session
|
||||
from selenium import webdriver
|
||||
import os.path
|
||||
import time
|
||||
import http.server
|
||||
import socketserver
|
||||
from threading import Thread
|
||||
from werkzeug.urls import url_decode
|
||||
import pprint
|
||||
from PyInquirer import prompt, print_json
|
||||
import json
|
||||
import os
|
||||
import argparse
|
||||
import webbrowser
|
||||
import subprocess
|
||||
|
||||
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 *
|
||||
|
||||
def command(command):
|
||||
ar = []
|
||||
command = command.split(" ")
|
||||
for c in command:
|
||||
ar.append(c)
|
||||
process = subprocess.Popen(ar, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||
p=process.poll()
|
||||
output = process.communicate()[0]
|
||||
print(output.decode('utf-8'))
|
||||
return output.decode('utf-8')
|
||||
|
||||
class Students:
|
||||
def __init__(self, username):
|
||||
self.student = Student.objects.get(ion_user = username)
|
||||
#ion id: student.user
|
||||
if(os.path.isdir(self.student.user) == False):
|
||||
if(self.student.repo == ""):
|
||||
user= self.student.git
|
||||
pwd= input("Enter Github password: ")
|
||||
#curl -i -u USER:PASSWORD -d '{"name":"REPO"}' https://api.github.com/user/repos
|
||||
url= "curl -i -u " + user + ":" + pwd + " -d '" + '{"name":"' + self.username + '"}' + "' " + "https://api.github.com/user/repos"
|
||||
print(url)
|
||||
os.system(url)
|
||||
cdir = os.getcwd()
|
||||
command('git clone https://github.com/' + self.git + '/' + self.username + '.git')
|
||||
os.chdir(self.username)
|
||||
command('git checkout master')
|
||||
command('touch README.md')
|
||||
command('git add README.md')
|
||||
command('git commit -m "Hello"')
|
||||
command('git push -u origin master')
|
||||
os.chdir(cdir)
|
||||
self.repo = 'https://github.com/' + self.git + '/' + self.username + '.git'
|
||||
data={
|
||||
'user':self.user,
|
||||
'git':self.git,
|
||||
'ion_user':self.username,
|
||||
'added_to':self.snew,
|
||||
'url':self.url,
|
||||
'classes':self.sclass,
|
||||
'grade':self.grade,
|
||||
'completed':self.completed,
|
||||
'repo':self.repo
|
||||
}
|
||||
print(putDB(data, self.url))
|
||||
print("Synced to " + self.username)
|
||||
|
||||
|
||||
# c = {
|
||||
# 'name':'Math5'
|
||||
# }
|
||||
|
||||
# c = Class.objects.get(name='Math5')
|
||||
data = requests.get(url = "http://localhost:8000/api/classes/Math5", auth=('raffukhondaker','hackgroup1')).json()
|
||||
c = Class(
|
||||
name="data['name']"
|
||||
)
|
||||
# print("POST:" + str(r.status_code))
|
||||
# print(r.json())
|
||||
c = {
|
||||
'classes':"http://localhost:8000/api/classes/Math5/"
|
||||
}
|
||||
# print(c)
|
||||
r = requests.patch(url = "http://localhost:8000/api/teachers/2/", data=c, auth=('raffukhondaker','hackgroup1'))
|
||||
print(r.json())
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user