From 5332a3281641a671919ba71ea83cc6856f14e6a6 Mon Sep 17 00:00:00 2001 From: Raffu Khondaker <2022rkhondak@tjhsst.edu> Date: Thu, 11 Jun 2020 16:13:05 -0400 Subject: [PATCH] adding-assignments --- CLI/back.py | 2 + CLI/s-git.py | 118 ++++--- CLI/t-git.py | 312 ++++++++++-------- .../api/migrations/0007_auto_20200611_0831.py | 22 ++ Website/api/models.py | 2 +- Website/api/serializers.py | 2 +- .../instructions.txt => Entry1/rubric.txt} | 0 .../Entry1/sample_entry.txt | 0 .../English11_eharris1/Entry2/instruct.txt | 0 .../Week1_HW/instructions.txt | 0 .../APBiology_sjfrank/Lab1/instructions.txt | 0 sjfrank/APBiology_sjfrank/README.md | 0 12 files changed, 267 insertions(+), 191 deletions(-) create mode 100644 CLI/back.py create mode 100644 Website/api/migrations/0007_auto_20200611_0831.py rename eharris1/English11_eharris1/{Journal1/instructions.txt => Entry1/rubric.txt} (100%) rename mlauerbach/Math5_mlauerbach/README.md => eharris1/English11_eharris1/Entry1/sample_entry.txt (100%) rename mlauerbach/Math5_mlauerbach/Test1/instructions.txt => eharris1/English11_eharris1/Entry2/instruct.txt (100%) delete mode 100644 mlauerbach/Math5_mlauerbach/Week1_HW/instructions.txt delete mode 100644 sjfrank/APBiology_sjfrank/Lab1/instructions.txt delete mode 100644 sjfrank/APBiology_sjfrank/README.md diff --git a/CLI/back.py b/CLI/back.py new file mode 100644 index 0000000..05cf8af --- /dev/null +++ b/CLI/back.py @@ -0,0 +1,2 @@ +import os +os.spawnl(os.P_DETACH, 'some_long_running_command') \ No newline at end of file diff --git a/CLI/s-git.py b/CLI/s-git.py index 91047f5..2720a4a 100644 --- a/CLI/s-git.py +++ b/CLI/s-git.py @@ -56,6 +56,7 @@ def command(command): p=process.poll() output = process.communicate()[0] print(output.decode('utf-8')) + return output.decode('utf-8') #################################################################################################################################### @@ -152,30 +153,35 @@ class Student: cdir = os.getcwd() os.chdir(self.username) for c in self.classes: - data = getDB("http://127.0.0.1:8000/classes/" + str(c['id'])) + print("UPDATING CLASS: " + str(c['name'])) + data = getDB("http://127.0.0.1:8000/classes/" + str(c['name'])) + command("git checkout master") command("git checkout " + data['name']) - command("git add " + data['name']) + command("git add .") command("git commit -m " + data['name']) command("git pull origin " + data['name']) command("git push -u origin " + data['name']) + command("git checkout master") os.chdir(cdir) for c in self.new: - self.addClass(str(c['id'])) + print("ADDING CLASS: " + str(c['name'])) + self.addClass(str(c['name'])) command("git checkout master") #class name format: _ #add classes from 'new' field def addClass(self, cid): - if((cid in self.snew) == False): - if((cid in self.sclass) == True): - print("Already enrolled in this class.") - return None - if((cid in self.snew) == True): - print("Not added by teacher yet.") - return None data = getDB('http://127.0.0.1:8000/classes/'+ str(cid)) + if((cid in self.snew) == False or (self.username in data['confirmed'])): + print("Already enrolled in this class.") + return None + if((cid in self.sclass) or (self.username in data['unconfirmed']) == False): + print("Not added by teacher yet.") + return None + + #add class teacher as cocllaborator to student repo print(os.getcwd()) pwd= input("Enter Github password: ") tgit = getDB("http://127.0.0.1:8000/teachers/" + data['teacher'] + "/")['git'] @@ -183,26 +189,7 @@ class Student: print(url) os.system(url) - data['unconfirmed'] = data['unconfirmed'].replace("," + self.username, "") - data['unconfirmed'] = data['unconfirmed'].replace(self.username, "") - data['confirmed'] = data['confirmed'] + "," + self.username - if(data['confirmed'][0] == ','): - data['confirmed'] = data['confirmed'][1:] - print(data['confirmed']) - print(putDB(data, 'http://127.0.0.1:8000/classes/'+ str(cid) + "/")) - - #add teacher as collaborator - #curl -i -u "USER:PASSWORDD" -X PUT -d '' 'https://api.github.com/repos/USER/REPO/collaborators/COLLABORATOR' - user = self.git - - self.classes.append(data) - if(len(self.sclass)==0): - self.sclass = data['id'] - else: - self.sclass = self.sclass + "," + str(data['id']) - cdir = os.getcwd() - print(cdir) # path1 = self.username + "/" + self.username # path2 = self.username # if(os.path.isdir(path1)): @@ -212,24 +199,46 @@ class Student: # command("git clone " + self.repo) # os.chdir(self.username) + #push to git, start at master os.chdir(self.username) + command("git checkout master") command("git branch " + data['name']) command("git commit -m initial") command("git push origin " + data['name']) + command("git checkout master") #git clone --single-branch --branch os.chdir(cdir) + + # data['unconfirmed'] = data['unconfirmed'].replace("," + self.username, "") + # data['unconfirmed'] = data['unconfirmed'].replace(self.username, "") + # data['confirmed'] = data['confirmed'] + "," + self.username + # if(data['confirmed'][0] == ','): + # data['confirmed'] = data['confirmed'][1:] + # print(data['confirmed']) + # print(putDB(data, 'http://127.0.0.1:8000/classes/'+ str(cid) + "/")) + + #add teacher as collaborator + #curl -i -u "USER:PASSWORDD" -X PUT -d '' 'https://api.github.com/repos/USER/REPO/collaborators/COLLABORATOR' + user = self.git + + self.classes.append(data) + if(len(self.sclass)==0): + self.sclass = data['name'] + else: + self.sclass = self.sclass + "," + str(data['name']) + #upddate self.new - s="" - nar = '' + snew="" + new = [] for i in range(len(self.new)): - if(self.new[i]['id'] == int(data['id'])): + if(self.new[i]['name'] == data['name']): del self.new[i] #recreate sclass field, using ids for c in self.new: - s = s + str(c['id']) + "," - nar.append(c) - self.snew=s - self.new=nar + snew = snew + str(c['name']) + "," + new.append(getDB("http://127.0.0.1:8000/classes/" + str(cid))) + self.snew=snew + self.new=new break #update teacher instance in db, classes field @@ -296,7 +305,6 @@ class Student: os.chdir(self.username) for c in self.classes: if c['name'] == courses: - print(courses) command("git checkout " + courses) print(os.listdir()) return @@ -304,15 +312,35 @@ class Student: print("Class not found") return - def submit(self, courses): + def submit(self, course, assignment): + cdir = os.getcwd() + os.chdir(self.username) + print(os.getcwd()) + command("git add .") + command("git commit -m update") + command('git checkout ' + course) + time.sleep(5) + ass = os.listdir() + inclass = False + for a in ass: + if a == assignment: + inclass = True + break + if(inclass == False): + print(assignment + " not an assignment of " + course) + command('git checkout master') + os.chdir(cdir) + return + + command('touch ' + assignment + '/SUBMISSION') command("git add .") command("git commit -m submit") - command("git tag " + parts[1] + "-final") - command("git push -u origin " + self.username + " --tags") + command("git tag " + assignment + "-final") + command("git push -u origin " + course + " --tags") + command('git checkout master') + os.chdir(cdir) -data = getStudent("2023rumareti") +data = getStudent("2022rkhondak") s = Student(data) -s.update() - - -#s.update() \ No newline at end of file +#s.viewClass("English11_eharris1") +s.submit("English11_eharris1", "Entry1") \ No newline at end of file diff --git a/CLI/t-git.py b/CLI/t-git.py index 24a534b..e6dfb7e 100644 --- a/CLI/t-git.py +++ b/CLI/t-git.py @@ -90,59 +90,10 @@ class Teacher: self.classes = classes self.sclass=str(data['classes']) - if(os.path.isdir(self.username)): + if(os.path.isdir(self.username + "/Students")): print("Synced to " + self.username) else: - os.mkdir(self.username) - - - #update API and Github, all assignments / classes - def update(self): - #lists all classes - ignore=['.git','.DS_Store'] - classes = os.listdir(self.username) - for i in ignore: - try: - classes.remove(i) - except: - pass - #list of classes that have been deleted (not with deleteClass) - extra = [] - for c in self.classes: - extra.append(c) - for i in range(len(extra)): - e = extra[i]['path'] - extra[i] = e - print("Extra: "+str(extra)) - print("Local:" + str(classes)) - #checks all class directories first - for c in classes: - path = self.username + "/" + c - if(self.checkClass(path) == False): - return - extra.remove(path) - print("Current classes: " + path) - - for e in extra: - self.deleteClass(e) - - for i in range(len(classes)): - c = classes[i] - path = self.username + "/" + c - #lists all assignments and default files - #if no .git, directory not synced to git or API - if (self.checkInDB(path)==False): - self.addClass(path) - else: - #push to git - loc = os.getcwd() - os.chdir(path) - command('git fetch origin') - command('git pull origin master') - command('git add .') - command('git commit -m "Update"') - command('git push -u origin master') - os.chdir(loc) + os.makedirs(self.username + "/Students") #class name format: _ @@ -216,12 +167,12 @@ class Teacher: #upate self.classes self.classes.append(data) if(len(self.sclass)==0): - self.sclass = data['id'] + self.sclass = data['name'] else: - self.sclass = self.sclass + "," + str(data['id']) + self.sclass = self.sclass + "," + str(data['name']) #update teacher instance in db, classes field - data={ + teacher={ 'first_name':self.first_name, 'last_name':self.last_name, 'git':self.git, @@ -230,9 +181,9 @@ class Teacher: 'classes':self.sclass, 'email':self.email } - putDB(data, self.url) + putDB(teacher, self.url) - return data + return teacher #make a new class from scratch @@ -241,8 +192,16 @@ class Teacher: def makeClass(self, cname, assignments): #check if class exists path = self.username + "/" + cname - if(os.path.exists(path)): + isclass = False + acourses = getDB("http://127.0.0.1:8000/classes/")['results'] + for c in acourses: + if c['name'] == cname: + isclass=True + break + if(os.path.exists(path) or isclass): print("Class already exists: " + cname) + if(isclass): + print("Class already exists in Database") return else: if((("_" + self.username) in cname) == False): @@ -272,22 +231,16 @@ class Teacher: cname = path.split("/") cname = cname[len(cname)-1] - cid = None repo = '' - for c in self.classes: - if cname == c['name']: - cid = str(c['id']) - repo = c['repo'] - - #remove from api + print("DELETE: " + self.classes[i]['name']) for i in range(len(self.classes)): - if(self.classes[i]['id'] == int(cid)): - print("DELETE: " + self.classes[i]['name']) + c = self.classes[i] + if(c['name'] == cname): del self.classes[i] s="" #recreate sclass field, using ids for c in self.classes: - s = s + str(c['id']) + "," + s = s + str(c['name']) + "," print(s) s = s[:-1] print(s) @@ -301,7 +254,7 @@ class Teacher: 'email':self.email } print(putDB(data, self.url)) - delDB("http://127.0.0.1:8000/classes/" + cid + "/") + delDB("http://127.0.0.1:8000/classes/" + cname + "/") break #remove locally @@ -312,108 +265,179 @@ class Teacher: #remove from student directories -#make student repo by student id - def reqStudent(self, student, classes): - cid = None - for c in self.classes: - print(c['name']) - if classes == c['name']: - cid = str(c['id']) - data1 = getDB("http://127.0.0.1:8000/classes/" + cid) - if(student in data1['unconfirmed']): - print (student + " already requested.") - return - if(student in data1['confirmed']): - print (student + " alredy enrolled.") - break - if(cid==None): - print(classes +" does not exist.") - return - data = getDB("http://127.0.0.1:8000/students/" + student) - try: - if(data['added_to']==""): - data['added_to']=cid - else: - data['added_to']=data['added_to']+ "," + cid - except: - print(student + " does not exist.") + def isStudent(self, student): + r = requests.get(url = "http://127.0.0.1:8000/students/" + student + "/", auth=('raffukhondaker','hackgroup1')) + if(r.status_code != 200): + return False + return True + + def reqStudent(self, sname, cname): + if(self.isStudent(sname) == False): + print(sname + " does not exist.") return - print(data['added_to']) - d={ - 'first_name':data["first_name"], - 'last_name':data["last_name"], - 'git':data["git"], - 'ion_user':data["ion_user"], - 'student_id':data["student_id"], - 'added_to':data['added_to'], - 'classes':data["classes"], - 'email':data["email"], - 'grade':data["grade"], - 'completed':data["completed"], - 'repo':data["repo"] + course = getDB("http://127.0.0.1:8000/classes/" + cname) + if(sname in course['unconfirmed']): + print (sname + " already requested.") + return + if(sname in course['confirmed']): + print (sname + " alredy enrolled.") + return + + student = getDB("http://127.0.0.1:8000/students/" + sname) + try: + if(student['added_to']==""): + student['added_to']=course['name'] + else: + student['added_to']=student['added_to']+ "," + course['name'] + except: + print(sname + " does not exist.") + return + print(student['added_to']) + s={ + 'first_name':student["first_name"], + 'last_name':student["last_name"], + 'git':student["git"], + 'ion_user':student["ion_user"], + 'student_id':student["student_id"], + 'added_to':student['added_to'], + 'classes':student["classes"], + 'email':student["email"], + 'grade':student["grade"], + 'completed':student["completed"], + 'repo':student["repo"] } - print(putDB(d, data['url'])) - data1 = getDB("http://127.0.0.1:8000/classes/" + cid) - if(data1['unconfirmed']==""): - data1['unconfirmed']=data['ion_user'] + student = putDB(s, student['url']) + + if(course['unconfirmed']==""): + course['unconfirmed']=student['ion_user'] else: - data1['unconfirmed']=data1['unconfirmed']+ "," + data['ion_user'] - d = { - "name": classes, + course['unconfirmed']=course['unconfirmed']+ "," + student['ion_user'] + cinfo = { + "name": course['name'], "repo": "", - "path": self.username + "/" + classes, + "path": self.username + "/" + course['name'], "teacher": self.username, "assignments": "", "default_file": "", - "confirmed": data1["confirmed"], - "unconfirmed": data1['unconfirmed'] + "confirmed": course["confirmed"], + "unconfirmed": course['unconfirmed'] } - print(putDB(d, data1['url'])) + print(putDB(cinfo, course['url'])) - #confirmed students - # pull student work and push updates - def updateStudent(self, student, classes): - for c in self.classes: - if(c['name'] == classes): - cid = c['id'] - data = getDB("http://127.0.0.1:8000/classes/" + str(cid)) - if(student in data['unconfirmed']): - print(student + " has not accepted request to " + classes) - return + #Student should have confirmed on their endd, but class had not been updated yet + #git clone confirmed student repo, copy files into repo and push branch + def addStudent(self, sname, cname): + if(self.isStudent(sname) == False): + print(sname + " does not exist.") + return + student = getDB("http://127.0.0.1:8000/students/" + sname) + course = getDB("http://127.0.0.1:8000/classes/" + cname) + + if((student['ion_user'] in course['unconfirmed']) == False): + print("Student has not been requested to join yet.") + return + if((cname in student['added_to']) == True or (cname in student['classes']) == False): + print("Student has not confirmed class yet") + return + if(os.path.exists(self.username + "/Students/" + cname + "/" + student['ion_user']) or (student['ion_user'] in course['confirmed']) == True): + print("Student already added to class") + + #git clone and make student/class directories cdir = os.getcwd() - cpath = self.username + "/" + classes - path = self.username + "/Students/" + classes - spath = self.username + "/Students/" + classes + "/" + student + cpath = self.username + "/" + cname + path = self.username + "/Students/" + cname + spath = self.username + "/Students/" + cname + "/" + student['ion_user'] if(os.path.isdir(path) == False): os.makedirs(path) if(os.path.isdir(spath) == False): os.chdir(path) - student = getDB("http://127.0.0.1:8000/students/" + student) command("git clone " + student['repo']) os.chdir(cdir) - copy_tree(cpath, path + "/" + student['ion_user']) - os.chdir(self.username + "/Students/" + classes + "/" + student['ion_user']) - command('git checkout ' + classes) - command('git pull origin ' + classes) + #push to git + copy_tree(cpath, path + "/" + student['ion_user']) + os.chdir(spath) + command('git checkout ' + cname) + command('git pull origin ' + cname) command('git add .') command('git commit -m Hello') - command('git push -u origin ' + classes) + command('git push -u origin ' + cname) + command('git checkout master') + + if(course['confirmed']==""): + course['confirmed']=student['ion_user'] + else: + course['confirmed']=course['confirmed']+ "," + student['ion_user'] + cinfo = { + "name": course['name'], + "repo": "", + "path": course['path'], + "teacher": course['name'], + "assignments": "", + "default_file": "", + "confirmed": course["confirmed"], + "unconfirmed": course['unconfirmed'] + } + print(putDB(cinfo, course['url'])) + + def addAssignment(self, path, course): + parts = path.split("/") + aname = parts[len(parts)-1] + if(os.path.isdir(path) == 0 or len(parts) < 3) or aname in self.sclass: + print("Not valid path.") + return + if((parts[1] in self.sclass) == False): + print("Not in valid class directory") + return + ar = [x[2] for x in os.walk(path)] + print(ar) + for folder in ar: + if len(folder) == 0: + print("Assignment is completely empty, need a file.") + return + course = getDB("http://127.0.0.1:8000/classes/" + course) + slist = os.listdir(os.getcwd() + "/" + self.username + "/Students/" + course['name']) + cdir = os.getcwd() + for st in slist: + if st in course['confirmed']: + spath = os.path.join(os.getcwd() + "/" + self.username + "/Students/" + course['name'], st) + if(os.path.exists(spath + "/" + aname) == False): + os.mkdir(spath + "/" + aname) + print(st) + print(copy_tree(path, spath + "/" + aname)) + os.chdir(spath) + command('git checkout ' + course['name']) + command('git pull origin ' + course['name']) + command('git add .') + command('git commit -m Hello') + command('git push -u origin ' + course['name']) + os.chdir(cdir) + else: + print(st + " already has assignment") + + def getHistory(self, student, course): + course = getDB("http://127.0.0.1:8000/classes/" + course) + try: + if((student in course['confirmed']) == False): + print("Student not in class") + return + except: + print("class does not exist") + return + os.chdir(self.username + "/Students/" + course['name'] + "/" + student) + process = subprocess.Popen(['git', 'log', course['name']], stdout=subprocess.PIPE,stderr=subprocess.PIPE) + p=process.poll() + output = process.communicate()[0].decode('utf-8') + print(output) def comment(self): print("heheheh") - def addAssignment(): - print() - def updateAssignnment(): print() -data = getTeacher("mlauerbach") +data = getTeacher("eharris1") t = Teacher(data) -t.reqStudent("2023rumareti", 'Math5_mlauerbach') -t.updateStudent("2023rumareti", 'Math5_mlauerbach') - - +t.getHistory("2022rkhondak", "English11_eharris1") diff --git a/Website/api/migrations/0007_auto_20200611_0831.py b/Website/api/migrations/0007_auto_20200611_0831.py new file mode 100644 index 0000000..801cbeb --- /dev/null +++ b/Website/api/migrations/0007_auto_20200611_0831.py @@ -0,0 +1,22 @@ +# Generated by Django 3.0.7 on 2020-06-11 08:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0006_auto_20200610_0631'), + ] + + operations = [ + migrations.RemoveField( + model_name='classes', + name='id', + ), + migrations.AlterField( + model_name='classes', + name='name', + field=models.CharField(max_length=100, primary_key=True, serialize=False), + ), + ] diff --git a/Website/api/models.py b/Website/api/models.py index e75fddd..d80266d 100644 --- a/Website/api/models.py +++ b/Website/api/models.py @@ -19,7 +19,7 @@ class Assignment(models.Model): return '%s' % (self.name) class Classes(models.Model): - name = models.CharField(max_length=100) + name = models.CharField(primary_key=True, max_length=100) repo=models.URLField(default="") path=models.CharField(max_length=100, default="") teacher=models.CharField(max_length=100, default="") diff --git a/Website/api/serializers.py b/Website/api/serializers.py index 6eb0f21..4ce5b91 100644 --- a/Website/api/serializers.py +++ b/Website/api/serializers.py @@ -20,7 +20,7 @@ class ClassesSerializer(serializers.HyperlinkedModelSerializer): # default_file=DefFilesSerializer(many=True, read_only=True,allow_null=True) class Meta: model = Classes - fields = ['url', 'name', 'repo','path', "teacher",'assignments',"default_file",'id', 'confirmed', 'unconfirmed'] + fields = ['url', 'name', 'repo','path', "teacher",'assignments',"default_file", 'confirmed', 'unconfirmed'] class StudentSerializer(serializers.HyperlinkedModelSerializer): # classes = ClassesSerializer(many=True, read_only=True,allow_null=True) diff --git a/eharris1/English11_eharris1/Journal1/instructions.txt b/eharris1/English11_eharris1/Entry1/rubric.txt similarity index 100% rename from eharris1/English11_eharris1/Journal1/instructions.txt rename to eharris1/English11_eharris1/Entry1/rubric.txt diff --git a/mlauerbach/Math5_mlauerbach/README.md b/eharris1/English11_eharris1/Entry1/sample_entry.txt similarity index 100% rename from mlauerbach/Math5_mlauerbach/README.md rename to eharris1/English11_eharris1/Entry1/sample_entry.txt diff --git a/mlauerbach/Math5_mlauerbach/Test1/instructions.txt b/eharris1/English11_eharris1/Entry2/instruct.txt similarity index 100% rename from mlauerbach/Math5_mlauerbach/Test1/instructions.txt rename to eharris1/English11_eharris1/Entry2/instruct.txt diff --git a/mlauerbach/Math5_mlauerbach/Week1_HW/instructions.txt b/mlauerbach/Math5_mlauerbach/Week1_HW/instructions.txt deleted file mode 100644 index e69de29..0000000 diff --git a/sjfrank/APBiology_sjfrank/Lab1/instructions.txt b/sjfrank/APBiology_sjfrank/Lab1/instructions.txt deleted file mode 100644 index e69de29..0000000 diff --git a/sjfrank/APBiology_sjfrank/README.md b/sjfrank/APBiology_sjfrank/README.md deleted file mode 100644 index e69de29..0000000