diff --git a/Website/api/models.py b/Website/api/models.py index 09c9c91..76bfaba 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -26,7 +26,6 @@ class Class(models.Model): description = models.CharField(default="Class Description", max_length=500) repo=models.URLField(default="", blank=True) path=models.CharField(blank=True, 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') @@ -49,12 +48,13 @@ 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) - ion_user=models.CharField(primary_key=True, max_length=100) + ion_user=models.CharField(primary_key=True, blank=True, max_length=100) def __str__(self): return f"{self.user.username}'s Profile" def save(self, *args, **kwargs): + self.ion_user = self.user.username super(Teacher, self).save(*args, **kwargs) # class Student(models.Model): @@ -71,16 +71,14 @@ class Teacher(models.Model): class Assignment(models.Model): - owner = models.ForeignKey('auth.User', related_name='assignments', on_delete=models.CASCADE) + myClass = models.ForeignKey(Class, 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) + path=models.CharField(max_length=100, blank=True) def __str__(self): - return '%s' % (self.name) + return f'{self.name}' class DefFiles(models.Model): diff --git a/Website/skoolos/forms.py b/Website/skoolos/forms.py new file mode 100644 index 0000000..6374f97 --- /dev/null +++ b/Website/skoolos/forms.py @@ -0,0 +1,28 @@ +from django import forms +from django.contrib.auth.models import User +from api.models import Student, Teacher +import re + +class UserUpdateForm(forms.ModelForm): + + username = forms.CharField(max_length=50, disabled=True) + first_name = forms.CharField(max_length=50, disabled=True) + last_name = forms.CharField(max_length=50, disabled=True) + email = forms.EmailField() + + def __init__(self, *args, **kwargs): + super(UserUpdateForm, self).__init__(*args, **kwargs) + + class Meta: + model = User + fields = ['username','first_name','last_name','email'] + +class StudentUpdateForm(forms.ModelForm): + class Meta: + model = Student + fields = ['git'] + +class TeacherUpdateForm(forms.ModelForm): + class Meta: + model = Teacher + fields = ['git'] diff --git a/Website/skoolos/static/skoolos/styles.css b/Website/skoolos/static/skoolos/styles.css index 5da71bb..0f86d92 100644 --- a/Website/skoolos/static/skoolos/styles.css +++ b/Website/skoolos/static/skoolos/styles.css @@ -36,3 +36,59 @@ h1, h2, h3, h4, h5, h6 { .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; + font-size: 1.5em; +} + +.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; +} diff --git a/Website/skoolos/templates/skoolos/base.html b/Website/skoolos/templates/skoolos/base.html index eb90110..2ec152d 100644 --- a/Website/skoolos/templates/skoolos/base.html +++ b/Website/skoolos/templates/skoolos/base.html @@ -43,6 +43,16 @@ + {% if messages %} + {% for message in messages %} +
+ {{ message }} + +
+ {% endfor %} + {% endif %} {% block content %}{% endblock %} diff --git a/Website/skoolos/templates/skoolos/class_detail.html b/Website/skoolos/templates/skoolos/class_detail.html new file mode 100644 index 0000000..e6c02c5 --- /dev/null +++ b/Website/skoolos/templates/skoolos/class_detail.html @@ -0,0 +1,28 @@ +{% extends "skoolos/base.html" %} +{% block content %} +
+
+

Assignments:

+
+ {% for assignment in assignments %} + + {% endfor %} +
+ +
+

{{ class.name }}

+

Teachers:

+ +
+
+ +{% endblock content %} diff --git a/Website/skoolos/templates/skoolos/home.html b/Website/skoolos/templates/skoolos/home.html index d6e5432..6822cb6 100644 --- a/Website/skoolos/templates/skoolos/home.html +++ b/Website/skoolos/templates/skoolos/home.html @@ -3,7 +3,7 @@
{% for class in classes %}
- + +{% endblock content %} diff --git a/Website/skoolos/templates/skoolos/profile_teacher.html b/Website/skoolos/templates/skoolos/profile_teacher.html new file mode 100644 index 0000000..3da2f41 --- /dev/null +++ b/Website/skoolos/templates/skoolos/profile_teacher.html @@ -0,0 +1,34 @@ +{% extends "skoolos/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+
+ + {{ user.first_name }} {{ user.last_name }} +

+ {{ user.email }} + GitHub +

+
+
+ Classes +
    + {% for class in classes %} +
  • {{ class.name }}
  • + {% endfor %} +
+
+ {% csrf_token %} +
+ Your profile + {{ userForm|crispy}} + {{ profileForm|crispy }} +
+
+ +
+
+
+
+{% endblock content %} diff --git a/Website/skoolos/urls.py b/Website/skoolos/urls.py index 182fea5..a028497 100644 --- a/Website/skoolos/urls.py +++ b/Website/skoolos/urls.py @@ -6,5 +6,5 @@ from . import views urlpatterns = [ path('', views.home, name='home'), path('profile/', views.profile, name='profile'), - path("class/", views.classDetail, name="class"), + path("class/", views.classDetail, name="class"), ] diff --git a/Website/skoolos/views.py b/Website/skoolos/views.py index 2748b71..c26311a 100644 --- a/Website/skoolos/views.py +++ b/Website/skoolos/views.py @@ -1,6 +1,11 @@ from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.views.generic import ListView +from django.contrib import messages + +from django.contrib.auth.models import User + +from .forms import UserUpdateForm, StudentUpdateForm, TeacherUpdateForm from api.models import Student, Teacher, Class, Assignment @@ -16,7 +21,7 @@ def home (request): try: teacher = Teacher.objects.get(user=request.user) - return render(request, "skoolos/home.html", {'classes': teacher.classes}) + return render(request, "skoolos/home.html", {'classes': teacher.classes.all()}) except Teacher.DoesNotExist: pass @@ -26,6 +31,89 @@ def home (request): def profile (request): pass +@login_required() def classDetail (request, id): classObj = Class.objects.get(id=id) + + try: + student = Student.objects.get(user=request.user) + except Student.DoesNotExist: + pass + else: + if classObj.confirmed.filter(user=student.user).count() != 1: + return redirect('/') + else: + return render(request, "skoolos/class_detail.html", {'class': classObj,'assignments': classObj.assignments.all(), 'teachers': classObj.classes.all()}) + + try: + teacher = Teacher.objects.get(user=request.user) + return render(request, "skoolos/home.html", {'classes': teacher.classes.all()}) + except Teacher.DoesNotExist: + pass + else: + if classObj.confirmed.filter(user=student.user).count() != 1: + return redirect('/') + else: + return render(request, "skoolos/class_detail.html", {'class': classObj,'assignments': classObj.assignments.all(), 'teachers': classObj.classes.all()}) + return redirect('/') + +@login_required() +def profile (request): + try: + student = Student.objects.get(user=request.user) + return student_profile(request) + except Student.DoesNotExist: + pass + + try: + teacher = Teacher.objects.get(user=request.user) + return teacher_profile(request) + except Teacher.DoesNotExist: + pass + + return redirect("/") + +def student_profile (request): + if request.method == "POST": + userForm = UserUpdateForm(request.POST, instance=request.user) + profileForm = StudentUpdateForm(request.POST, + instance=request.user.student) + if userForm.is_valid() and profileForm.is_valid(): + userForm.save() + profileForm.save() + messages.success(request, "Your account has been updated!") + return redirect('profile') + else: + userForm = UserUpdateForm(instance=request.user) + profileForm = StudentUpdateForm(instance=request.user.student) + + context = { + 'userForm': userForm, + 'profileForm': profileForm, + 'classes': request.user.student.confirmed.all() + } + + return render(request, 'skoolos/profile_student.html', context) + +def teacher_profile (request): + if request.method == "POST": + userForm = UserUpdateForm(request.POST, instance=request.user) + profileForm = TeacherUpdateForm(request.POST, + instance=request.user.student) + if userForm.is_valid() and profileForm.is_valid(): + userForm.save() + profileForm.save() + messages.success(request, "Your account has been updated!") + return redirect('profile') + else: + userForm = UserUpdateForm(instance=request.user) + profileForm = TeacherUpdateForm(instance=request.user.student) + + context = { + 'userForm': userForm, + 'profileForm': profileForm, + 'classes': request.user.teacher.classes.all() + } + + return render(request, 'skoolos/profile_teacher.html', context)