diff --git a/.profile b/.profile deleted file mode 100644 index df779be..0000000 --- a/.profile +++ /dev/null @@ -1 +0,0 @@ -{'absences': 2, 'address': None, 'counselor': {'first_name': 'Sean', 'full_name': 'Sean Burke', 'id': 37, 'last_name': 'Burke', 'url': 'https://ion.tjhsst.edu/api/profile/37', 'user_type': 'counselor', 'username': 'SPBurke'}, 'display_name': 'Raffu Khondaker', 'emails': [], 'first_name': 'Raffu', 'full_name': 'Raffu Khondaker', 'grade': {'name': 'sophomore', 'number': 10}, 'graduation_year': 2022, 'id': 36508, 'ion_username': '2022rkhondak', 'is_announcements_admin': False, 'is_eighth_admin': False, 'is_student': True, 'is_teacher': False, 'last_name': 'Khondaker', 'middle_name': 'Al', 'nickname': '', 'phones': [], 'picture': 'https://ion.tjhsst.edu/api/profile/36508/picture', 'sex': 'Male', 'short_name': 'Raffu', 'title': None, 'tj_email': '2022rkhondak@tjhsst.edu', 'user_type': 'student', 'websites': []} \ No newline at end of file diff --git a/CLI/oauth/index.html b/CLI/oauth/index.html index 62f3082..1c8f1f3 100644 --- a/CLI/oauth/index.html +++ b/CLI/oauth/index.html @@ -14,7 +14,7 @@
- + Sign in with Ion diff --git a/CLI/skoolos.py b/CLI/skoolos.py index ccb30ef..e818d3a 100644 --- a/CLI/skoolos.py +++ b/CLI/skoolos.py @@ -52,7 +52,7 @@ def authenticate(): path = os.path.join(cdir, "chromedriver-mac") print(path) browser = webdriver.Chrome(path) - browser = webdriver.Safari() + #browser = webdriver.Safari() web_dir = os.path.join(os.path.dirname(__file__), 'oauth') os.chdir(web_dir) diff --git a/Website/api/migrations/0001_initial.py b/Website/api/migrations/0001_initial.py index 4d13567..37f2d7e 100644 --- a/Website/api/migrations/0001_initial.py +++ b/Website/api/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.7 on 2020-06-12 23:18 +# Generated by Django 3.0.7 on 2020-06-13 18:15 from django.conf import settings from django.db import migrations, models diff --git a/Website/api/models.py b/Website/api/models.py index 1dfd59a..5659835 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -64,9 +64,6 @@ 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) - + def save(self, *args, **kwargs): return super(Student, self).save(*args, **kwargs) - - - diff --git a/Website/api/permissions.py b/Website/api/permissions.py index 6aab8bf..2d64429 100644 --- a/Website/api/permissions.py +++ b/Website/api/permissions.py @@ -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 + return obj.owner == request.user or request.user.is_superuser class isTeacher(permissions.BasePermission): #only teachers can make classes and assignmenst @@ -22,4 +22,4 @@ class isTeacher(permissions.BasePermission): return True # Write permissions are only allowed to the owner of the snippet. - return obj.user.groups.filter(name__in=['teachers']).exists() + return request.user.groups.filter(name__in=['teachers']).exists() or request.user.is_superuser diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 97a9383..2b4bb54 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -2,15 +2,15 @@ from django.contrib.auth.models import User, Group from .models import Student, Teacher, Classes, Assignment, DefFiles from rest_framework import serializers, permissions 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()) - owner = serializers.ReadOnlyField(source='owner.username') - permission_classes = [permissions.IsAuthenticatedOrReadOnly] + teachers = serializers.PrimaryKeyRelatedField(many=True, queryset=Teacher.objects.all()) class Meta: model = User - fields = ['id', 'username', 'students'] + fields = ['id', 'username', 'students','teachers'] # class DefFilesSerializer(serializers.HyperlinkedModelSerializer): # class Meta: @@ -20,37 +20,36 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): class AssignmentSerializer(serializers.HyperlinkedModelSerializer): #permissions_classes = [permissions.IsAuthenticatedOrReadOnly] # files = DefFilesSerializer(many=True, read_only=True,allow_null=True) - permission_classes = [permissions.IsAuthenticatedOrReadOnly] owner = serializers.ReadOnlyField(source='owner.username') - permission_classes = [permissions.IsAuthenticatedOrReadOnly] class Meta: model = Assignment - fields = ['url','name', 'due_date', 'path' , "classes","teacher",'owner'] + # fields = ['url','name', 'due_date', 'path' , "classes","teacher",'owner'] + fields = ['name', 'due_date', 'path' , "classes","teacher",'owner'] class ClassesSerializer(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') - permission_classes = [permissions.IsAuthenticatedOrReadOnly] class Meta: model = Classes - fields = ['url', 'name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner'] + # fields = ['url','name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner'] + fields = ['name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner'] class StudentSerializer(serializers.HyperlinkedModelSerializer): # classes = ClassesSerializer(many=True, read_only=True,allow_null=True) owner = serializers.ReadOnlyField(source='owner.username') - permission_classes = [permissions.IsAuthenticatedOrReadOnly] class Meta: 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 = ['first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner'] class TeacherSerializer(serializers.ModelSerializer): # classes = ClassesSerializer(many=True, read_only=True,allow_null=True) owner = serializers.ReadOnlyField(source='owner.username') - permission_classes = [permissions.IsAuthenticatedOrReadOnly] class Meta: model = Teacher - fields = ['url', 'first_name', 'last_name','git','ion_user', 'email','classes','owner'] + # fields = ['url','first_name', 'last_name','git','ion_user', 'email','classes','owner'] + fields = ['first_name', 'last_name','git','ion_user', 'email','classes','owner'] diff --git a/Website/api/urls.py b/Website/api/urls.py index e69de29..f130d15 100644 --- a/Website/api/urls.py +++ b/Website/api/urls.py @@ -0,0 +1,16 @@ +from django.urls import path +from rest_framework.urlpatterns import format_suffix_patterns +from . import views + +urlpatterns = [ + path('students/', views.StudentList.as_view()), + path('students//', views.StudentDetail.as_view()), + path('teachers/', views.TeacherList.as_view()), + path('teachers//', views.TeacherDetail.as_view()), + path('assignments/', views.AssignmentList.as_view()), + path('assignments//', views.AssignmentDetail.as_view()), + path('classes/', views.ClassesList.as_view()), + path('classes//', views.ClassesDetail.as_view()), +] + +urlpatterns = format_suffix_patterns(urlpatterns) \ No newline at end of file diff --git a/Website/api/views-back.py b/Website/api/views-back.py index 5c936f9..011d81a 100644 --- a/Website/api/views-back.py +++ b/Website/api/views-back.py @@ -1,131 +1,89 @@ -# class StudentList(APIView): -# """ -# List all snippets, or create a new snippet. -# """ -# def get(self, request, format=None): -# snippets = Student.objects.all() -# serializer = StudentSerializer(snippets, many=True) -# return response.Response(serializer.data) +from .models import Student, Teacher, Classes, Assignment, DefFiles +from .serializers import StudentSerializer, TeacherSerializer, ClassesSerializer, AssignmentSerializer, UserSerializer +from rest_framework import generics, viewsets, permissions, response, status +from django.http import Http404 +from rest_framework.views import APIView +from django.contrib.auth.models import User +from .permissions import isTeacher, IsOwnerOrReadOnly +from django.shortcuts import render, redirect +from rest_framework.parsers import JSONParser +from django.http.response import JsonResponse +from rest_framework.response import Response +from rest_framework import mixins -# def post(self, request, format=None): -# serializer = StudentSerializer(data=request.data) -# if serializer.is_valid(): -# serializer.save() -# return response.Response(serializer.data, status=status.HTTP_201_CREATED) -# return response.Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) -# class StudentDetail(APIView): -# """ -# Retrieve, update or delete a snippet instance. -# """ -# def get_object(self, pk): -# try: -# return Student.objects.get(pk=pk) -# except Student.DoesNotExist: -# raise Http404 +class StudentList(generics.ListCreateAPIView): + queryset = Student.objects.all() + serializer_class = StudentSerializer + def perform_create(self, serializer): + serializer.save(owner=self.request.user) -# def get(self, request, pk, format=None): -# snippet = self.get_object(pk) -# serializer = StudentSerializer(snippet) -# return response.Response(serializer.data) +class StudentDetail(generics.RetrieveAPIView): + queryset = Student.objects.all() + serializer_class = StudentSerializer + permissions_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] -# def put(self, request, pk, format=None): -# snippet = self.get_object(pk) -# serializer = StudentSerializer(snippet, data=request.data) -# if serializer.is_valid(): -# serializer.save() -# return response.Response(serializer.data) -# return response.Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +class TeacherList(generics.ListCreateAPIView): + queryset = Teacher.objects.all() + serializer_class = TeacherSerializer + 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 delete(self, request, pk, format=None): -# snippet = self.get_object(pk) -# snippet.delete() -# return response.Response(status=status.HTTP_204_NO_CONTENT) +class TeacherDetail(generics.RetrieveAPIView): + queryset = Teacher.objects.all() + serializer_class = TeacherSerializer + permissions_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] -# class TeacherList(APIView): -# """ -# List all snippets, or create a new snippet. -# """ -# def get(self, request, format=None): -# snippets = Teacher.objects.all() -# serializer = TeacherSerializer(snippets, many=True) -# return response.Response(serializer.data) - -# def post(self, request, format=None): -# serializer = TeacherSerializer(data=request.data) -# if serializer.is_valid(): -# serializer.save() -# return response.Response(serializer.data, status=status.HTTP_201_CREATED) -# return response.Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -# class TeacherDetail(APIView): -# """ -# Retrieve, update or delete a snippet instance. -# """ -# def get_object(self, pk): -# try: -# return Teacher.objects.get(pk=pk) -# except Teacher.DoesNotExist: -# raise Http404 - -# def get(self, request, pk, format=None): -# snippet = self.get_object(pk) -# serializer = TeacherSerializer(snippet) -# return response.Response(serializer.data) - -# def put(self, request, pk, format=None): -# snippet = self.get_object(pk) -# serializer = TeacherSerializer(snippet, data=request.data) -# if serializer.is_valid(): -# serializer.save() -# return response.Response(serializer.data) -# return response.Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -# def delete(self, request, pk, format=None): -# snippet = self.get_object(pk) -# snippet.delete() -# return response.Response(status=status.HTTP_204_NO_CONTENT) -# class ClassesList(APIView): -# """ -# List all snippets, or create a new snippet. -# """ -# def get(self, request, format=None): -# snippets = Classes.objects.all() -# serializer = ClassesSerializer(snippets, many=True) -# return response.Response(serializer.data) +class ClassesList(generics.ListCreateAPIView): + queryset = Classes.objects.all() + serializer_class = ClassesSerializer + #permissions_classes = [isTeacher] + 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 post(self, request, format=None): -# serializer = ClassesSerializer(data=request.data) -# if serializer.is_valid(): -# serializer.save() -# return response.Response(serializer.data, status=status.HTTP_201_CREATED) -# return response.Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) +# class ClassesDetail(generics.RetrieveAPIView): +# queryset = Classes.objects.all() +# serializer_class = ClassesSerializer +# # permissions_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] -# class ClassesDetail(APIView): -# """ -# Retrieve, update or delete a snippet instance. -# """ -# def get_object(self, pk): -# try: -# return Classes.objects.get(pk=pk) -# except Classes.DoesNotExist: -# raise Http404 +class ClassesDetail(mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.DestroyModelMixin, + generics.GenericAPIView): + queryset = Classes.objects.all() + serializer_class = ClassesSerializer -# def get(self, request, pk, format=None): -# snippet = self.get_object(pk) -# serializer = ClassesSerializer(snippet) -# return response.Response(serializer.data) + def get(self, request, *args, **kwargs): + return self.retrieve(request, *args, **kwargs) -# def put(self, request, pk, format=None): -# snippet = self.get_object(pk) -# serializer = ClassesSerializer(snippet, data=request.data) -# if serializer.is_valid(): -# serializer.save() -# return response.Response(serializer.data) -# return response.Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + def put(self, request, *args, **kwargs): + print(self.owner) + if(request.user == self.owner): + return self.update(request, *args, **kwargs) -# def delete(self, request, pk, format=None): -# snippet = self.get_object(pk) -# snippet.delete() -# return response.Response(status=status.HTTP_204_NO_CONTENT) \ No newline at end of file + def delete(self, request, *args, **kwargs): + return self.destroy(request, *args, **kwargs) + +class AssignmentList(generics.ListCreateAPIView): + queryset = Assignment.objects.all() + serializer_class = AssignmentSerializer + 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 AssignmentDetail(generics.RetrieveAPIView): + queryset = Assignment.objects.all() + serializer_class = AssignmentSerializer + permissions_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] diff --git a/Website/api/views.py b/Website/api/views.py index a8bdb83..3876c0a 100644 --- a/Website/api/views.py +++ b/Website/api/views.py @@ -4,10 +4,17 @@ from rest_framework import generics, viewsets, permissions, response, status from django.http import Http404 from rest_framework.views import APIView from django.contrib.auth.models import User +from .permissions import isTeacher, IsOwnerOrReadOnly +from django.shortcuts import render, redirect +from rest_framework.parsers import JSONParser +from rest_framework.response import Response + + class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer + permission_classes = [permissions.IsAuthenticated] class StudentViewSet(viewsets.ModelViewSet): @@ -16,8 +23,10 @@ class StudentViewSet(viewsets.ModelViewSet): """ queryset = Student.objects.all() serializer_class = StudentSerializer - permissions_classes = [permissions.IsAuthenticatedOrReadOnly] + permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] + def perform_create(self, serializer): + serializer.save(owner=self.request.user) class TeacherViewSet(viewsets.ModelViewSet): """ @@ -25,8 +34,10 @@ class TeacherViewSet(viewsets.ModelViewSet): """ queryset = Teacher.objects.all() serializer_class = TeacherSerializer - permissions_classes = [permissions.IsAuthenticatedOrReadOnly] + permission_classes = [permissions.IsAuthenticated, IsOwnerOrReadOnly] + def perform_create(self, serializer): + serializer.save(owner=self.request.user) class ClassesViewSet(viewsets.ModelViewSet): """ @@ -34,7 +45,14 @@ class ClassesViewSet(viewsets.ModelViewSet): """ queryset = Classes.objects.all() serializer_class = ClassesSerializer - permissions_classes = [permissions.IsAuthenticatedOrReadOnly] + permission_classes = [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) class AssignmentViewSet(viewsets.ModelViewSet): @@ -43,7 +61,14 @@ class AssignmentViewSet(viewsets.ModelViewSet): """ queryset = Assignment.objects.all() serializer_class = AssignmentSerializer - permissions_classes = [permissions.IsAuthenticatedOrReadOnly] + permission_classes = [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): + serializer.save(owner=self.request.user) + else: + print("UNAUTHORIZED POST") + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # class DefFilesViewSet(viewsets.ModelViewSet): # """ diff --git a/CLI/.profile b/Website/config/__init__.py similarity index 100% rename from CLI/.profile rename to Website/config/__init__.py diff --git a/Website/skoolos/asgi.py b/Website/config/asgi.py similarity index 82% rename from Website/skoolos/asgi.py rename to Website/config/asgi.py index 9577b84..561756d 100644 --- a/Website/skoolos/asgi.py +++ b/Website/config/asgi.py @@ -11,6 +11,6 @@ import os from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'skoolos.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') application = get_asgi_application() diff --git a/Website/skoolos/settings.py b/Website/config/settings.py similarity index 95% rename from Website/skoolos/settings.py rename to Website/config/settings.py index c312991..b636949 100644 --- a/Website/skoolos/settings.py +++ b/Website/config/settings.py @@ -31,6 +31,7 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ + 'skoolos.apps.SkoolosConfig', 'users.apps.UsersConfig', 'django.contrib.admin', 'django.contrib.auth', @@ -41,6 +42,7 @@ INSTALLED_APPS = [ 'rest_framework', 'api', 'crispy_forms', + 'django_forms_bootstrap', ] @@ -63,7 +65,7 @@ MIDDLEWARE = [ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -ROOT_URLCONF = 'skoolos.urls' +ROOT_URLCONF = 'config.urls' TEMPLATES = [ { @@ -81,7 +83,7 @@ TEMPLATES = [ }, ] -WSGI_APPLICATION = 'skoolos.wsgi.application' +WSGI_APPLICATION = 'config.wsgi.application' # Database @@ -136,3 +138,5 @@ STATIC_URL = '/static/' CRISPY_TEMPLATE_PACK = 'bootstrap4' LOGIN_REDIRECT_URL = '/' + +LOGIN_URL = '/login' diff --git a/Website/config/urls.py b/Website/config/urls.py new file mode 100644 index 0000000..420beb6 --- /dev/null +++ b/Website/config/urls.py @@ -0,0 +1,31 @@ +from django.urls import path +from rest_framework import routers +from api import views as api_views +from django.contrib import admin +from django.conf.urls import include +from django.contrib.auth import views as auth_views + +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'files', api_views.DefFilesViewSet) +router.register(r'users', api_views.UserViewSet) + +from users import views as user_views +from users.forms import LoginForm + +# Wire up our API using automatic URL routing. +# Additionally, we include login URLs for the browsable API. +urlpatterns = [ + path('', include('skoolos.urls')), + path('api/', include(router.urls)), + path('api-auth/', include('rest_framework.urls')), + path('admin/', admin.site.urls), + path('login/', auth_views.LoginView.as_view(template_name='users/login.html', authentication_form=LoginForm), name='login'), + path('logout/', user_views.logout, name='logout'), + path('register/', user_views.register, name='register'), + path('create_account/', user_views.create_account, name='create_account'), + path('callback/', user_views.callback, name='callback'), +] diff --git a/Website/skoolos/wsgi.py b/Website/config/wsgi.py similarity index 82% rename from Website/skoolos/wsgi.py rename to Website/config/wsgi.py index f17107f..6b29610 100644 --- a/Website/skoolos/wsgi.py +++ b/Website/config/wsgi.py @@ -11,6 +11,6 @@ import os from django.core.wsgi import get_wsgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'skoolos.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') application = get_wsgi_application() diff --git a/Website/manage.py b/Website/manage.py index f17dda4..58c5f10 100755 --- a/Website/manage.py +++ b/Website/manage.py @@ -5,7 +5,7 @@ import sys def main(): - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'skoolos.settings') + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') try: from django.core.management import execute_from_command_line except ImportError as exc: diff --git a/Website/skoolos/admin.py b/Website/skoolos/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/Website/skoolos/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/Website/skoolos/apps.py b/Website/skoolos/apps.py new file mode 100644 index 0000000..6d65d67 --- /dev/null +++ b/Website/skoolos/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class SkoolosConfig(AppConfig): + name = 'skoolos' diff --git a/Website/skoolos/migrations/__init__.py b/Website/skoolos/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Website/skoolos/models.py b/Website/skoolos/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/Website/skoolos/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/Website/skoolos/static/skoolos/styles.css b/Website/skoolos/static/skoolos/styles.css new file mode 100644 index 0000000..e69de29 diff --git a/Website/skoolos/templates/skoolos/base.html b/Website/skoolos/templates/skoolos/base.html new file mode 100644 index 0000000..ac4bb53 --- /dev/null +++ b/Website/skoolos/templates/skoolos/base.html @@ -0,0 +1,26 @@ +{% load static %} + + + + + + + + + + + + + + + SkoolOS + + + + {% block content %}{% endblock %} + + + + + + diff --git a/Website/skoolos/templates/skoolos/home.html b/Website/skoolos/templates/skoolos/home.html new file mode 100644 index 0000000..abfc593 --- /dev/null +++ b/Website/skoolos/templates/skoolos/home.html @@ -0,0 +1,5 @@ +{% extends "skoolos/base.html" %} +{% block content %} +

welcome to skoolos

+

it's the future you've been waiting for

+{% endblock content %} diff --git a/Website/skoolos/tests.py b/Website/skoolos/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/Website/skoolos/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/Website/skoolos/urls.py b/Website/skoolos/urls.py index 00553b1..705a6ae 100644 --- a/Website/skoolos/urls.py +++ b/Website/skoolos/urls.py @@ -1,26 +1,6 @@ from django.urls import path -from rest_framework import routers -from api import views as api_views -from django.contrib import admin -from django.conf.urls import include -from django.contrib.auth import views as auth_views -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'files', api_views.DefFilesViewSet) -router.register(r'users', api_views.UserViewSet) -# Wire up our API using automatic URL routing. -# Additionally, we include login URLs for the browsable API. + urlpatterns = [ - path('api/', include(router.urls)), - path('api-auth/', include('rest_framework.urls')), - path('admin/', admin.site.urls), - path('login/', auth_views.LoginView.as_view(template_name="users/login.html"), name='login'), - path('register/', user_views.register, name='register'), - path('create_account/', user_views.create_account, name='create_account'), - path('callback/', user_views.callback, name='callback'), ] diff --git a/Website/skoolos/views.py b/Website/skoolos/views.py new file mode 100644 index 0000000..deb0eae --- /dev/null +++ b/Website/skoolos/views.py @@ -0,0 +1,8 @@ +from django.shortcuts import render +from django.contrib.auth.decorators import login_required + +# Create your views here. + +@login_required() +def home (request): + return render(request, "skoolos/home.html") diff --git a/Website/users/forms.py b/Website/users/forms.py index 956b95d..7bfae4c 100644 --- a/Website/users/forms.py +++ b/Website/users/forms.py @@ -1,5 +1,11 @@ from django import forms from django.contrib.auth.models import User +from django.contrib.auth.forms import AuthenticationForm + + +class LoginForm(AuthenticationForm): + username = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Username'})) + password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':'Password'})) class UserCreationForm(forms.ModelForm): @@ -7,13 +13,24 @@ class UserCreationForm(forms.ModelForm): email = forms.EmailField(disabled=True) first_name = forms.CharField(disabled=True) last_name = forms.CharField(disabled=True) - password = forms.PasswordInput() - confirm_password = forms.PasswordInput() - + isStudent = forms.BooleanField(widget = forms.HiddenInput()) + password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Password'})) + confirm_password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': 'Confirm Password'})) + token = forms.CharField(widget = forms.HiddenInput()) def __init__(self, *args, **kwargs): super(UserCreationForm, self).__init__(*args, **kwargs) + def clean(self): + cleaned_data = super(UserCreationForm, self).clean() + password = cleaned_data.get("password") + confirm_password = cleaned_data.get("confirm_password") + + if password != confirm_password: + raise forms.ValidationError("Passwords do not match!") + + return cleaned_data + class Meta: model = User - fields = ['username', 'email', 'first_name', 'password', 'confirm_password'] + fields = ('username', 'email', 'first_name', 'last_name', 'password') diff --git a/Website/users/static/users/styles.css b/Website/users/static/users/styles.css index 7aa3c45..f0b3e1c 100644 --- a/Website/users/static/users/styles.css +++ b/Website/users/static/users/styles.css @@ -99,6 +99,10 @@ body { -moz-osx-font-smoothing: grayscale; } +input:disabled { + background: #d9d9d9; +} + .errorlist { -} \ No newline at end of file +} diff --git a/Website/users/templates/users/base.html b/Website/users/templates/users/base.html index f4dd9e6..f621b1e 100644 --- a/Website/users/templates/users/base.html +++ b/Website/users/templates/users/base.html @@ -18,7 +18,6 @@ {% block content %}{% endblock %} -a diff --git a/Website/users/templates/users/create_account.html b/Website/users/templates/users/create_account.html new file mode 100644 index 0000000..f3f814d --- /dev/null +++ b/Website/users/templates/users/create_account.html @@ -0,0 +1,22 @@ +{% extends "users/base.html" %} +{% load bootstrap_tags %} + +{% block content %} + +{% endblock %} diff --git a/Website/users/templates/users/create_password.html b/Website/users/templates/users/create_password.html deleted file mode 100644 index 6018ee3..0000000 --- a/Website/users/templates/users/create_password.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "users/base.html" %} -{% block content %} - -{% endblock %} diff --git a/Website/users/templates/users/login.html b/Website/users/templates/users/login.html index 40837e2..185c43b 100644 --- a/Website/users/templates/users/login.html +++ b/Website/users/templates/users/login.html @@ -1,16 +1,38 @@ {% extends "users/base.html" %} -{% load crispy_forms_tags %} +{% load bootstrap_tags %} {% block content %} -
{% endblock %} diff --git a/Website/users/templates/users/register.html b/Website/users/templates/users/register.html index d7bac8d..2712f93 100644 --- a/Website/users/templates/users/register.html +++ b/Website/users/templates/users/register.html @@ -4,6 +4,13 @@
+ {% if messages %} + {% for message in messages %} +
+ {{ message }} +
+ {% endfor %} + {% endif %} Register with Ion diff --git a/Website/users/views.py b/Website/users/views.py index c8bf1af..3e01426 100644 --- a/Website/users/views.py +++ b/Website/users/views.py @@ -7,6 +7,7 @@ from requests_oauthlib import OAuth2Session from django.contrib import messages from .models import Token +from .forms import UserCreationForm from django.contrib.auth import authenticate from django.contrib.auth import login as auth_login @@ -53,7 +54,7 @@ def callback (request): if User.objects.filter(username=username).count() != 0: messages.success(request, "This user already exists!") - return redirect('register') + return redirect('/login/') else: token = Token(username = username, email = email, first_name = first_name, last_name = last_name, isStudent = isStudent) token.save() @@ -63,18 +64,66 @@ def callback (request): messages.warning(request, "Invalid Callback Response") - return redirect('register') + return redirect('/register/') def create_account (request): + if request.method == "POST": + print("POSTPOSTPOSTPOSTPOSTPOSTPOSTPOST") + form = UserCreationForm(request.POST) + print(form.is_valid()) + print(request.POST) + cleaned_data = form.clean() + if cleaned_data.get('password') == cleaned_data.get('confirm_password'): + token = Token.objects.get(token=cleaned_data.get('token')) + username = token.username + email = token.email + first_name = token.first_name + last_name = token.last_name + isStudent = token.isStudent + password = cleaned_data.get('password') + + user = User.objects.create_user(username=username, + email=email, + first_name=first_name, + last_name=last_name, + password=password) + user.save() + token.delete() + print (user) + messages.success(request, "Your SkoolOS account has successfully been created") + return redirect(f'/login/?username={username}') + else: + print(form.errors) + Token.objects.get(token=request.GET.get('token')).delete() + messages.warning(request, "Passwords did not match!") + return redirect('/register/') + if request.method == "GET" and Token.objects.filter(token=request.GET.get('token')).count() == 1: + print("GETGETGETGETGETGET") token = Token.objects.get(token=request.GET.get('token')) username = token.username email = token.email first_name = token.first_name last_name = token.last_name isStudent = token.isStudent + initial = { + 'username': username, + 'email': email, + 'first_name': first_name, + 'last_name': last_name, + 'isStudent': isStudent, + 'token': token.token, + } + form = UserCreationForm(initial=initial) + return render(request, 'users/create_account.html', {'form': form}) - - else: - return redirect('/register/') + messages.warning(request, "Invalid token") + return redirect('/register/') + + +@login_required +def logout(request): + auth_logout(request) + messages.success(request, "You've been logged out! Have a good rest of your day!") + return redirect(request, "/login/")