mirror of
https://github.com/Rushilwiz/SkoolOS.git
synced 2025-04-16 02:10:19 -04:00
Merge branch 'development' of github.com:Rushilwiz/SkoolOS into development
This commit is contained in:
commit
5fe9863677
|
@ -66,15 +66,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,15 +129,12 @@ 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,
|
||||
'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,
|
||||
'repo':self.repo
|
||||
|
@ -284,15 +278,13 @@ class Student:
|
|||
|
||||
#update teacher instance in db, classes field
|
||||
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
|
||||
}
|
||||
|
@ -327,15 +319,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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -30,7 +30,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 +76,8 @@
|
|||
# A3.files.add(f4)
|
||||
# A3.save()
|
||||
#
|
||||
# #classes
|
||||
# math = Classes(
|
||||
# #Class
|
||||
# math = Class(
|
||||
# name='Math5',
|
||||
#
|
||||
# )
|
||||
|
@ -86,7 +86,7 @@
|
|||
# math.assignments.add(A2)
|
||||
# math.save()
|
||||
#
|
||||
# english = Classes(
|
||||
# english = Class(
|
||||
# name='English',
|
||||
# )
|
||||
# english.save()
|
||||
|
@ -104,8 +104,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 +115,7 @@
|
|||
# ion_user="eharris1"
|
||||
# )
|
||||
# ng.save()
|
||||
# ng.classes.add(math)
|
||||
# ng.Class.add(math)
|
||||
# ng.save()
|
||||
#
|
||||
# chao = Teacher(
|
||||
|
@ -124,5 +124,5 @@
|
|||
# ion_user="AKBailey"
|
||||
# )
|
||||
# chao.save()
|
||||
# chao.classes.add(english)
|
||||
# chao.Class.add(english)
|
||||
# chao.save()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Generated by Django 3.0.7 on 2020-06-14 19:14
|
||||
# Generated by Django 3.0.7 on 2020-06-14 23:00
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
@ -14,6 +14,19 @@ class Migration(migrations.Migration):
|
|||
]
|
||||
|
||||
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)),
|
||||
('confirmed', models.TextField(blank=True, default='')),
|
||||
('unconfirmed', models.TextField(blank=True, default='')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DefFiles',
|
||||
fields=[
|
||||
|
@ -28,13 +41,9 @@ class Migration(migrations.Migration):
|
|||
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)),
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('git', models.CharField(blank=True, default='', max_length=100)),
|
||||
('classes', models.ManyToManyField(to='api.Class')),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
|
@ -42,21 +51,12 @@ class Migration(migrations.Migration):
|
|||
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)),
|
||||
('grade', models.IntegerField(blank=True, default=0)),
|
||||
('git', models.CharField(blank=True, default='', max_length=100)),
|
||||
('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='')),
|
||||
('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)),
|
||||
],
|
||||
),
|
||||
|
|
|
@ -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),
|
||||
),
|
||||
]
|
31
Website/api/migrations/0002_auto_20200615_0046.py
Normal file
31
Website/api/migrations/0002_auto_20200615_0046.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Generated by Django 3.0.7 on 2020-06-15 00:46
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('api', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='class',
|
||||
name='confirmed',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='class',
|
||||
name='confirmed',
|
||||
field=models.ManyToManyField(blank=True, related_name='confirmed', to='api.Student'),
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='class',
|
||||
name='unconfirmed',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='class',
|
||||
name='unconfirmed',
|
||||
field=models.ManyToManyField(blank=True, related_name='unconfirmed', to='api.Student'),
|
||||
),
|
||||
]
|
|
@ -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),
|
||||
),
|
||||
]
|
18
Website/api/migrations/0003_auto_20200615_0233.py
Normal file
18
Website/api/migrations/0003_auto_20200615_0233.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 3.0.7 on 2020-06-15 02:33
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('api', '0002_auto_20200615_0046'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='teacher',
|
||||
name='classes',
|
||||
field=models.ManyToManyField(blank=True, related_name='teacher', to='api.Class'),
|
||||
),
|
||||
]
|
|
@ -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),
|
||||
),
|
||||
]
|
22
Website/api/migrations/0004_auto_20200615_0255.py
Normal file
22
Website/api/migrations/0004_auto_20200615_0255.py
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Generated by Django 3.0.7 on 2020-06-15 02:55
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('api', '0003_auto_20200615_0233'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='teacher',
|
||||
name='classes',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='class',
|
||||
name='teachers',
|
||||
field=models.ManyToManyField(blank=True, related_name='teachers', to='api.Teacher'),
|
||||
),
|
||||
]
|
23
Website/api/migrations/0005_auto_20200615_0048.py
Normal file
23
Website/api/migrations/0005_auto_20200615_0048.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Generated by Django 3.0.7 on 2020-06-15 00:48
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('api', '0004_auto_20200614_2107'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='student',
|
||||
name='id',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='student',
|
||||
name='ion_user',
|
||||
field=models.CharField(default='2022rkhondak', max_length=100, primary_key=True, serialize=False),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
|
@ -1,52 +1,7 @@
|
|||
from django.db import models
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
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 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 Classes(models.Model):
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||
|
||||
name = models.CharField(primary_key=True, max_length=100)
|
||||
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)
|
||||
default_file=models.CharField(max_length=100, default="", blank=True)
|
||||
confirmed=models.TextField(default="", blank=True)
|
||||
unconfirmed=models.TextField(default="", blank=True)
|
||||
|
||||
# assignments = models.ManyToManyField(Assignment, default="")
|
||||
# default_file = models.ManyToManyField(DefFiles)
|
||||
def save(self, *args, **kwargs):
|
||||
return super(Classes, self).save(*args, **kwargs)
|
||||
|
||||
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)
|
||||
ion_user=models.CharField(primary_key=True, max_length=100)
|
||||
git=models.CharField(max_length=100)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
super(Teacher, self).save(*args, **kwargs)
|
||||
|
||||
class Student(models.Model):
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||
|
@ -62,3 +17,67 @@ class Student(models.Model):
|
|||
|
||||
def __str__(self):
|
||||
return f"{self.user.username}'s Profile"
|
||||
|
||||
class Class(models.Model):
|
||||
name = models.CharField(primary_key=True, max_length=100)
|
||||
description = models.CharField(default="Class Description", max_length=500)
|
||||
repo=models.URLField(default="", blank=True)
|
||||
path=models.CharField(max_length=100, default="")
|
||||
assignments=models.TextField(default="", blank=True)
|
||||
default_file=models.CharField(max_length=100, 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(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(Class, blank=True, related_name='classes')
|
||||
git=models.CharField(max_length=100, default="", blank=True)
|
||||
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
|
||||
|
||||
|
||||
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 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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -5,8 +5,8 @@ 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
|
||||
|
@ -38,11 +38,10 @@ class ClassesSerializer(serializers.HyperlinkedModelSerializer):
|
|||
|
||||
class StudentSerializer(serializers.HyperlinkedModelSerializer):
|
||||
# classes = ClassesSerializer(many=True, read_only=True,allow_null=True)
|
||||
owner = serializers.ReadOnlyField(source='owner.username')
|
||||
class Meta:
|
||||
model = Student
|
||||
# fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner']
|
||||
fields = ['grade','email','student_id', 'git','ion_user','classes','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)
|
||||
|
|
|
@ -9,8 +9,8 @@ urlpatterns = [
|
|||
path('teachers/<str:pk>/', views.TeacherDetail.as_view()),
|
||||
path('assignments/', views.AssignmentList.as_view()),
|
||||
path('assignments/<str:pk>/', views.AssignmentDetail.as_view()),
|
||||
path('classes/', views.ClassesList.as_view()),
|
||||
path('classes/<str:pk>/', views.ClassesDetail.as_view()),
|
||||
path('classes/', views.ClassList.as_view()),
|
||||
path('classes/<str:pk>/', views.ClassDetail.as_view()),
|
||||
]
|
||||
|
||||
urlpatterns = format_suffix_patterns(urlpatterns)
|
|
@ -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
|
||||
|
@ -14,7 +14,7 @@ from rest_framework.response import Response
|
|||
class UserViewSet(viewsets.ModelViewSet):
|
||||
queryset = User.objects.all()
|
||||
serializer_class = UserSerializer
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
permission_Class = [permissions.IsAuthenticated]
|
||||
|
||||
|
||||
class StudentViewSet(viewsets.ModelViewSet):
|
||||
|
@ -23,7 +23,7 @@ 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)
|
||||
|
@ -34,18 +34,18 @@ 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)
|
||||
|
||||
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):
|
||||
|
@ -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]
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
@ -38,63 +36,3 @@ ul {
|
|||
.site-header .navbar-nav .nav-link.active {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.content-section {
|
||||
background: #ffffff;
|
||||
padding: 10px 20px;
|
||||
border: 1px solid #dddddd;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.article-title {
|
||||
color: #444444;
|
||||
}
|
||||
|
||||
a.article-title:hover {
|
||||
color: #428bca;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.article-content {
|
||||
white-space: pre-line;
|
||||
}
|
||||
|
||||
.article-img {
|
||||
height: 65px;
|
||||
width: 65px;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
.article-metadata {
|
||||
padding-bottom: 1px;
|
||||
margin-bottom: 4px;
|
||||
border-bottom: 1px solid #e3e3e3
|
||||
}
|
||||
|
||||
.article-metadata a:hover {
|
||||
color: #333;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.article-svg {
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.account-img {
|
||||
height: 125px;
|
||||
width: 125px;
|
||||
margin-right: 20px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.account-heading {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
.nounderline {
|
||||
text-decoration: none !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
|
BIN
Website/skoolos/static/skoolos/tj_trans.png
Normal file
BIN
Website/skoolos/static/skoolos/tj_trans.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
|
@ -21,8 +21,8 @@
|
|||
<nav class="navbar navbar-expand-md navbar-dark bg-steel fixed-top">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="#">
|
||||
<img src="/docs/4.3/assets/brand/bootstrap-solid.svg" width="30" height="30" class="d-inline-block align-top" alt="">
|
||||
Bootstrap
|
||||
<img src="{% static 'skoolos/tj_trans.png' %}" width="30" height="30" class="d-inline-block align-top" alt="">
|
||||
SkoolOS
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggle" aria-controls="navbarToggle" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
{% extends "skoolos/base.html" %}
|
||||
{% block content %}
|
||||
<div class="content-section">
|
||||
{% for class in classes %}
|
||||
<div class="card-columns">
|
||||
<a class="card" href="#" style="text-decoration: none;">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ class.name }}</h5>
|
||||
<p class="card-text">{{ class.description }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
|
|
@ -1,10 +1,24 @@
|
|||
from django.shortcuts import render
|
||||
from django.contrib.auth.decorators import login_required
|
||||
|
||||
from api.models import Student, Teacher
|
||||
|
||||
# Create your views here.
|
||||
|
||||
@login_required()
|
||||
def home (request):
|
||||
try:
|
||||
student = Student.objects.get(user=request.user)
|
||||
return render(request, "skoolos/home.html", {'classes': student.confirmed.all()})
|
||||
except Student.DoesNotExist:
|
||||
pass
|
||||
|
||||
try:
|
||||
teacher = Teacher.objects.get(user=request.user)
|
||||
return render(request, "skoolos/home.html", {'classes': teacher.classes})
|
||||
except Teacher.DoesNotExist:
|
||||
pass
|
||||
|
||||
return render(request, "skoolos/home.html")
|
||||
|
||||
@login_required()
|
||||
|
|
|
@ -100,9 +100,9 @@ def create_account (request):
|
|||
token.delete()
|
||||
|
||||
if isStudent:
|
||||
profile = Student(user=user, git=git, grade=grade)
|
||||
profile = Student(owner=user, git=git, grade=grade, ion_user=username)
|
||||
else:
|
||||
profile = Teacher(user=user, git=git)
|
||||
profile = Teacher(owner=user, git=git, ion_user=username)
|
||||
|
||||
profile.save()
|
||||
|
||||
|
@ -145,4 +145,4 @@ def create_account (request):
|
|||
def logout(request):
|
||||
auth_logout(request)
|
||||
messages.success(request, "You've been logged out!")
|
||||
return redirect(request, "/login")
|
||||
return redirect("/login")
|
||||
|
|
130
skoolos.py
130
skoolos.py
|
@ -35,50 +35,71 @@ def main():
|
|||
print("")
|
||||
|
||||
if not os.path.exists(".profile"):
|
||||
# try:
|
||||
# URL = "http://127.0.0.1:8000/api/"
|
||||
# r = requests.get(url = URL)
|
||||
# print("Stop any processes running on http://127.0.0.1:8000/ before continuing")
|
||||
# except:
|
||||
# pass
|
||||
try:
|
||||
URL = "http://127.0.0.1:8000/api/"
|
||||
r = requests.get(url = URL)
|
||||
except:
|
||||
print("Stop any processes running on http://127.0.0.1:8000/ before continuing")
|
||||
sys.exit(0)
|
||||
|
||||
input("Welcome to SkoolOS. Press any key to create an account")
|
||||
#webbrowser.open("http://127.0.0.1:8000/login", new=2)
|
||||
authenticate()
|
||||
# else:
|
||||
# try:
|
||||
# URL = "http://127.0.0.1:8000/api/"
|
||||
# f = open('.profile','r')
|
||||
# data = json.loads(f.read())
|
||||
# f.close()
|
||||
# PWD = data['password']
|
||||
# USER = data['username']
|
||||
# r = requests.get(url = URL, auth=(USER,PWD))
|
||||
# except:
|
||||
# print("Incorrect password.")
|
||||
# sys.exit(0)
|
||||
# if(data['is_student']):
|
||||
# studentCLI()
|
||||
# else:
|
||||
# teacherCLI()
|
||||
else:
|
||||
f = open('.profile','r')
|
||||
data = json.loads(f.read())
|
||||
f.close()
|
||||
PWD = data['password']
|
||||
USER = data['username']
|
||||
print(data['username'])
|
||||
if(data['is_student']):
|
||||
studentCLI(USER, PWD)
|
||||
else:
|
||||
teacherCLI()
|
||||
|
||||
|
||||
|
||||
# while True:
|
||||
# pass
|
||||
def studentCLI():
|
||||
def studentCLI(user, password):
|
||||
from CLI import student
|
||||
data = getStudent(USER)
|
||||
print(data)
|
||||
data = getStudent(user, password)
|
||||
student = student.Student(data)
|
||||
print(student)
|
||||
choices = ['1) View Class','2) Exit SkoolOS']
|
||||
questions = [
|
||||
{
|
||||
'type': 'list',
|
||||
'name': 'choice',
|
||||
'choices':choices,
|
||||
'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):
|
||||
student.exitCLI()
|
||||
|
||||
def teacherCLI():
|
||||
from CLI.teacher import Teacher
|
||||
print("fail")
|
||||
|
||||
def getStudent(ion_user):
|
||||
def getStudent(ion_user, password):
|
||||
URL = "http://127.0.0.1:8000/api/students/" + ion_user + "/"
|
||||
r = requests.get(url = URL, auth=('raffukhondaker','hackgroup1'))
|
||||
r = requests.get(url = URL, auth=(ion_user,password))
|
||||
if(r.status_code == 200):
|
||||
data = r.json()
|
||||
return data
|
||||
|
@ -210,52 +231,37 @@ def authenticate():
|
|||
pwd = data['pwd']
|
||||
user = data['username']
|
||||
print(r.status_code)
|
||||
r = requests.get(url = "http://localhost:8000/students/" + user + "/", auth=(user,pwd))
|
||||
r = requests.get(url = "http://localhost:8000/api/students/" + user + "/", auth=(user,pwd))
|
||||
is_student = False
|
||||
if(r.status_code == 200):
|
||||
is_student = True
|
||||
print("Welcome, student " + user)
|
||||
else:
|
||||
print("Welcome, teacher " + user)
|
||||
|
||||
#print(code)
|
||||
print(state)
|
||||
|
||||
payload = {'grant_type': 'authorization_code', 'code': code, 'redirect_uri': redirect_uri, 'client_id': client_id,
|
||||
'client_secret': client_secret, 'csrfmiddlewaretoken': state}
|
||||
token = requests.post("https://ion.tjhsst.edu/oauth/token/", data=payload).json()
|
||||
#print(token)
|
||||
headers = {'Authorization': f"Bearer {token['access_token']}"}
|
||||
|
||||
# And finally get the user's profile!
|
||||
profile = requests.get("https://ion.tjhsst.edu/api/profile", headers=headers).json()
|
||||
|
||||
#pprint.pprint(profile)
|
||||
username = profile['ion_username']
|
||||
email = profile['tj_email']
|
||||
first_name = profile['first_name']
|
||||
last_name = profile['last_name']
|
||||
is_student = profile['is_student']
|
||||
password = ""
|
||||
#password creation
|
||||
|
||||
r = requests.get(url = "http://localhost:8000/api/students/" + user + "/", auth=(user,pwd))
|
||||
profile = r.json()
|
||||
username = profile['ion_user']
|
||||
grade = profile['grade']
|
||||
profile = {
|
||||
'username':username,
|
||||
'email':email,
|
||||
'first_name':first_name,
|
||||
'last_name':last_name,
|
||||
'grade':grade,
|
||||
'is_student':is_student,
|
||||
'password':password,
|
||||
'password':pwd,
|
||||
}
|
||||
os.chdir(cdir)
|
||||
|
||||
profileFile = open(".profile", "w")
|
||||
profileFile.write(json.dumps(profile))
|
||||
profileFile.close()
|
||||
|
||||
#try to make password
|
||||
password = makePass()
|
||||
profile['password'] = password
|
||||
else:
|
||||
print("Welcome, teacher " + user)
|
||||
r = requests.get(url = "http://localhost:8000/api/teachers/" + user + "/", auth=(user,pwd))
|
||||
profile = r.json()
|
||||
username = profile['ion_user']
|
||||
grade = profile['grade']
|
||||
profile = {
|
||||
'username':username,
|
||||
'grade':grade,
|
||||
'is_student':is_student,
|
||||
'password':pwd,
|
||||
}
|
||||
profileFile = open(".profile", "w")
|
||||
profileFile.write(json.dumps(profile))
|
||||
profileFile.close()
|
||||
|
|
Loading…
Reference in New Issue
Block a user