From 94492b3b7ddaafc88251c695cca01753623e6307 Mon Sep 17 00:00:00 2001 From: rushilwiz Date: Mon, 15 Jun 2020 17:13:08 -0400 Subject: [PATCH 1/8] Changed Teacher/Class models --- Website/api/models.py | 1 + Website/api/serializers.py | 28 +++++++++++++--------------- Website/users/views.py | 6 ++++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Website/api/models.py b/Website/api/models.py index 268c451..3d0a22e 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -38,6 +38,7 @@ class Class(models.Model): class Teacher(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) + username = models.CharField(max_length=100) classes=models.ManyToManyField(Class, blank=True, related_name='classes') git=models.CharField(max_length=100, default="", blank=True) diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 2904a07..08e21b5 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -1,5 +1,5 @@ from django.contrib.auth.models import User, Group -from .models import Student, Teacher, Classes, Assignment, DefFiles +from .models import Student, Teacher, Class, Assignment, DefFiles from rest_framework import serializers, permissions from django.contrib.auth.models import User from .permissions import IsOwnerOrReadOnly,isTeacher @@ -15,41 +15,39 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): # class DefFilesSerializer(serializers.HyperlinkedModelSerializer): # class Meta: # model = DefFiles -# fields = ['name', 'path','assignment','classes', "teacher",'url', 'id'] +# fields = ['name', 'path','assignment','Class', "teacher",'url', 'id'] class AssignmentSerializer(serializers.HyperlinkedModelSerializer): - #permissions_classes = [permissions.IsAuthenticatedOrReadOnly] + #permissions_Class = [permissions.IsAuthenticatedOrReadOnly] # files = DefFilesSerializer(many=True, read_only=True,allow_null=True) owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Assignment - # fields = ['url','name', 'due_date', 'path' , "classes","teacher",'owner'] - fields = ['name', 'due_date', 'path' , "classes","teacher",'owner'] + # fields = ['url','name', 'due_date', 'path' , "Class","teacher",'owner'] + fields = ['name', 'due_date', 'path' , "Class","teacher",'owner'] -class ClassesSerializer(serializers.HyperlinkedModelSerializer): +class ClassSerializer(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') class Meta: - model = Classes + model = Class # 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) + # Class = ClassSerializer(many=True, read_only=True,allow_null=True) owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Student - # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner'] - fields = ['grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner'] + # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','Class','added_to','completed', 'repo','owner'] + fields = ['grade','email','student_id', 'git','ion_user','Class','added_to','completed', 'repo','owner'] class TeacherSerializer(serializers.ModelSerializer): - # classes = ClassesSerializer(many=True, read_only=True,allow_null=True) + # Class = ClassSerializer(many=True, read_only=True,allow_null=True) owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Teacher - # fields = ['url','first_name', 'last_name','git','ion_user', 'email','classes','owner'] - fields = ['first_name', 'last_name','git','ion_user', 'email','classes','owner'] - - + # fields = ['url','first_name', 'last_name','git','ion_user', 'email','Class','owner'] + fields = ['first_name', 'last_name','git','ion_user', 'email','Class','owner'] diff --git a/Website/users/views.py b/Website/users/views.py index 8047b35..5db1791 100644 --- a/Website/users/views.py +++ b/Website/users/views.py @@ -97,12 +97,14 @@ def create_account (request): last_name=last_name, password=password) user.save() - token.delete() + if isStudent: profile = Student(user=user, git=git, grade=grade) else: - profile = Teacher(user=user, git=git) + profile = Teacher(user=user, username=username, git=git) + + token.delete() profile.save() From b8c17561a3da38e14b9f988ab60bc0129b31e3f7 Mon Sep 17 00:00:00 2001 From: rushilwiz Date: Mon, 15 Jun 2020 17:57:47 -0400 Subject: [PATCH 2/8] Fixed some files that broke over merge --- .gitignore | 4 +++ Website/api/migrations/0001_initial.py | 18 ++++++++--- .../api/migrations/0002_auto_20200615_0046.py | 31 ------------------- .../api/migrations/0003_auto_20200615_0233.py | 18 ----------- .../api/migrations/0004_auto_20200615_0255.py | 22 ------------- .../api/migrations/0005_auto_20200615_0048.py | 23 -------------- Website/api/models.py | 12 +------ Website/api/serializers.py | 28 ++++++++--------- Website/users/migrations/0001_initial.py | 26 ---------------- .../migrations/0002_auto_20200614_2044.py | 18 ----------- Website/users/migrations/0003_token_grade.py | 18 ----------- Website/users/migrations/__init__.py | 0 Website/users/views.py | 4 +-- 13 files changed, 34 insertions(+), 188 deletions(-) delete mode 100644 Website/api/migrations/0002_auto_20200615_0046.py delete mode 100644 Website/api/migrations/0003_auto_20200615_0233.py delete mode 100644 Website/api/migrations/0004_auto_20200615_0255.py delete mode 100644 Website/api/migrations/0005_auto_20200615_0048.py delete mode 100644 Website/users/migrations/0001_initial.py delete mode 100644 Website/users/migrations/0002_auto_20200614_2044.py delete mode 100644 Website/users/migrations/0003_token_grade.py delete mode 100644 Website/users/migrations/__init__.py diff --git a/.gitignore b/.gitignore index a70aeeb..9972c6c 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,10 @@ coverage.xml local_settings.py db.sqlite3 db.sqlite3-journal +migrations/ +*/migrations/ +**/**/migrations +**/migrations # Flask stuff: instance/ diff --git a/Website/api/migrations/0001_initial.py b/Website/api/migrations/0001_initial.py index 428a21e..1a81ffb 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-14 23:00 +# Generated by Django 3.0.7 on 2020-06-15 21:54 from django.conf import settings from django.db import migrations, models @@ -23,8 +23,6 @@ class Migration(migrations.Migration): ('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( @@ -42,8 +40,9 @@ class Migration(migrations.Migration): name='Teacher', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ion_user', models.CharField(max_length=100)), ('git', models.CharField(blank=True, default='', max_length=100)), - ('classes', models.ManyToManyField(to='api.Class')), + ('classes', models.ManyToManyField(blank=True, related_name='classes', to='api.Class')), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), @@ -51,6 +50,7 @@ class Migration(migrations.Migration): name='Student', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ion_user', models.CharField(max_length=100)), ('grade', models.IntegerField(blank=True, default=0)), ('git', models.CharField(blank=True, default='', max_length=100)), ('repo', models.URLField(blank=True, default='')), @@ -60,6 +60,16 @@ class Migration(migrations.Migration): ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), + migrations.AddField( + model_name='class', + name='confirmed', + field=models.ManyToManyField(blank=True, related_name='confirmed', to='api.Student'), + ), + migrations.AddField( + model_name='class', + name='unconfirmed', + field=models.ManyToManyField(blank=True, related_name='unconfirmed', to='api.Student'), + ), migrations.CreateModel( name='Assignment', fields=[ diff --git a/Website/api/migrations/0002_auto_20200615_0046.py b/Website/api/migrations/0002_auto_20200615_0046.py deleted file mode 100644 index 94bb36e..0000000 --- a/Website/api/migrations/0002_auto_20200615_0046.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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'), - ), - ] diff --git a/Website/api/migrations/0003_auto_20200615_0233.py b/Website/api/migrations/0003_auto_20200615_0233.py deleted file mode 100644 index 031aa1a..0000000 --- a/Website/api/migrations/0003_auto_20200615_0233.py +++ /dev/null @@ -1,18 +0,0 @@ -# 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'), - ), - ] diff --git a/Website/api/migrations/0004_auto_20200615_0255.py b/Website/api/migrations/0004_auto_20200615_0255.py deleted file mode 100644 index e126c18..0000000 --- a/Website/api/migrations/0004_auto_20200615_0255.py +++ /dev/null @@ -1,22 +0,0 @@ -# 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'), - ), - ] diff --git a/Website/api/migrations/0005_auto_20200615_0048.py b/Website/api/migrations/0005_auto_20200615_0048.py deleted file mode 100644 index 1a60cfd..0000000 --- a/Website/api/migrations/0005_auto_20200615_0048.py +++ /dev/null @@ -1,23 +0,0 @@ -# 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, - ), - ] diff --git a/Website/api/models.py b/Website/api/models.py index 4d8c0ee..8481f53 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -39,7 +39,7 @@ class Class(models.Model): class Teacher(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) - username = models.CharField(max_length=100) + ion_user = models.CharField(max_length=100) classes=models.ManyToManyField(Class, blank=True, related_name='classes') git=models.CharField(max_length=100, default="", blank=True) @@ -50,16 +50,6 @@ class Teacher(models.Model): 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) - diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 238d6c1..9b55700 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -1,5 +1,5 @@ from django.contrib.auth.models import User, Group -from .models import Student, Teacher, Classes, Assignment, DefFiles +from .models import Student, Teacher, Class, Assignment, DefFiles from rest_framework import serializers, permissions from django.contrib.auth.models import User from .permissions import IsOwnerOrReadOnly,isTeacher @@ -15,40 +15,38 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): # class DefFilesSerializer(serializers.HyperlinkedModelSerializer): # class Meta: # model = DefFiles -# fields = ['name', 'path','assignment','classes', "teacher",'url', 'id'] +# fields = ['name', 'path','assignment','Class', "teacher",'url', 'id'] class AssignmentSerializer(serializers.HyperlinkedModelSerializer): - #permissions_classes = [permissions.IsAuthenticatedOrReadOnly] + #permissions_Class = [permissions.IsAuthenticatedOrReadOnly] # files = DefFilesSerializer(many=True, read_only=True,allow_null=True) owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Assignment - # fields = ['url','name', 'due_date', 'path' , "classes","teacher",'owner'] - fields = ['name', 'due_date', 'path' , "classes","teacher",'owner'] + # fields = ['url','name', 'due_date', 'path' , "Class","teacher",'owner'] + fields = ['name', 'due_date', 'path' , "Class","teacher",'owner'] -class ClassesSerializer(serializers.HyperlinkedModelSerializer): +class ClassSerializer(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') class Meta: - model = Classes + model = Class # 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) + # Class = ClassSerializer(many=True, read_only=True,allow_null=True) 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','grade', 'ion_user','git','user','classes','added_to','completed', 'repo'] + # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','Class','added_to','completed', 'repo','owner'] + fields = ['url','grade', 'ion_user','git','user','Class','added_to','completed', 'repo'] class TeacherSerializer(serializers.ModelSerializer): - # classes = ClassesSerializer(many=True, read_only=True,allow_null=True) + # Class = ClassSerializer(many=True, read_only=True,allow_null=True) owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Teacher - # fields = ['url','first_name', 'last_name','git','ion_user', 'email','classes','owner'] - fields = ['first_name', 'last_name','git','ion_user', 'email','classes','owner'] - - + # fields = ['url','first_name', 'last_name','git','ion_user', 'email','Class','owner'] + fields = ['first_name', 'last_name','git','ion_user', 'email','Class','owner'] diff --git a/Website/users/migrations/0001_initial.py b/Website/users/migrations/0001_initial.py deleted file mode 100644 index 1c06dee..0000000 --- a/Website/users/migrations/0001_initial.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.0.7 on 2020-06-14 19:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Token', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('username', models.TextField()), - ('email', models.TextField()), - ('first_name', models.TextField()), - ('last_name', models.TextField()), - ('isStudent', models.BooleanField()), - ('token', models.CharField(max_length=255)), - ], - ), - ] diff --git a/Website/users/migrations/0002_auto_20200614_2044.py b/Website/users/migrations/0002_auto_20200614_2044.py deleted file mode 100644 index 2f6941c..0000000 --- a/Website/users/migrations/0002_auto_20200614_2044.py +++ /dev/null @@ -1,18 +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 = [ - ('users', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='token', - name='isStudent', - field=models.BooleanField(default=True), - ), - ] diff --git a/Website/users/migrations/0003_token_grade.py b/Website/users/migrations/0003_token_grade.py deleted file mode 100644 index 4b0788c..0000000 --- a/Website/users/migrations/0003_token_grade.py +++ /dev/null @@ -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 = [ - ('users', '0002_auto_20200614_2044'), - ] - - operations = [ - migrations.AddField( - model_name='token', - name='grade', - field=models.IntegerField(default=9), - ), - ] diff --git a/Website/users/migrations/__init__.py b/Website/users/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Website/users/views.py b/Website/users/views.py index 303bb95..929415c 100644 --- a/Website/users/views.py +++ b/Website/users/views.py @@ -102,10 +102,10 @@ def create_account (request): if isStudent: profile = Student(user=user, git=git, grade=grade, ion_user=username) else: - + profile = Teacher(user=user, git=git, ion_user=usernam) profile.save() - + token.delete() print (user) messages.success(request, "Your SkoolOS account has successfully been created") return redirect(f'/login/?username={username}') From 06e56352ee5e8b6611fafcf625430c28b333a90f Mon Sep 17 00:00:00 2001 From: Raffu Khondaker <2022rkhondak@tjhsst.edu> Date: Mon, 15 Jun 2020 18:31:18 -0400 Subject: [PATCH 3/8] cli update --- .profiles | 1 + CLI/student.py | 24 ++--- Website/api/migrations/0001_initial.py | 18 +++- .../api/migrations/0002_auto_20200615_0046.py | 31 ------ ...615_0048.py => 0002_auto_20200615_2019.py} | 10 +- .../api/migrations/0003_auto_20200615_0233.py | 18 ---- .../api/migrations/0004_auto_20200615_0255.py | 22 ---- Website/api/models.py | 21 ++-- Website/api/serializers.py | 16 +-- Website/api/views.py | 21 ++-- skoolos.py | 101 +++++++++++------- snew.py | 99 +++++++++++++++++ 12 files changed, 217 insertions(+), 165 deletions(-) create mode 100644 .profiles delete mode 100644 Website/api/migrations/0002_auto_20200615_0046.py rename Website/api/migrations/{0005_auto_20200615_0048.py => 0002_auto_20200615_2019.py} (53%) delete mode 100644 Website/api/migrations/0003_auto_20200615_0233.py delete mode 100644 Website/api/migrations/0004_auto_20200615_0255.py create mode 100644 snew.py diff --git a/.profiles b/.profiles new file mode 100644 index 0000000..544f6b1 --- /dev/null +++ b/.profiles @@ -0,0 +1 @@ +{"username": "2022rkhondak", "grade": 10, "is_student": true, "password": "hackgroup1"} \ No newline at end of file diff --git a/CLI/student.py b/CLI/student.py index daec0d5..89985a8 100644 --- a/CLI/student.py +++ b/CLI/student.py @@ -43,6 +43,11 @@ def putDB(data, url): print("PUT:" + str(r.status_code)) return(r.json()) +def patchDB(data, url): + r = requests.patch(url = url, data=data, auth=('raffukhondaker','hackgroup1')) + print("PATH:" + str(r.status_code)) + return(r.json()) + def delDB(url): r = requests.delete(url = url, auth=('raffukhondaker','hackgroup1')) print("DELETE:" + str(r.status_code)) @@ -129,17 +134,9 @@ class Student: os.chdir(cdir) self.repo = 'https://github.com/' + self.git + '/' + self.username + '.git' data={ - 'user':self.user, - 'git':self.git, - 'ion_user':self.username, - 'added_to':self.snew, - 'url':self.url, - 'classes':self.sclass, - 'grade':self.grade, - 'completed':self.completed, 'repo':self.repo } - print(putDB(data, self.url)) + print(patchDB(data, self.url)) print("Synced to " + self.username) def getClasses(self): @@ -279,17 +276,10 @@ class Student: #update teacher instance in db, classes field data={ 'user':self.user, - 'git':self.git, - 'ion_user':self.username, - 'student_id':self.student_id, 'added_to':self.snew, - 'url':self.url, - 'classes':self.sclass, - 'grade':self.grade, - 'completed':self.completed } print(self.url) - print(putDB(data, self.url)) + print(patchDB(data, self.url)) return data def submit(self, path): diff --git a/Website/api/migrations/0001_initial.py b/Website/api/migrations/0001_initial.py index 428a21e..c2e7fd2 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-14 23:00 +# Generated by Django 3.0.7 on 2020-06-15 19:24 from django.conf import settings from django.db import migrations, models @@ -23,8 +23,6 @@ class Migration(migrations.Migration): ('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( @@ -43,23 +41,33 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('git', models.CharField(blank=True, default='', max_length=100)), - ('classes', models.ManyToManyField(to='api.Class')), + ('classes', models.ManyToManyField(blank=True, related_name='classes', to='api.Class')), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='Student', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('grade', models.IntegerField(blank=True, default=0)), ('git', models.CharField(blank=True, default='', max_length=100)), ('repo', models.URLField(blank=True, default='')), ('classes', models.CharField(blank=True, default='', max_length=100)), ('added_to', models.CharField(blank=True, default='', max_length=100)), ('completed', models.TextField(blank=True, default='')), + ('ion_user', models.CharField(max_length=100, primary_key=True, serialize=False)), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), + migrations.AddField( + model_name='class', + name='confirmed', + field=models.ManyToManyField(blank=True, related_name='confirmed', to='api.Student'), + ), + migrations.AddField( + model_name='class', + name='unconfirmed', + field=models.ManyToManyField(blank=True, related_name='unconfirmed', to='api.Student'), + ), migrations.CreateModel( name='Assignment', fields=[ diff --git a/Website/api/migrations/0002_auto_20200615_0046.py b/Website/api/migrations/0002_auto_20200615_0046.py deleted file mode 100644 index 94bb36e..0000000 --- a/Website/api/migrations/0002_auto_20200615_0046.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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'), - ), - ] diff --git a/Website/api/migrations/0005_auto_20200615_0048.py b/Website/api/migrations/0002_auto_20200615_2019.py similarity index 53% rename from Website/api/migrations/0005_auto_20200615_0048.py rename to Website/api/migrations/0002_auto_20200615_2019.py index 1a60cfd..9ea0f96 100644 --- a/Website/api/migrations/0005_auto_20200615_0048.py +++ b/Website/api/migrations/0002_auto_20200615_2019.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.7 on 2020-06-15 00:48 +# Generated by Django 3.0.7 on 2020-06-15 20:19 from django.db import migrations, models @@ -6,18 +6,18 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('api', '0004_auto_20200614_2107'), + ('api', '0001_initial'), ] operations = [ migrations.RemoveField( - model_name='student', + model_name='teacher', name='id', ), migrations.AddField( - model_name='student', + model_name='teacher', name='ion_user', - field=models.CharField(default='2022rkhondak', max_length=100, primary_key=True, serialize=False), + field=models.CharField(default='eharris1', max_length=100, primary_key=True, serialize=False), preserve_default=False, ), ] diff --git a/Website/api/migrations/0003_auto_20200615_0233.py b/Website/api/migrations/0003_auto_20200615_0233.py deleted file mode 100644 index 031aa1a..0000000 --- a/Website/api/migrations/0003_auto_20200615_0233.py +++ /dev/null @@ -1,18 +0,0 @@ -# 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'), - ), - ] diff --git a/Website/api/migrations/0004_auto_20200615_0255.py b/Website/api/migrations/0004_auto_20200615_0255.py deleted file mode 100644 index e126c18..0000000 --- a/Website/api/migrations/0004_auto_20200615_0255.py +++ /dev/null @@ -1,22 +0,0 @@ -# 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'), - ), - ] diff --git a/Website/api/models.py b/Website/api/models.py index e7f4f6d..ece9eac 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -11,6 +11,7 @@ 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) + ion_user=models.CharField(primary_key=True, max_length=100) def save(self, *args, **kwargs): super(Student, self).save(*args, **kwargs) @@ -40,7 +41,7 @@ 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) def __str__(self): return f"{self.user.username}'s Profile" @@ -48,15 +49,15 @@ class Teacher(models.Model): 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 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) diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 238d6c1..3377d9e 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -1,5 +1,5 @@ from django.contrib.auth.models import User, Group -from .models import Student, Teacher, Classes, Assignment, DefFiles +from .models import Student, Teacher, Class, Assignment, DefFiles from rest_framework import serializers, permissions from django.contrib.auth.models import User from .permissions import IsOwnerOrReadOnly,isTeacher @@ -30,11 +30,11 @@ class AssignmentSerializer(serializers.HyperlinkedModelSerializer): 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') + #owner = serializers.ReadOnlyField(source='owner.username') class Meta: - model = Classes + model = Class # fields = ['url','name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner'] - fields = ['name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner'] + fields = ['name', 'repo','path','assignments',"default_file", 'confirmed', 'unconfirmed'] class StudentSerializer(serializers.HyperlinkedModelSerializer): # classes = ClassesSerializer(many=True, read_only=True,allow_null=True) @@ -43,12 +43,12 @@ class StudentSerializer(serializers.HyperlinkedModelSerializer): # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','classes','added_to','completed', 'repo','owner'] fields = ['url','grade', 'ion_user','git','user','classes','added_to','completed', 'repo'] -class TeacherSerializer(serializers.ModelSerializer): - # classes = ClassesSerializer(many=True, read_only=True,allow_null=True) - owner = serializers.ReadOnlyField(source='owner.username') +class TeacherSerializer(serializers.HyperlinkedModelSerializer): + classes = ClassesSerializer(many=True, read_only=True,allow_null=True) + #owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Teacher # fields = ['url','first_name', 'last_name','git','ion_user', 'email','classes','owner'] - fields = ['first_name', 'last_name','git','ion_user', 'email','classes','owner'] + fields = ['git','classes','user', 'url'] diff --git a/Website/api/views.py b/Website/api/views.py index 11af2b1..8213adc 100644 --- a/Website/api/views.py +++ b/Website/api/views.py @@ -1,5 +1,5 @@ from .models import Student, Teacher, Class, Assignment, DefFiles -from .serializers import StudentSerializer, TeacherSerializer, ClassSerializer, AssignmentSerializer, UserSerializer +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 @@ -10,7 +10,6 @@ from rest_framework.parsers import JSONParser from rest_framework.response import Response - class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer @@ -26,7 +25,7 @@ class StudentViewSet(viewsets.ModelViewSet): permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly] def perform_create(self, serializer): - serializer.save(owner=self.request.user) + serializer.save(user=self.request.user) class TeacherViewSet(viewsets.ModelViewSet): """ @@ -37,22 +36,22 @@ class TeacherViewSet(viewsets.ModelViewSet): permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly] def perform_create(self, serializer): - serializer.save(owner=self.request.user) + serializer.save(user=self.request.user) class ClassViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. """ queryset = Class.objects.all() - serializer_class = ClassSerializer + serializer_class = ClassesSerializer permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly] - def perform_create(self, serializer): - if(self.request.user.groups.filter(name__in=['teachers']).exists() or self.request.user.is_superuser): - serializer.save(owner=self.request.user) - else: - print("UNAUTHORIZED POST") - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + # 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): diff --git a/skoolos.py b/skoolos.py index 1cfb9e3..a5ce0e0 100644 --- a/skoolos.py +++ b/skoolos.py @@ -65,66 +65,91 @@ def studentCLI(user, password): from CLI import student data = getUser(user, password) student = student.Student(data) - choices = ['1) View Class','2) Exit SkoolOS'] - questions = [ + carray = student.sclass.split(",") + if(len(carray) == 1 and carray[0] == ""): + print("No classes") + return + + carray.append("Exit SkoolOS") + courses = [ { 'type': 'list', - 'name': 'choice', - 'choices':choices, + 'name': 'course', + 'choices':carray, '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): + course = prompt(courses) + if course == "Exit SkoolOS": student.exitCLI() + else: + student.viewClass(course) def teacherCLI(user, password): from CLI import teacher data = getUser(user, password) teacher = teacher.Teacher(data) - choices = ['1) View Class','2) Exit SkoolOS'] - questions = [ + # 1. make a class + # 2. add studeents to an existing class + # 3. Get progress logs on a student + # 2. make an assignment for a class + # 3. view student submissions for an assignment + carray = teacher.sclass.split(",") + carray.remove("") + carray.append("Exit SkoolOS") + carray.append("Make New Class") + courses = [ { 'type': 'list', - 'name': 'choice', - 'choices':choices, + 'name': 'course', + 'choices':carray, '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 = [ + course = prompt(courses) + if course == "Exit SkoolOS": + teacher.exitCLI() + if course == "Make New Class": + questions = [ + { + 'type': 'input', + 'name': 'cname', + 'message': 'Class Name: ', + }, + ] + cname = prompt(questions) + teacher.makeClass(cname) + soption = ["1) Add individual student", "2) Add list of students through path", "3) Exit"] + questions = [ + { + 'type': 'list', + 'choices':soption, + 'name': 'students', + 'message': 'Add list of students (input path): ', + }, + ] + choice = prompt(questions).split(")") + if("1" == choice): + s = input("Student name: ") + teacher.addStudent(s, cname) + if("2" == choice): + p = input("Relativee Path: ") + if(os.path.exists(p)): + print(p + " does not exist.") + + else: + print("Class: " + cname) + options = ['1) Add student', "2) Add assignment", "3) View student information"] + questions = [ { 'type': 'list', 'name': 'course', - 'choices':carray, - 'message': 'Select class: ', + 'choices':options, + 'message': 'Select option: ', }, ] - course = prompt(courses) - if(choice == 2): - student.exitCLI() + option = prompt(questions) def getUser(ion_user, password): URL = "http://127.0.0.1:8000/api/students/" + ion_user + "/" diff --git a/snew.py b/snew.py new file mode 100644 index 0000000..b48f7ec --- /dev/null +++ b/snew.py @@ -0,0 +1,99 @@ +import sys +from urllib.parse import urlparse +import requests +from requests_oauthlib import OAuth2Session +from selenium import webdriver +import os.path +import time +import http.server +import socketserver +from threading import Thread +from werkzeug.urls import url_decode +import pprint +from PyInquirer import prompt, print_json +import json +import os +import argparse +import webbrowser +import subprocess + +from django.conf import settings +import django + +from Website.config.settings import DATABASES, INSTALLED_APPS +INSTALLED_APPS.remove('users.apps.UsersConfig') +INSTALLED_APPS.remove('api') +INSTALLED_APPS.remove('skoolos.apps.SkoolosConfig') +INSTALLED_APPS.append('Website.api') +settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS) +django.setup() + +from Website.api.models import * + +def command(command): + ar = [] + command = command.split(" ") + for c in command: + ar.append(c) + process = subprocess.Popen(ar, stdout=subprocess.PIPE,stderr=subprocess.PIPE) + p=process.poll() + output = process.communicate()[0] + print(output.decode('utf-8')) + return output.decode('utf-8') + +class Students: + def __init__(self, username): + self.student = Student.objects.get(ion_user = username) + #ion id: student.user + if(os.path.isdir(self.student.user) == False): + if(self.student.repo == ""): + user= self.student.git + pwd= input("Enter Github password: ") + #curl -i -u USER:PASSWORD -d '{"name":"REPO"}' https://api.github.com/user/repos + url= "curl -i -u " + user + ":" + pwd + " -d '" + '{"name":"' + self.username + '"}' + "' " + "https://api.github.com/user/repos" + print(url) + os.system(url) + cdir = os.getcwd() + command('git clone https://github.com/' + self.git + '/' + self.username + '.git') + os.chdir(self.username) + command('git checkout master') + command('touch README.md') + command('git add README.md') + command('git commit -m "Hello"') + command('git push -u origin master') + os.chdir(cdir) + self.repo = 'https://github.com/' + self.git + '/' + self.username + '.git' + data={ + 'user':self.user, + 'git':self.git, + 'ion_user':self.username, + 'added_to':self.snew, + 'url':self.url, + 'classes':self.sclass, + 'grade':self.grade, + 'completed':self.completed, + 'repo':self.repo + } + print(putDB(data, self.url)) + print("Synced to " + self.username) + + +# c = { +# 'name':'Math5' +# } + +# c = Class.objects.get(name='Math5') +data = requests.get(url = "http://localhost:8000/api/classes/Math5", auth=('raffukhondaker','hackgroup1')).json() +c = Class( + name="data['name']" +) +# print("POST:" + str(r.status_code)) +# print(r.json()) +c = { + 'classes':"http://localhost:8000/api/classes/Math5/" +} +# print(c) +r = requests.patch(url = "http://localhost:8000/api/teachers/2/", data=c, auth=('raffukhondaker','hackgroup1')) +print(r.json()) + + From bdc8792b6c273825df268993d8436ab91c3c37d6 Mon Sep 17 00:00:00 2001 From: Raffu Khondaker <2022rkhondak@tjhsst.edu> Date: Mon, 15 Jun 2020 19:08:58 -0400 Subject: [PATCH 4/8] serializere fix --- CLI/student.py | 2 +- Website/api/serializers.py | 2 +- Website/api/views.py | 4 ++-- skoolos.py | 7 ++++++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CLI/student.py b/CLI/student.py index 89985a8..5d6ad51 100644 --- a/CLI/student.py +++ b/CLI/student.py @@ -160,7 +160,7 @@ class Student: zero = datetime.timedelta(0,0) #check due ddate is in span range is now past date (- timdelta) if(diff < span and diff > zero): - print((now-due)) + print(a + " due in:" + str(now-due)) except Exception as e: print(e) diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 6c3e8c9..9e8d9a7 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -41,7 +41,7 @@ class StudentSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Student # fields = ['url','first_name', 'last_name', 'grade','email','student_id', 'git','ion_user','Class','added_to','completed', 'repo','owner'] - fields = ['url','grade', 'ion_user','git','user','Class','added_to','completed', 'repo'] + fields = ['url','grade', 'ion_user','git','user','classes','added_to','completed', 'repo'] class TeacherSerializer(serializers.ModelSerializer): # Class = ClassSerializer(many=True, read_only=True,allow_null=True) diff --git a/Website/api/views.py b/Website/api/views.py index 8213adc..e5d877b 100644 --- a/Website/api/views.py +++ b/Website/api/views.py @@ -1,5 +1,5 @@ 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 django.http import Http404 from rest_framework.views import APIView @@ -43,7 +43,7 @@ class ClassViewSet(viewsets.ModelViewSet): API endpoint that allows users to be viewed or edited. """ queryset = Class.objects.all() - serializer_class = ClassesSerializer + serializer_class = ClassSerializer permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly] # def perform_create(self, serializer): diff --git a/skoolos.py b/skoolos.py index a5ce0e0..bec621e 100644 --- a/skoolos.py +++ b/skoolos.py @@ -12,6 +12,7 @@ from werkzeug.urls import url_decode import pprint from PyInquirer import prompt, print_json import json +import datetime import os import argparse import webbrowser @@ -84,7 +85,7 @@ def studentCLI(user, password): student.exitCLI() else: student.viewClass(course) - + student.getAssignments(course, datetime.datetime.now()) def teacherCLI(user, password): from CLI import teacher @@ -166,6 +167,10 @@ def getUser(ion_user, password): else: return None print(r.status_code) +def patchDB(data, url): + r = requests.patch(url = url, data=data, auth=('raffukhondaker','hackgroup1')) + print("PATH:" + str(r.status_code)) + return(r.json()) def getDB(url): r = requests.get(url = url, auth=('raffukhondaker','hackgroup1')) From 51b5b21d40c50ec64d95ba318e4ca7646f5dc130 Mon Sep 17 00:00:00 2001 From: Raffu Khondaker <2022rkhondak@tjhsst.edu> Date: Mon, 15 Jun 2020 19:29:23 -0400 Subject: [PATCH 5/8] teachers group --- Website/api/maker.py | 4 ++++ Website/api/models.py | 1 - Website/api/serializers.py | 4 ++-- Website/api/views.py | 3 +++ Website/users/views.py | 8 ++++++-- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Website/api/maker.py b/Website/api/maker.py index 0f0b07f..18afd33 100644 --- a/Website/api/maker.py +++ b/Website/api/maker.py @@ -1,3 +1,7 @@ +from django.contrib.auth.models import Group + +g, created = Group.objects.get_or_create(name='teachers') + # from datetime import datetime # # f1 = DefFiles( diff --git a/Website/api/models.py b/Website/api/models.py index b1ea631..67bbd8b 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -40,7 +40,6 @@ class Class(models.Model): class Teacher(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) - ion_user = models.CharField(max_length=100) 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) diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 9e8d9a7..2e6b2b8 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -45,8 +45,8 @@ class StudentSerializer(serializers.HyperlinkedModelSerializer): class TeacherSerializer(serializers.ModelSerializer): # Class = ClassSerializer(many=True, read_only=True,allow_null=True) - owner = serializers.ReadOnlyField(source='owner.username') + #owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Teacher # fields = ['url','first_name', 'last_name','git','ion_user', 'email','Class','owner'] - fields = ['first_name', 'last_name','git','ion_user', 'email','Class','owner'] + fields = ['git','ion_user','classes','user'] diff --git a/Website/api/views.py b/Website/api/views.py index e5d877b..65de23f 100644 --- a/Website/api/views.py +++ b/Website/api/views.py @@ -8,6 +8,7 @@ from .permissions import isTeacher, IsOwnerOrReadOnly from django.shortcuts import render, redirect from rest_framework.parsers import JSONParser from rest_framework.response import Response +from django.contrib.auth.models import Group class UserViewSet(viewsets.ModelViewSet): @@ -23,6 +24,8 @@ class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly] + g, created = Group.objects.get_or_create(name='teachers') + def perform_create(self, serializer): serializer.save(user=self.request.user) diff --git a/Website/users/views.py b/Website/users/views.py index 929415c..ce417d8 100644 --- a/Website/users/views.py +++ b/Website/users/views.py @@ -8,6 +8,7 @@ from django.contrib import messages from .models import Token from api.models import Student, Teacher +from django.contrib.auth.models import Group from .forms import UserCreationForm @@ -97,12 +98,15 @@ def create_account (request): last_name=last_name, password=password) user.save() - + g, created = Group.objects.get_or_create(name='teachers') if isStudent: profile = Student(user=user, git=git, grade=grade, ion_user=username) else: - profile = Teacher(user=user, git=git, ion_user=usernam) + profile = Teacher(user=user, git=git, ion_user=username) + group = Group.objects.get(name='teachers') + user.groups.add(group) + profile.save() token.delete() From 98ca37999131c5cddb62c35c95851d18089c70e9 Mon Sep 17 00:00:00 2001 From: rushilwiz Date: Mon, 15 Jun 2020 19:34:57 -0400 Subject: [PATCH 6/8] Updated class model and created class detail view --- Website/api/models.py | 11 +++++++++-- Website/skoolos/templates/skoolos/home.html | 2 +- Website/skoolos/urls.py | 3 ++- Website/skoolos/views.py | 9 +++++++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Website/api/models.py b/Website/api/models.py index 8481f53..cd29952 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -1,5 +1,6 @@ from django.db import models from django.contrib.auth.models import User +import secrets @@ -21,9 +22,10 @@ class Student(models.Model): class Class(models.Model): name = models.CharField(primary_key=True, max_length=100) + id = models.CharField(max_length=8, blank=True, null=True) description = models.CharField(default="Class Description", max_length=500) repo=models.URLField(default="", blank=True) - path=models.CharField(max_length=100, default="") + 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') @@ -32,6 +34,12 @@ class Class(models.Model): # assignments = models.ManyToManyField(Assignment, default="") # default_file = models.ManyToManyField(DefFiles) def save(self, *args, **kwargs): + id = self.id + if not id: + id = secrets.token_urlsafe()[:8].lower() + while Class.objects.filter(id=id).exclude(pk=self.pk).exists(): + id = sercrets.token_urlsafe()[:8].lower() + self.id = id return super(Class, self).save(*args, **kwargs) def __str__(self): @@ -55,7 +63,6 @@ class Teacher(models.Model): 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) diff --git a/Website/skoolos/templates/skoolos/home.html b/Website/skoolos/templates/skoolos/home.html index 621c328..d6e5432 100644 --- a/Website/skoolos/templates/skoolos/home.html +++ b/Website/skoolos/templates/skoolos/home.html @@ -3,7 +3,7 @@
{% for class in classes %}
- +
{{ class.name }}

{{ class.description }}

diff --git a/Website/skoolos/urls.py b/Website/skoolos/urls.py index a8ffe34..182fea5 100644 --- a/Website/skoolos/urls.py +++ b/Website/skoolos/urls.py @@ -5,5 +5,6 @@ from . import views # Additionally, we include login URLs for the browsable API. urlpatterns = [ path('', views.home, name='home'), - path('profile/', views.profile, name='profile') + path('profile/', views.profile, name='profile'), + path("class/", views.classDetail, name="class"), ] diff --git a/Website/skoolos/views.py b/Website/skoolos/views.py index b654c11..2748b71 100644 --- a/Website/skoolos/views.py +++ b/Website/skoolos/views.py @@ -1,7 +1,8 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required +from django.views.generic import ListView -from api.models import Student, Teacher +from api.models import Student, Teacher, Class, Assignment # Create your views here. @@ -24,3 +25,7 @@ def home (request): @login_required() def profile (request): pass + +def classDetail (request, id): + classObj = Class.objects.get(id=id) + return redirect('/') From f7cac96ee2f3200e96fa5f4439309050d3fec162 Mon Sep 17 00:00:00 2001 From: rushilwiz Date: Mon, 15 Jun 2020 19:36:05 -0400 Subject: [PATCH 7/8] fixed student --- Website/api/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Website/api/models.py b/Website/api/models.py index 65545d2..09c9c91 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -13,7 +13,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) - ion_user=models.CharField(primary_key=True, max_length=100) def save(self, *args, **kwargs): super(Student, self).save(*args, **kwargs) From aaa750e4153ea92b189c1a15ca7ac4e64ec188fb Mon Sep 17 00:00:00 2001 From: Raffu Khondaker <2022rkhondak@tjhsst.edu> Date: Mon, 15 Jun 2020 20:31:38 -0400 Subject: [PATCH 8/8] teacher field --- .profiles | 1 - CLI/teacher.py | 35 ++++++++++++++++++----------------- Website/api/models.py | 33 ++++++++++++++++----------------- Website/api/serializers.py | 4 ++-- Website/api/views.py | 2 -- skoolos.py | 2 +- snew.py | 17 +++++++++-------- 7 files changed, 46 insertions(+), 48 deletions(-) delete mode 100644 .profiles diff --git a/.profiles b/.profiles deleted file mode 100644 index 544f6b1..0000000 --- a/.profiles +++ /dev/null @@ -1 +0,0 @@ -{"username": "2022rkhondak", "grade": 10, "is_student": true, "password": "hackgroup1"} \ No newline at end of file diff --git a/CLI/teacher.py b/CLI/teacher.py index fa82ca8..79673aa 100644 --- a/CLI/teacher.py +++ b/CLI/teacher.py @@ -9,7 +9,18 @@ import time import pyperclip from distutils.dir_util import copy_tree from datetime import datetime +from django.conf import settings +import django +from Website.config.settings import DATABASES, INSTALLED_APPS +INSTALLED_APPS.remove('users.apps.UsersConfig') +INSTALLED_APPS.remove('api') +INSTALLED_APPS.remove('skoolos.apps.SkoolosConfig') +INSTALLED_APPS.append('Website.api') +settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS) +django.setup() + +from Website.api.models import * #git clone student directory ==> /classes/assignments #get teacher info from api @@ -33,6 +44,10 @@ def getDB(url): r = requests.get(url = url, auth=('raffukhondaker','hackgroup1')) print("GET:" + str(r.status_code)) return(r.json()) +def patchDB(data, url): + r = requests.patch(url = url, data=data, auth=('raffukhondaker','hackgroup1')) + print("PATH:" + str(r.status_code)) + return(r.json()) def postDB(data, url): r = requests.post(url = url, data=data, auth=('raffukhondaker','hackgroup1')) @@ -69,25 +84,10 @@ class Teacher: self.git=data['git'] self.username=data['ion_user'] self.url= "http://127.0.0.1:8000/api/teachers/" + self.username + "/" - self.email = data['email'] #classes in id form (Example: 4,5) - cid=data['classes'].split(",") - try: - cid.remove('') - except: - pass - try: - cid.remove("") - except: - pass - classes=[] - for c in cid: - url = "http://127.0.0.1:8000/api/classes/" + str(c) + "/" - classes.append(getDB(url)) - - self.classes = classes - self.sclass=str(data['classes']) + #array + self.classes=data['classes'] if(os.path.isdir(self.username + "/Students")): print("Synced to " + self.username) else: @@ -168,6 +168,7 @@ class Teacher: #add to instance #upate self.classes self.classes.append(data) + patchDB(data, self.url) if(len(self.sclass)==0): self.sclass = data['name'] else: diff --git a/Website/api/models.py b/Website/api/models.py index 67bbd8b..fe87338 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -20,12 +20,27 @@ class Student(models.Model): def __str__(self): return f"{self.user.username}'s Profile" +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 Class(models.Model): + owner = models.ForeignKey('auth.User', related_name='classes', on_delete=models.CASCADE) + teacher = models.CharField(max_length=100) 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) + assignments=models.ManyToManyField(Assignment, 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') @@ -61,22 +76,6 @@ class Teacher(models.Model): # 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) diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 2e6b2b8..5d87c60 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -34,7 +34,7 @@ class ClassSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Class # fields = ['url','name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed','owner'] - fields = ['name', 'repo','path','assignments',"default_file", 'confirmed', 'unconfirmed'] + fields = ['name', 'repo','path','assignments',"teacher","default_file", 'confirmed', 'unconfirmed','owner'] class StudentSerializer(serializers.HyperlinkedModelSerializer): # Class = ClassSerializer(many=True, read_only=True,allow_null=True) @@ -44,7 +44,7 @@ class StudentSerializer(serializers.HyperlinkedModelSerializer): fields = ['url','grade', 'ion_user','git','user','classes','added_to','completed', 'repo'] class TeacherSerializer(serializers.ModelSerializer): - # Class = ClassSerializer(many=True, read_only=True,allow_null=True) + #classes = ClassSerializer(many=True, read_only=True,allow_null=True) #owner = serializers.ReadOnlyField(source='owner.username') class Meta: model = Teacher diff --git a/Website/api/views.py b/Website/api/views.py index 65de23f..fb95e11 100644 --- a/Website/api/views.py +++ b/Website/api/views.py @@ -24,8 +24,6 @@ class StudentViewSet(viewsets.ModelViewSet): queryset = Student.objects.all() serializer_class = StudentSerializer permission_Class = [permissions.IsAuthenticated, IsOwnerOrReadOnly] - g, created = Group.objects.get_or_create(name='teachers') - def perform_create(self, serializer): serializer.save(user=self.request.user) diff --git a/skoolos.py b/skoolos.py index bec621e..501429e 100644 --- a/skoolos.py +++ b/skoolos.py @@ -40,7 +40,7 @@ def main(): URL = "http://127.0.0.1:8000/api/" r = requests.get(url = URL) except: - print("Stop any processes running on http://127.0.0.1:8000/ before continuing") + print("Run Django server on http://127.0.0.1:8000/ before continuing") sys.exit(0) input("Welcome to SkoolOS. Press any key to create an account") diff --git a/snew.py b/snew.py index b48f7ec..3edb6f4 100644 --- a/snew.py +++ b/snew.py @@ -84,16 +84,17 @@ class Students: # c = Class.objects.get(name='Math5') data = requests.get(url = "http://localhost:8000/api/classes/Math5", auth=('raffukhondaker','hackgroup1')).json() -c = Class( - name="data['name']" -) -# print("POST:" + str(r.status_code)) + +r = requests.post(url = "http://localhost:8000/api/classes/", data={'name':'English11', 'teacher':'eharris1', 'owner':2}, auth=('raffukhondaker','hackgroup1')) + +print("POST:" + str(r.status_code)) # print(r.json()) -c = { - 'classes':"http://localhost:8000/api/classes/Math5/" -} +# print(c.name) +# c = { +# 'classes':c +# } # print(c) -r = requests.patch(url = "http://localhost:8000/api/teachers/2/", data=c, auth=('raffukhondaker','hackgroup1')) +r = requests.patch(url = "http://localhost:8000/api/teachers/eharris1/", data={'classes':['English11']}, auth=('raffukhondaker','hackgroup1')) print(r.json())