diff --git a/server/server/apps/__pycache__/decorators.cpython-35.pyc b/server/server/apps/__pycache__/decorators.cpython-35.pyc new file mode 100644 index 0000000..bda9768 Binary files /dev/null and b/server/server/apps/__pycache__/decorators.cpython-35.pyc differ diff --git a/server/server/apps/auth/__pycache__/admin.cpython-35.pyc b/server/server/apps/auth/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..c264ae7 Binary files /dev/null and b/server/server/apps/auth/__pycache__/admin.cpython-35.pyc differ diff --git a/server/server/apps/auth/__pycache__/apps.cpython-35.pyc b/server/server/apps/auth/__pycache__/apps.cpython-35.pyc new file mode 100644 index 0000000..2cab4aa Binary files /dev/null and b/server/server/apps/auth/__pycache__/apps.cpython-35.pyc differ diff --git a/server/server/apps/auth/__pycache__/models.cpython-35.pyc b/server/server/apps/auth/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..0d94c9e Binary files /dev/null and b/server/server/apps/auth/__pycache__/models.cpython-35.pyc differ diff --git a/server/server/apps/auth/__pycache__/views.cpython-35.pyc b/server/server/apps/auth/__pycache__/views.cpython-35.pyc index 1450a88..eff6898 100644 Binary files a/server/server/apps/auth/__pycache__/views.cpython-35.pyc and b/server/server/apps/auth/__pycache__/views.cpython-35.pyc differ diff --git a/server/server/apps/auth/apps.py b/server/server/apps/auth/apps.py index bdf15e1..c849940 100644 --- a/server/server/apps/auth/apps.py +++ b/server/server/apps/auth/apps.py @@ -2,4 +2,5 @@ from django.apps import AppConfig class AuthConfig(AppConfig): - name = 'auth' + name = 'server.apps.auth' + label = 'authentication' diff --git a/server/server/apps/auth/migrations/__pycache__/__init__.cpython-35.pyc b/server/server/apps/auth/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..1728b07 Binary files /dev/null and b/server/server/apps/auth/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/auth/views.py b/server/server/apps/auth/views.py index 3b16747..918b3f0 100644 --- a/server/server/apps/auth/views.py +++ b/server/server/apps/auth/views.py @@ -25,4 +25,11 @@ def login(request): request.session["type"] = user_data["user_type"] return redirect(reverse("index")) except InvalidGrantError: - return redirect(reverse("login")) \ No newline at end of file + return redirect(reverse("login")) + +def logout(request): + if 'user' in request.session.keys(): + del request.session["user"] + if 'type' in request.session.keys(): + del request.session["type"] + return redirect(reverse("index")) \ No newline at end of file diff --git a/server/server/apps/content/__pycache__/admin.cpython-35.pyc b/server/server/apps/content/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..03c7915 Binary files /dev/null and b/server/server/apps/content/__pycache__/admin.cpython-35.pyc differ diff --git a/server/server/apps/content/__pycache__/models.cpython-35.pyc b/server/server/apps/content/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..e923628 Binary files /dev/null and b/server/server/apps/content/__pycache__/models.cpython-35.pyc differ diff --git a/server/server/apps/content/__pycache__/views.cpython-35.pyc b/server/server/apps/content/__pycache__/views.cpython-35.pyc index eac0790..2c62637 100644 Binary files a/server/server/apps/content/__pycache__/views.cpython-35.pyc and b/server/server/apps/content/__pycache__/views.cpython-35.pyc differ diff --git a/server/server/apps/content/migrations/__pycache__/__init__.cpython-35.pyc b/server/server/apps/content/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..16cefe1 Binary files /dev/null and b/server/server/apps/content/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/content/views.py b/server/server/apps/content/views.py index 58704db..4d76a40 100644 --- a/server/server/apps/content/views.py +++ b/server/server/apps/content/views.py @@ -1,16 +1,14 @@ from django.shortcuts import render from django.conf import settings +from ..decorators import login +from ..mod.models import Moderator + # Create your views here. + +@login def index(request): - if 'type' in request.session and request.session['type'] in settings.ALLOWED_USERS: - return render( - request, - 'index.html', - { - 'user': request.session['user'], - }, - ) - else: - request.session.flush() - return render(request, 'disallow.html') \ No newline at end of file + + is_mod = Moderator.objects.filter(username=request.session['user']).count() > 0 + + return render(request, 'index.html', { 'user': request.session['user'], 'is_mod': is_mod} ) \ No newline at end of file diff --git a/server/server/apps/course/__init__.py b/server/server/apps/course/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/server/apps/course/__pycache__/__init__.cpython-35.pyc b/server/server/apps/course/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..e0055bd Binary files /dev/null and b/server/server/apps/course/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/course/__pycache__/admin.cpython-35.pyc b/server/server/apps/course/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..03b15b9 Binary files /dev/null and b/server/server/apps/course/__pycache__/admin.cpython-35.pyc differ diff --git a/server/server/apps/course/__pycache__/models.cpython-35.pyc b/server/server/apps/course/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..05af747 Binary files /dev/null and b/server/server/apps/course/__pycache__/models.cpython-35.pyc differ diff --git a/server/server/apps/course/__pycache__/urls.cpython-35.pyc b/server/server/apps/course/__pycache__/urls.cpython-35.pyc new file mode 100644 index 0000000..9939ef8 Binary files /dev/null and b/server/server/apps/course/__pycache__/urls.cpython-35.pyc differ diff --git a/server/server/apps/course/__pycache__/views.cpython-35.pyc b/server/server/apps/course/__pycache__/views.cpython-35.pyc new file mode 100644 index 0000000..7e0e34c Binary files /dev/null and b/server/server/apps/course/__pycache__/views.cpython-35.pyc differ diff --git a/server/server/apps/course/admin.py b/server/server/apps/course/admin.py new file mode 100644 index 0000000..a8d12bf --- /dev/null +++ b/server/server/apps/course/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +from .models import Course + +# Register your models here. +admin.site.register(Course) \ No newline at end of file diff --git a/server/server/apps/course/apps.py b/server/server/apps/course/apps.py new file mode 100644 index 0000000..ff833cd --- /dev/null +++ b/server/server/apps/course/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ClassConfig(AppConfig): + name = 'course' diff --git a/server/server/apps/course/migrations/0001_initial.py b/server/server/apps/course/migrations/0001_initial.py new file mode 100644 index 0000000..aace0dd --- /dev/null +++ b/server/server/apps/course/migrations/0001_initial.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.10 on 2020-03-02 04:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('files', '0002_auto_20200302_0345'), + ] + + operations = [ + migrations.CreateModel( + name='Course', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100, unique=True)), + ('files', models.ManyToManyField(blank=True, related_name='classes', to='files.File')), + ], + ), + ] diff --git a/server/server/apps/course/migrations/0002_course_url.py b/server/server/apps/course/migrations/0002_course_url.py new file mode 100644 index 0000000..d8911f6 --- /dev/null +++ b/server/server/apps/course/migrations/0002_course_url.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.10 on 2020-03-02 04:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='course', + name='url', + field=models.CharField(default='-', max_length=20, unique=True), + preserve_default=False, + ), + ] diff --git a/server/server/apps/course/migrations/0003_course_unapproved_files.py b/server/server/apps/course/migrations/0003_course_unapproved_files.py new file mode 100644 index 0000000..f410f26 --- /dev/null +++ b/server/server/apps/course/migrations/0003_course_unapproved_files.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.10 on 2020-03-22 17:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('files', '0002_auto_20200302_0345'), + ('course', '0002_course_url'), + ] + + operations = [ + migrations.AddField( + model_name='course', + name='unapproved_files', + field=models.ManyToManyField(blank=True, related_name='classes_unap', to='files.File'), + ), + ] diff --git a/server/server/apps/course/migrations/0004_course_rejected_files.py b/server/server/apps/course/migrations/0004_course_rejected_files.py new file mode 100644 index 0000000..cc059ef --- /dev/null +++ b/server/server/apps/course/migrations/0004_course_rejected_files.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.10 on 2020-03-23 04:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('files', '0002_auto_20200302_0345'), + ('course', '0003_course_unapproved_files'), + ] + + operations = [ + migrations.AddField( + model_name='course', + name='rejected_files', + field=models.ManyToManyField(blank=True, related_name='classes_reject', to='files.File'), + ), + ] diff --git a/server/server/apps/course/migrations/__init__.py b/server/server/apps/course/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/server/apps/course/migrations/__pycache__/0001_initial.cpython-35.pyc b/server/server/apps/course/migrations/__pycache__/0001_initial.cpython-35.pyc new file mode 100644 index 0000000..970d1bf Binary files /dev/null and b/server/server/apps/course/migrations/__pycache__/0001_initial.cpython-35.pyc differ diff --git a/server/server/apps/course/migrations/__pycache__/0002_course_url.cpython-35.pyc b/server/server/apps/course/migrations/__pycache__/0002_course_url.cpython-35.pyc new file mode 100644 index 0000000..f2bfea7 Binary files /dev/null and b/server/server/apps/course/migrations/__pycache__/0002_course_url.cpython-35.pyc differ diff --git a/server/server/apps/course/migrations/__pycache__/0003_course_unapproved_files.cpython-35.pyc b/server/server/apps/course/migrations/__pycache__/0003_course_unapproved_files.cpython-35.pyc new file mode 100644 index 0000000..e9d2a8b Binary files /dev/null and b/server/server/apps/course/migrations/__pycache__/0003_course_unapproved_files.cpython-35.pyc differ diff --git a/server/server/apps/course/migrations/__pycache__/0004_course_rejected_files.cpython-35.pyc b/server/server/apps/course/migrations/__pycache__/0004_course_rejected_files.cpython-35.pyc new file mode 100644 index 0000000..2809668 Binary files /dev/null and b/server/server/apps/course/migrations/__pycache__/0004_course_rejected_files.cpython-35.pyc differ diff --git a/server/server/apps/course/migrations/__pycache__/__init__.cpython-35.pyc b/server/server/apps/course/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..bf294b4 Binary files /dev/null and b/server/server/apps/course/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/course/models.py b/server/server/apps/course/models.py new file mode 100644 index 0000000..ce8b593 --- /dev/null +++ b/server/server/apps/course/models.py @@ -0,0 +1,17 @@ +from django.db import models + +# Create your models here. + +class Course(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=100, unique=True) + url = models.CharField(max_length=20, unique=True) + + + unapproved_files = models.ManyToManyField("files.File", related_name="classes_unap", blank=True) + files = models.ManyToManyField("files.File", related_name="classes", blank=True) + rejected_files = models.ManyToManyField("files.File", related_name="classes_reject", blank=True) + + def __str__(self): + return self.name + \ No newline at end of file diff --git a/server/server/apps/course/tests.py b/server/server/apps/course/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/server/apps/course/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/server/apps/course/urls.py b/server/server/apps/course/urls.py new file mode 100644 index 0000000..5fff08d --- /dev/null +++ b/server/server/apps/course/urls.py @@ -0,0 +1,13 @@ +from django.urls import path + +from . import views + +app_name = "course" + +urlpatterns = [ + path("", views.index, name="index"), + path("", views.show, name="show"), + path("/approve/", views.approve, name="approve"), + path("/remove/", views.remove, name="remove"), + path("/undelete/", views.undelete, name="undelete"), +] \ No newline at end of file diff --git a/server/server/apps/course/views.py b/server/server/apps/course/views.py new file mode 100644 index 0000000..971b9c2 --- /dev/null +++ b/server/server/apps/course/views.py @@ -0,0 +1,111 @@ +from django.shortcuts import render, get_object_or_404 +from django.core.exceptions import PermissionDenied + +from django.http import Http404 + +from .models import Course +from ..mod.models import Moderator +from ..files.models import File + +from ..decorators import login + +# Create your views here. + +@login +def index(request): + courses = Course.objects.all() + + return render(request, 'class/index.html', {'classes': courses}) + +@login +def show(request, course_url): + course = get_object_or_404(Course, url=course_url) + + is_mod = False + + try: + mod = Moderator.objects.get(username=request.session['user']) + except Moderator.DoesNotExist: + is_mod = False + + if mod.admin: + is_mod = True + + elif course in mod.classes.all(): + is_mod = True + + return render(request, 'class/show.html', {'course': course, 'is_mod': is_mod}) + +@login +def approve(request, course_url, doc_id): + course = get_object_or_404(Course, url=course_url) + try: + mod = Moderator.objects.get(username=request.session['user']) + except Moderator.DoesNotExist: + raise PermissionDenied + + if mod.admin or (course in mod.classes.all()): + try: + doc = course.unapproved_files.get(id=doc_id) + except File.DoesNotExist: + try: + doc = course.files.get(id=doc_id) + except File.DoesNotExist: + raise Http404("Error: Document Not Related to this Course") + raise Http404("Error: Document Already Approved") + course.unapproved_files.remove(doc) + course.files.add(doc) + + return render(request, 'class/approve.html', {'doc': doc, 'course': course}) + else: + raise PermissionDenied + +@login +def remove(request, course_url, doc_id): + course = get_object_or_404(Course, url=course_url) + try: + mod = Moderator.objects.get(username=request.session['user']) + except Moderator.DoesNotExist: + raise PermissionDenied + + if mod.admin or (course in mod.classes.all()): + try: + doc = course.files.get(id=doc_id) + except File.DoesNotExist: + try: + doc = course.unapproved_files.get(id=doc_id) + except File.DoesNotExist: + raise Http404("Error: Document Not Related to this Course") + + course.unapproved_files.remove(doc) + course.rejected_files.add(doc) + + return render(request, 'class/remove.html', {'doc': doc, 'course': course}) + + course.files.remove(doc) + course.rejected_files.add(doc) + + return render(request, 'class/remove.html', {'doc': doc, 'course': course}) + else: + raise PermissionDenied + +@login +def undelete(request, course_url, doc_id): + course = get_object_or_404(Course, url=course_url) + try: + mod = Moderator.objects.get(username=request.session['user']) + except Moderator.DoesNotExist: + raise PermissionDenied + + if mod.admin or (course in mod.classes.all()): + try: + doc = course.rejected_files.get(id=doc_id) + except File.DoesNotExist: + raise Http404("Error: Document Not Related to this Course") + + course.rejected_files.remove(doc) + course.files.add(doc) + + return render(request, 'class/undelete.html', {'doc': doc, 'course': course}) + else: + raise PermissionDenied \ No newline at end of file diff --git a/server/server/apps/decorators.py b/server/server/apps/decorators.py new file mode 100644 index 0000000..0b86373 --- /dev/null +++ b/server/server/apps/decorators.py @@ -0,0 +1,15 @@ +from django.shortcuts import render +from django.conf import settings + + +def login(function): + def wrap(request, *args, **kwargs): + if 'type' in request.session and request.session['type'] in settings.ALLOWED_USERS: + return function(request, *args, **kwargs) + else: + request.session.flush() + return render(request, 'disallow.html') + + wrap.__doc__ = function.__doc__ + wrap.__name__ = function.__name__ + return wrap \ No newline at end of file diff --git a/server/server/apps/files/__init__.py b/server/server/apps/files/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/server/apps/files/__pycache__/__init__.cpython-35.pyc b/server/server/apps/files/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..2c403f1 Binary files /dev/null and b/server/server/apps/files/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/files/__pycache__/admin.cpython-35.pyc b/server/server/apps/files/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..d55d44f Binary files /dev/null and b/server/server/apps/files/__pycache__/admin.cpython-35.pyc differ diff --git a/server/server/apps/files/__pycache__/models.cpython-35.pyc b/server/server/apps/files/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..d48d285 Binary files /dev/null and b/server/server/apps/files/__pycache__/models.cpython-35.pyc differ diff --git a/server/server/apps/files/admin.py b/server/server/apps/files/admin.py new file mode 100644 index 0000000..c8f8790 --- /dev/null +++ b/server/server/apps/files/admin.py @@ -0,0 +1,8 @@ +from django.contrib import admin + +from .models import File + +# Register your models here. +@admin.register(File) +class FileAdmin(admin.ModelAdmin): + readonly_fields = ('id',) \ No newline at end of file diff --git a/server/server/apps/files/apps.py b/server/server/apps/files/apps.py new file mode 100644 index 0000000..c86f272 --- /dev/null +++ b/server/server/apps/files/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class FilesConfig(AppConfig): + name = 'files' diff --git a/server/server/apps/files/forms.py b/server/server/apps/files/forms.py new file mode 100644 index 0000000..d3199e6 --- /dev/null +++ b/server/server/apps/files/forms.py @@ -0,0 +1,8 @@ +from django import forms + +from .models import File + +class UploadFileForm(forms.ModelForm): + class Meta: + model = File + fields = ["name", "payload"] \ No newline at end of file diff --git a/server/server/apps/files/migrations/0001_initial.py b/server/server/apps/files/migrations/0001_initial.py new file mode 100644 index 0000000..1d73c35 --- /dev/null +++ b/server/server/apps/files/migrations/0001_initial.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.10 on 2020-03-02 01:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='File', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100, unique=True)), + ], + ), + ] diff --git a/server/server/apps/files/migrations/0002_auto_20200302_0345.py b/server/server/apps/files/migrations/0002_auto_20200302_0345.py new file mode 100644 index 0000000..6f19bdd --- /dev/null +++ b/server/server/apps/files/migrations/0002_auto_20200302_0345.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.10 on 2020-03-02 03:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('files', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='file', + name='payload', + field=models.FileField(blank=True, upload_to=''), + ), + migrations.AddField( + model_name='file', + name='uploader', + field=models.CharField(default='----', max_length=100), + preserve_default=False, + ), + ] diff --git a/server/server/apps/files/migrations/__init__.py b/server/server/apps/files/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/server/apps/files/migrations/__pycache__/0001_initial.cpython-35.pyc b/server/server/apps/files/migrations/__pycache__/0001_initial.cpython-35.pyc new file mode 100644 index 0000000..e0fc009 Binary files /dev/null and b/server/server/apps/files/migrations/__pycache__/0001_initial.cpython-35.pyc differ diff --git a/server/server/apps/files/migrations/__pycache__/0002_auto_20200302_0345.cpython-35.pyc b/server/server/apps/files/migrations/__pycache__/0002_auto_20200302_0345.cpython-35.pyc new file mode 100644 index 0000000..3925915 Binary files /dev/null and b/server/server/apps/files/migrations/__pycache__/0002_auto_20200302_0345.cpython-35.pyc differ diff --git a/server/server/apps/files/migrations/__pycache__/__init__.cpython-35.pyc b/server/server/apps/files/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..665cc21 Binary files /dev/null and b/server/server/apps/files/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/files/models.py b/server/server/apps/files/models.py new file mode 100644 index 0000000..6e1350d --- /dev/null +++ b/server/server/apps/files/models.py @@ -0,0 +1,20 @@ +from django.db import models +from django.utils.text import slugify +from uuid import uuid4 +from time import strftime + +# Create your models here. +def gen_filename(instance, filename): + return "upload_{0}_{1}_{2}.{3}".format(strftime('%Y-%m-%d-%H-%M%S'), uuid4(), slugify(instance.name), filename.split('.')[-1]) + +class File(models.Model): + id = models.AutoField(primary_key=True) + name = models.CharField(max_length=100, unique=True) + + + uploader = models.CharField(max_length=100) + + payload = models.FileField(blank=True, upload_to=gen_filename) + + def __str__(self): + return self.name diff --git a/server/server/apps/files/tests.py b/server/server/apps/files/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/server/apps/files/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/server/apps/files/views.py b/server/server/apps/files/views.py new file mode 100644 index 0000000..4565d78 --- /dev/null +++ b/server/server/apps/files/views.py @@ -0,0 +1,18 @@ +from django.shortcuts import render +from django.http import HttpResponseRedirect + +from .forms import UploadFileForm +from .models import File + +# Create your views here. +def upload_file(request): + if 'type' in request.session and request.session['type'] in settings.ALLOWED_USERS: + if request.method == 'POST': + form = UploadFileForm(request.POST, request.FILES) + if form.is_valid(): + inst = File(name=request.POST['title'] , payload=request.FILES['file']) + inst.save() + return HttpResponseRedirect('/upload/success') + else: + form = UploadFileForm() + return render(request, 'upload.html', {'form':form}) \ No newline at end of file diff --git a/server/server/apps/mod/__init__.py b/server/server/apps/mod/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/server/apps/mod/__pycache__/__init__.cpython-35.pyc b/server/server/apps/mod/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..c16df92 Binary files /dev/null and b/server/server/apps/mod/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/mod/__pycache__/admin.cpython-35.pyc b/server/server/apps/mod/__pycache__/admin.cpython-35.pyc new file mode 100644 index 0000000..efbbf85 Binary files /dev/null and b/server/server/apps/mod/__pycache__/admin.cpython-35.pyc differ diff --git a/server/server/apps/mod/__pycache__/models.cpython-35.pyc b/server/server/apps/mod/__pycache__/models.cpython-35.pyc new file mode 100644 index 0000000..9f57cbb Binary files /dev/null and b/server/server/apps/mod/__pycache__/models.cpython-35.pyc differ diff --git a/server/server/apps/mod/__pycache__/urls.cpython-35.pyc b/server/server/apps/mod/__pycache__/urls.cpython-35.pyc new file mode 100644 index 0000000..c9f6622 Binary files /dev/null and b/server/server/apps/mod/__pycache__/urls.cpython-35.pyc differ diff --git a/server/server/apps/mod/__pycache__/views.cpython-35.pyc b/server/server/apps/mod/__pycache__/views.cpython-35.pyc new file mode 100644 index 0000000..ed20b06 Binary files /dev/null and b/server/server/apps/mod/__pycache__/views.cpython-35.pyc differ diff --git a/server/server/apps/mod/admin.py b/server/server/apps/mod/admin.py new file mode 100644 index 0000000..9e20545 --- /dev/null +++ b/server/server/apps/mod/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin + +from .models import Moderator + +# Register your models here. + +admin.site.register(Moderator) \ No newline at end of file diff --git a/server/server/apps/mod/apps.py b/server/server/apps/mod/apps.py new file mode 100644 index 0000000..ce653c3 --- /dev/null +++ b/server/server/apps/mod/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ModConfig(AppConfig): + name = 'mod' diff --git a/server/server/apps/mod/migrations/0001_initial.py b/server/server/apps/mod/migrations/0001_initial.py new file mode 100644 index 0000000..ecbed45 --- /dev/null +++ b/server/server/apps/mod/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.10 on 2020-03-02 04:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('course', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Moderator', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('username', models.CharField(max_length=16, unique=True)), + ('admin', models.BooleanField(default=False)), + ('classes', models.ManyToManyField(blank=True, related_name='mods', to='course.Course')), + ], + ), + ] diff --git a/server/server/apps/mod/migrations/__init__.py b/server/server/apps/mod/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/server/apps/mod/migrations/__pycache__/0001_initial.cpython-35.pyc b/server/server/apps/mod/migrations/__pycache__/0001_initial.cpython-35.pyc new file mode 100644 index 0000000..83744a9 Binary files /dev/null and b/server/server/apps/mod/migrations/__pycache__/0001_initial.cpython-35.pyc differ diff --git a/server/server/apps/mod/migrations/__pycache__/__init__.cpython-35.pyc b/server/server/apps/mod/migrations/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..c1a0c2f Binary files /dev/null and b/server/server/apps/mod/migrations/__pycache__/__init__.cpython-35.pyc differ diff --git a/server/server/apps/mod/models.py b/server/server/apps/mod/models.py new file mode 100644 index 0000000..0d09bb7 --- /dev/null +++ b/server/server/apps/mod/models.py @@ -0,0 +1,13 @@ +from django.db import models + +# Create your models here. + +class Moderator(models.Model): + id = models.AutoField(primary_key=True) + username = models.CharField(max_length=16, unique=True) + admin = models.BooleanField(default=False) + + classes = models.ManyToManyField("course.Course", related_name="mods", blank=True) + + def __str__(self): + return self.username \ No newline at end of file diff --git a/server/server/apps/mod/tests.py b/server/server/apps/mod/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/server/apps/mod/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/server/apps/mod/urls.py b/server/server/apps/mod/urls.py new file mode 100644 index 0000000..3a8844c --- /dev/null +++ b/server/server/apps/mod/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from . import views + +app_name = "mod" + +urlpatterns = [ + path("", views.dashboard, name="dash"), +] \ No newline at end of file diff --git a/server/server/apps/mod/views.py b/server/server/apps/mod/views.py new file mode 100644 index 0000000..97a23a0 --- /dev/null +++ b/server/server/apps/mod/views.py @@ -0,0 +1,24 @@ +from django.shortcuts import render, get_object_or_404 + +from .models import Moderator +from ..course.models import Course + +from ..decorators import login +# Create your views here. + +@login +def dashboard(request): + try: + mod = Moderator.objects.get(username=request.session['user']) + except Moderator.DoesNotExist: + return render(request, 'mod/not_mod.html', {'user': request.session['user']}) + + classes = mod.classes.all() + if mod.admin: + classes = Course.objects.all() + + if not classes: + return render(request, 'mod/not_mod.html', {'user': request.session['user']}) + + return render(request, 'mod/index.html', {'user': request.session['user'], 'classes': classes}) + diff --git a/server/server/settings.py b/server/server/settings.py index f626e66..ec2f355 100644 --- a/server/server/settings.py +++ b/server/server/settings.py @@ -38,6 +38,11 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'server.apps.files', + 'server.apps.mod', + 'server.apps.content', + 'server.apps.auth.apps.AuthConfig', + 'server.apps.course', ] MIDDLEWARE = [ @@ -84,6 +89,10 @@ DATABASES = { } +MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') +STATIC_ROOT = os.path.join(BASE_DIR, 'static/') +MEDIA_URL = '/media/' + # Password validation # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators diff --git a/server/server/templates/class/approve.html b/server/server/templates/class/approve.html new file mode 100644 index 0000000..e74a9eb --- /dev/null +++ b/server/server/templates/class/approve.html @@ -0,0 +1,4 @@ +{% extends 'base.html' %} +{% block body %} + Success. You have Approved {{ doc.name }} by {{ doc.uploader }} Download for the Course {{ course.name }}. +{% endblock %} \ No newline at end of file diff --git a/server/server/templates/class/index.html b/server/server/templates/class/index.html new file mode 100644 index 0000000..3198f4b --- /dev/null +++ b/server/server/templates/class/index.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} +{% block body %} +
+

Classes

+
+
+ {% for class in classes %} +
+ {{class.name}} +

{{ class.files.all|length }} Document

+
+ {% endfor %} +
+ +{% endblock %} \ No newline at end of file diff --git a/server/server/templates/class/remove.html b/server/server/templates/class/remove.html new file mode 100644 index 0000000..fac2279 --- /dev/null +++ b/server/server/templates/class/remove.html @@ -0,0 +1,4 @@ +{% extends 'base.html' %} +{% block body %} + Success. You have Removed {{ doc.name }} by {{ doc.uploader }} Download for the Course {{ course.name }}. +{% endblock %} \ No newline at end of file diff --git a/server/server/templates/class/show.html b/server/server/templates/class/show.html new file mode 100644 index 0000000..df8aed2 --- /dev/null +++ b/server/server/templates/class/show.html @@ -0,0 +1,59 @@ +{% extends 'base.html' %} +{% block head %} + + +{% endblock %} +{% block body %} +
+

{{ course.name }}

+
+
+ {% if is_mod %} +

You have moderator permissions on this course, which means you can approve of reject uploaded files.

+ {% endif %} + {% for doc in course.files.all %} +
+

{{ doc.name }}

+ Download +

Uploaded By {{ doc.uploader }}

+ {% if is_mod %} + REMOVE + {% endif %} +
+ {% endfor %} + + {% if is_mod %} + {% for doc in course.unapproved_files.all %} +
+

UNAPPROVED

+

{{ doc.name }}

+ Download +

Uploaded By {{ doc.uploader }}

+ APPROVE + REMOVE +
+ {% endfor %} + {% for doc in course.rejected_files.all %} +
+

UNAPPROVED

+

{{ doc.name }}

+ Download +

Uploaded By {{ doc.uploader }}

+ UNDELETE +
+ {% endfor %} + {% endif %} +
+ +{% endblock %} \ No newline at end of file diff --git a/server/server/templates/class/undelete.html b/server/server/templates/class/undelete.html new file mode 100644 index 0000000..ab3749e --- /dev/null +++ b/server/server/templates/class/undelete.html @@ -0,0 +1,4 @@ +{% extends 'base.html' %} +{% block body %} + Success. You have Restored {{ doc.name }} by {{ doc.uploader }} Download for the Course {{ course.name }}. +{% endblock %} \ No newline at end of file diff --git a/server/server/templates/index.html b/server/server/templates/index.html index 533ac1b..8253a38 100644 --- a/server/server/templates/index.html +++ b/server/server/templates/index.html @@ -2,4 +2,9 @@ {% block body %}

Study Bank

Welcome, {{ user }}

+ {% if is_mod %} + Moderator Dashboard + {% endif %} + + View Courses {% endblock %} \ No newline at end of file diff --git a/server/server/templates/mod/index.html b/server/server/templates/mod/index.html new file mode 100644 index 0000000..740bfa5 --- /dev/null +++ b/server/server/templates/mod/index.html @@ -0,0 +1,16 @@ +{% extends 'base.html' %} +{% block body %} +
+

Classes Moderated by {{ user }}

+
+
+ + {% for class in classes %} +
+ {{class.name}} +

{{ class.files.all|length }} Document

+
+ {% endfor %} +
+ +{% endblock %} \ No newline at end of file diff --git a/server/server/templates/mod/not_mod.html b/server/server/templates/mod/not_mod.html new file mode 100644 index 0000000..3a38baf --- /dev/null +++ b/server/server/templates/mod/not_mod.html @@ -0,0 +1,10 @@ +{% extends 'base.html' %} +{% block body %} +
+

Access Denied

+
+
+

Sorry, {{ user }}, but you do not have moderator permissions over any sites.

+
+ +{% endblock %} \ No newline at end of file diff --git a/server/server/urls.py b/server/server/urls.py index f6d32b2..5ad473e 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -14,13 +14,18 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include from .apps.auth import views as auth_views from .apps.content import views as content_views +from .apps.course import views as course_views +from .apps.mod import views as mod_views urlpatterns = [ path('admin/', admin.site.urls), path('login/', auth_views.login, name="login"), + path('logout/', auth_views.logout, name="logout"), + path('courses/', include("server.apps.course.urls", namespace="courses")), + path('mod/', include("server.apps.mod.urls", namespace="mod")), path('', content_views.index, name="index"), ]