diff --git a/.profiles b/.profiles new file mode 100644 index 0000000..544f6b1 --- /dev/null +++ b/.profiles @@ -0,0 +1 @@ +{"username": "2022rkhondak", "grade": 10, "is_student": true, "password": "hackgroup1"} \ No newline at end of file diff --git a/CLI/student.py b/CLI/student.py index daec0d5..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)) @@ -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): diff --git a/Website/api/maker.py b/Website/api/maker.py index 0f0b07f..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( diff --git a/Website/api/migrations/0001_initial.py b/Website/api/migrations/0001_initial.py deleted file mode 100644 index 1a81ffb..0000000 --- a/Website/api/migrations/0001_initial.py +++ /dev/null @@ -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)), - ], - ), - ] diff --git a/Website/api/models.py b/Website/api/models.py index cd29952..65545d2 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -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) + diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 9b55700..2e6b2b8 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -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'] diff --git a/Website/api/views.py b/Website/api/views.py index 11af2b1..65de23f 100644 --- a/Website/api/views.py +++ b/Website/api/views.py @@ -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): diff --git a/Website/users/views.py b/Website/users/views.py index 929415c..ce417d8 100644 --- a/Website/users/views.py +++ b/Website/users/views.py @@ -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() diff --git a/skoolos.py b/skoolos.py index 1cfb9e3..bec621e 100644 --- a/skoolos.py +++ b/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')) diff --git a/snew.py b/snew.py new file mode 100644 index 0000000..b48f7ec --- /dev/null +++ b/snew.py @@ -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()) + +