Merge branch 'development' of github.com:Rushilwiz/SkoolOS into development

This commit is contained in:
Nathaniel Kenschaft 2020-06-14 23:12:01 -04:00
commit 5fe9863677
24 changed files with 324 additions and 365 deletions

View File

@ -66,15 +66,12 @@ class Student:
def __init__(self, data): def __init__(self, data):
# teacher info already stored in API # teacher info already stored in API
# intitialze fields after GET request # intitialze fields after GET request
self.first_name=data['first_name']
self.last_name=data['last_name']
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/students/" + self.username + "/" self.url= "http://127.0.0.1:8000/api/students/" + self.username + "/"
self.email = data['email']
self.grade = data['grade'] self.grade = data['grade']
self.student_id=data['student_id']
self.completed = data['completed'] self.completed = data['completed']
self.user = data['user']
#classes in id form (Example: 4,5) #classes in id form (Example: 4,5)
#storing actual classes #storing actual classes
cid=data['classes'].split(",") cid=data['classes'].split(",")
@ -132,15 +129,12 @@ class Student:
os.chdir(cdir) os.chdir(cdir)
self.repo = 'https://github.com/' + self.git + '/' + self.username + '.git' self.repo = 'https://github.com/' + self.git + '/' + self.username + '.git'
data={ data={
'first_name':self.first_name, 'user':self.user,
'last_name':self.last_name,
'git':self.git, 'git':self.git,
'ion_user':self.username, 'ion_user':self.username,
'student_id':self.student_id,
'added_to':self.snew, 'added_to':self.snew,
'url':self.url, 'url':self.url,
'classes':self.sclass, 'classes':self.sclass,
'email':self.email,
'grade':self.grade, 'grade':self.grade,
'completed':self.completed, 'completed':self.completed,
'repo':self.repo 'repo':self.repo
@ -284,15 +278,13 @@ class Student:
#update teacher instance in db, classes field #update teacher instance in db, classes field
data={ data={
'first_name':self.first_name, 'user':self.user,
'last_name':self.last_name,
'git':self.git, 'git':self.git,
'ion_user':self.username, 'ion_user':self.username,
'student_id':self.student_id, 'student_id':self.student_id,
'added_to':self.snew, 'added_to':self.snew,
'url':self.url, 'url':self.url,
'classes':self.sclass, 'classes':self.sclass,
'email':self.email,
'grade':self.grade, 'grade':self.grade,
'completed':self.completed 'completed':self.completed
} }
@ -327,15 +319,13 @@ class Student:
command("git push -u origin " + self.username + " --tags") command("git push -u origin " + self.username + " --tags")
self.completed = self.completed + "," + parts[1] + "/" + parts[2] self.completed = self.completed + "," + parts[1] + "/" + parts[2]
data={ data={
'first_name':self.first_name, 'user':self.user,
'last_name':self.last_name,
'git':self.git, 'git':self.git,
'ion_user':self.username, 'ion_user':self.username,
'student_id':self.student_id, 'student_id':self.student_id,
'added_to':self.snew, 'added_to':self.snew,
'url':self.url, 'url':self.url,
'classes':self.sclass, 'classes':self.sclass,
'email':self.email,
'grade':self.grade, 'grade':self.grade,
'completed':self.completed 'completed':self.completed
} }

View File

@ -2,7 +2,7 @@ from django.contrib import admin
from .models import ( from .models import (
DefFiles, DefFiles,
Assignment, Assignment,
Classes, Class,
Teacher, Teacher,
Student Student
) )
@ -13,4 +13,4 @@ admin.site.register(Teacher)
admin.site.register(Student) admin.site.register(Student)
admin.site.register(DefFiles) admin.site.register(DefFiles)
admin.site.register(Assignment) admin.site.register(Assignment)
admin.site.register(Classes) admin.site.register(Class)

View File

@ -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 # from datetime import datetime
# #
# f1 = DefFiles( # f1 = DefFiles(
@ -76,8 +76,8 @@
# A3.files.add(f4) # A3.files.add(f4)
# A3.save() # A3.save()
# #
# #classes # #Class
# math = Classes( # math = Class(
# name='Math5', # name='Math5',
# #
# ) # )
@ -86,7 +86,7 @@
# math.assignments.add(A2) # math.assignments.add(A2)
# math.save() # math.save()
# #
# english = Classes( # english = Class(
# name='English', # name='English',
# ) # )
# english.save() # english.save()
@ -104,8 +104,8 @@
# repo="https://github.com/therealraffi/2022rkhondak.git", # repo="https://github.com/therealraffi/2022rkhondak.git",
# ) # )
# raffu.save() # raffu.save()
# raffu.classes.add(math) # raffu.Class.add(math)
# raffu.classes.add(english) # raffu.Class.add(english)
# raffu.save() # raffu.save()
# #
# #teachers # #teachers
@ -115,7 +115,7 @@
# ion_user="eharris1" # ion_user="eharris1"
# ) # )
# ng.save() # ng.save()
# ng.classes.add(math) # ng.Class.add(math)
# ng.save() # ng.save()
# #
# chao = Teacher( # chao = Teacher(
@ -124,5 +124,5 @@
# ion_user="AKBailey" # ion_user="AKBailey"
# ) # )
# chao.save() # chao.save()
# chao.classes.add(english) # chao.Class.add(english)
# chao.save() # chao.save()

View File

@ -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.conf import settings
from django.db import migrations, models from django.db import migrations, models
@ -14,6 +14,19 @@ class Migration(migrations.Migration):
] ]
operations = [ 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( migrations.CreateModel(
name='DefFiles', name='DefFiles',
fields=[ fields=[
@ -28,13 +41,9 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='Teacher', name='Teacher',
fields=[ fields=[
('created', models.DateTimeField(auto_now_add=True)), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=100)), ('git', models.CharField(blank=True, default='', max_length=100)),
('last_name', models.CharField(max_length=100)), ('classes', models.ManyToManyField(to='api.Class')),
('classes', models.CharField(blank=True, default='', max_length=100)),
('ion_user', models.CharField(max_length=100, primary_key=True, serialize=False)),
('git', models.CharField(max_length=100)),
('email', models.CharField(blank=True, default='', max_length=100)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('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', name='Student',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('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)), ('grade', models.IntegerField(blank=True, default=0)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('git', models.CharField(blank=True, default='', max_length=100)),
],
),
migrations.CreateModel(
name='Classes',
fields=[
('name', models.CharField(max_length=100, primary_key=True, serialize=False)),
('repo', models.URLField(blank=True, default='')), ('repo', models.URLField(blank=True, default='')),
('path', models.CharField(default='', max_length=100)), ('classes', models.CharField(blank=True, default='', max_length=100)),
('teacher', models.CharField(default='', max_length=100)), ('added_to', models.CharField(blank=True, default='', max_length=100)),
('assignments', models.TextField(blank=True, default='')), ('completed', models.TextField(blank=True, default='')),
('default_file', models.CharField(blank=True, default='', max_length=100)),
('confirmed', models.TextField(blank=True, default='')),
('unconfirmed', models.TextField(blank=True, default='')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
], ],
), ),

View File

@ -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),
),
]

View 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'),
),
]

View File

@ -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),
),
]

View 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'),
),
]

View File

@ -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),
),
]

View 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'),
),
]

View 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,
),
]

View File

@ -1,52 +1,7 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User 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): class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE)
@ -62,3 +17,67 @@ 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 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)

View File

@ -13,7 +13,7 @@ class IsOwnerOrReadOnly(permissions.BasePermission):
return True return True
# Write permissions are only allowed to the owner of the snippet. # 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): class isTeacher(permissions.BasePermission):
#only teachers can make classes and assignmenst #only teachers can make classes and assignmenst

View File

@ -5,8 +5,8 @@ from django.contrib.auth.models import User
from .permissions import IsOwnerOrReadOnly,isTeacher from .permissions import IsOwnerOrReadOnly,isTeacher
class UserSerializer(serializers.HyperlinkedModelSerializer): class UserSerializer(serializers.HyperlinkedModelSerializer):
students = serializers.PrimaryKeyRelatedField(many=True, queryset=Student.objects.all()) # students = serializers.PrimaryKeyRelatedField(many=True, queryset=Student.objects.all())
teachers = serializers.PrimaryKeyRelatedField(many=True, queryset=Teacher.objects.all()) # teachers = serializers.PrimaryKeyRelatedField(many=True, queryset=Teacher.objects.all())
class Meta: class Meta:
model = User model = User
@ -38,11 +38,10 @@ class ClassesSerializer(serializers.HyperlinkedModelSerializer):
class StudentSerializer(serializers.HyperlinkedModelSerializer): class StudentSerializer(serializers.HyperlinkedModelSerializer):
# classes = ClassesSerializer(many=True, read_only=True,allow_null=True) # classes = ClassesSerializer(many=True, read_only=True,allow_null=True)
owner = serializers.ReadOnlyField(source='owner.username')
class Meta: class Meta:
model = Student model = Student
# fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner'] # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','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): class TeacherSerializer(serializers.ModelSerializer):
# classes = ClassesSerializer(many=True, read_only=True,allow_null=True) # classes = ClassesSerializer(many=True, read_only=True,allow_null=True)

View File

@ -9,8 +9,8 @@ urlpatterns = [
path('teachers/<str:pk>/', views.TeacherDetail.as_view()), path('teachers/<str:pk>/', views.TeacherDetail.as_view()),
path('assignments/', views.AssignmentList.as_view()), path('assignments/', views.AssignmentList.as_view()),
path('assignments/<str:pk>/', views.AssignmentDetail.as_view()), path('assignments/<str:pk>/', views.AssignmentDetail.as_view()),
path('classes/', views.ClassesList.as_view()), path('classes/', views.ClassList.as_view()),
path('classes/<str:pk>/', views.ClassesDetail.as_view()), path('classes/<str:pk>/', views.ClassDetail.as_view()),
] ]
urlpatterns = format_suffix_patterns(urlpatterns) urlpatterns = format_suffix_patterns(urlpatterns)

View File

@ -1,5 +1,5 @@
from .models import Student, Teacher, Classes, Assignment, DefFiles from .models import Student, Teacher, Class, Assignment, DefFiles
from .serializers import StudentSerializer, TeacherSerializer, ClassesSerializer, AssignmentSerializer, UserSerializer from .serializers import StudentSerializer, TeacherSerializer, ClassSerializer, AssignmentSerializer, UserSerializer
from rest_framework import generics, viewsets, permissions, response, status from rest_framework import generics, viewsets, permissions, response, status
from django.http import Http404 from django.http import Http404
from rest_framework.views import APIView from rest_framework.views import APIView
@ -14,7 +14,7 @@ from rest_framework.response import Response
class UserViewSet(viewsets.ModelViewSet): class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all() queryset = User.objects.all()
serializer_class = UserSerializer serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated] permission_Class = [permissions.IsAuthenticated]
class StudentViewSet(viewsets.ModelViewSet): class StudentViewSet(viewsets.ModelViewSet):
@ -23,7 +23,7 @@ class StudentViewSet(viewsets.ModelViewSet):
""" """
queryset = Student.objects.all() queryset = Student.objects.all()
serializer_class = StudentSerializer serializer_class = StudentSerializer
permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
def perform_create(self, serializer): def perform_create(self, serializer):
serializer.save(owner=self.request.user) serializer.save(owner=self.request.user)
@ -34,18 +34,18 @@ class TeacherViewSet(viewsets.ModelViewSet):
""" """
queryset = Teacher.objects.all() queryset = Teacher.objects.all()
serializer_class = TeacherSerializer serializer_class = TeacherSerializer
permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
def perform_create(self, serializer): def perform_create(self, serializer):
serializer.save(owner=self.request.user) serializer.save(owner=self.request.user)
class ClassesViewSet(viewsets.ModelViewSet): class ClassViewSet(viewsets.ModelViewSet):
""" """
API endpoint that allows users to be viewed or edited. API endpoint that allows users to be viewed or edited.
""" """
queryset = Classes.objects.all() queryset = Class.objects.all()
serializer_class = ClassesSerializer serializer_class = ClassSerializer
permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly]
def perform_create(self, serializer): def perform_create(self, serializer):
if(self.request.user.groups.filter(name__in=['teachers']).exists() or self.request.user.is_superuser): 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() queryset = Assignment.objects.all()
serializer_class = AssignmentSerializer serializer_class = AssignmentSerializer
permission_classes = [permissions.IsAuthenticated, isTeacher, IsOwnerOrReadOnly] permission_Class = [permissions.IsAuthenticated, isTeacher, IsOwnerOrReadOnly]
def perform_create(self, serializer): def perform_create(self, serializer):
if(self.request.user.groups.filter(name__in=['teachers']).exists() or self.request.user.is_superuser): 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() # queryset = DefFiles.objects.all()
# serializer_class = DefFilesSerializer # serializer_class = DefFilesSerializer
# permissions_classes = [permissions.IsAuthenticatedOrReadOnly] # permissions_Class = [permissions.IsAuthenticatedOrReadOnly]

View File

@ -9,7 +9,7 @@ router = routers.DefaultRouter()
router.register(r'students', api_views.StudentViewSet) router.register(r'students', api_views.StudentViewSet)
router.register(r'teachers', api_views.TeacherViewSet) router.register(r'teachers', api_views.TeacherViewSet)
router.register(r'assignments', api_views.AssignmentViewSet) 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'files', api_views.DefFilesViewSet)
router.register(r'users', api_views.UserViewSet) router.register(r'users', api_views.UserViewSet)

View File

@ -13,22 +13,20 @@ body {
color: #333333; color: #333333;
margin-top: 5rem; margin-top: 5rem;
font-family: 'Segoe UI'; font-family: 'Segoe UI';
margin-left: 2.5rem;
margin-right: 2.5rem;
} }
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
color: #444444; color: #444444;
} }
ul {
margin: 0;
}
.bg-steel { .bg-steel {
background: #3cba54; background: #3cba54;
} }
.site-header .navbar-nav .nav-link { .site-header .navbar-nav .nav-link {
color: #cbd5db; color: #e1e1e1;
} }
.site-header .navbar-nav .nav-link:hover { .site-header .navbar-nav .nav-link:hover {
@ -38,63 +36,3 @@ ul {
.site-header .navbar-nav .nav-link.active { .site-header .navbar-nav .nav-link.active {
font-weight: 500; 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -21,8 +21,8 @@
<nav class="navbar navbar-expand-md navbar-dark bg-steel fixed-top"> <nav class="navbar navbar-expand-md navbar-dark bg-steel fixed-top">
<div class="container"> <div class="container">
<a class="navbar-brand" href="#"> <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=""> <img src="{% static 'skoolos/tj_trans.png' %}" width="30" height="30" class="d-inline-block align-top" alt="">
Bootstrap SkoolOS
</a> </a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggle" aria-controls="navbarToggle" aria-expanded="false" aria-label="Toggle navigation"> <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> <span class="navbar-toggler-icon"></span>

View File

@ -1,3 +1,15 @@
{% extends "skoolos/base.html" %} {% extends "skoolos/base.html" %}
{% block content %} {% 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 %} {% endblock content %}

View File

@ -1,10 +1,24 @@
from django.shortcuts import render from django.shortcuts import render
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from api.models import Student, Teacher
# Create your views here. # Create your views here.
@login_required() @login_required()
def home (request): 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") return render(request, "skoolos/home.html")
@login_required() @login_required()

View File

@ -100,9 +100,9 @@ def create_account (request):
token.delete() token.delete()
if isStudent: if isStudent:
profile = Student(user=user, git=git, grade=grade) profile = Student(owner=user, git=git, grade=grade, ion_user=username)
else: else:
profile = Teacher(user=user, git=git) profile = Teacher(owner=user, git=git, ion_user=username)
profile.save() profile.save()
@ -145,4 +145,4 @@ def create_account (request):
def logout(request): def logout(request):
auth_logout(request) auth_logout(request)
messages.success(request, "You've been logged out!") messages.success(request, "You've been logged out!")
return redirect(request, "/login") return redirect("/login")

View File

@ -35,50 +35,71 @@ def main():
print("") print("")
if not os.path.exists(".profile"): if not os.path.exists(".profile"):
# try: try:
# 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)
# print("Stop any processes running on http://127.0.0.1:8000/ before continuing") except:
# except: print("Stop any processes running on http://127.0.0.1:8000/ before continuing")
# pass 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")
#webbrowser.open("http://127.0.0.1:8000/login", new=2) #webbrowser.open("http://127.0.0.1:8000/login", new=2)
authenticate() authenticate()
# else: else:
# try: f = open('.profile','r')
# URL = "http://127.0.0.1:8000/api/" data = json.loads(f.read())
# f = open('.profile','r') f.close()
# data = json.loads(f.read()) PWD = data['password']
# f.close() USER = data['username']
# PWD = data['password'] print(data['username'])
# USER = data['username'] if(data['is_student']):
# r = requests.get(url = URL, auth=(USER,PWD)) studentCLI(USER, PWD)
# except: else:
# print("Incorrect password.") teacherCLI()
# sys.exit(0)
# if(data['is_student']):
# studentCLI()
# else:
# teacherCLI()
# while True: # while True:
# pass # pass
def studentCLI(): def studentCLI(user, password):
from CLI import student from CLI import student
data = getStudent(USER) data = getStudent(user, password)
print(data)
student = student.Student(data) 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(): def teacherCLI():
from CLI.teacher import Teacher from CLI.teacher import Teacher
print("fail") print("fail")
def getStudent(ion_user): def getStudent(ion_user, password):
URL = "http://127.0.0.1:8000/api/students/" + ion_user + "/" 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): if(r.status_code == 200):
data = r.json() data = r.json()
return data return data
@ -210,55 +231,40 @@ def authenticate():
pwd = data['pwd'] pwd = data['pwd']
user = data['username'] user = data['username']
print(r.status_code) 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 is_student = False
if(r.status_code == 200): if(r.status_code == 200):
is_student = True is_student = True
print("Welcome, student " + user) print("Welcome, student " + user)
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,
'grade':grade,
'is_student':is_student,
'password':pwd,
}
profileFile = open(".profile", "w")
profileFile.write(json.dumps(profile))
profileFile.close()
else: else:
print("Welcome, teacher " + user) print("Welcome, teacher " + user)
r = requests.get(url = "http://localhost:8000/api/teachers/" + user + "/", auth=(user,pwd))
#print(code) profile = r.json()
print(state) username = profile['ion_user']
grade = profile['grade']
payload = {'grant_type': 'authorization_code', 'code': code, 'redirect_uri': redirect_uri, 'client_id': client_id, profile = {
'client_secret': client_secret, 'csrfmiddlewaretoken': state} 'username':username,
token = requests.post("https://ion.tjhsst.edu/oauth/token/", data=payload).json() 'grade':grade,
#print(token) 'is_student':is_student,
headers = {'Authorization': f"Bearer {token['access_token']}"} 'password':pwd,
}
# And finally get the user's profile! profileFile = open(".profile", "w")
profile = requests.get("https://ion.tjhsst.edu/api/profile", headers=headers).json() profileFile.write(json.dumps(profile))
profileFile.close()
#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
profile = {
'username':username,
'email':email,
'first_name':first_name,
'last_name':last_name,
'is_student':is_student,
'password':password,
}
os.chdir(cdir)
profileFile = open(".profile", "w")
profileFile.write(json.dumps(profile))
profileFile.close()
#try to make password
password = makePass()
profile['password'] = password
profileFile = open(".profile", "w")
profileFile.write(json.dumps(profile))
profileFile.close()
sys.exit sys.exit