diff --git a/FusionIIIT/Fusion/settings/common.py b/FusionIIIT/Fusion/settings/common.py index b98ea6960..3a2461774 100644 --- a/FusionIIIT/Fusion/settings/common.py +++ b/FusionIIIT/Fusion/settings/common.py @@ -256,8 +256,12 @@ STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, '..', 'static/') STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' -MEDIA_ROOT = os.path.join(BASE_DIR, '..', 'media/') +STATICFILES_DIRS = ( + os.path.join(BASE_DIR, "static"), +) + MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_EMAIL_REQUIRED = True diff --git a/FusionIIIT/applications/online_cms/admin.py b/FusionIIIT/applications/online_cms/admin.py index ac9eb780a..24679190f 100644 --- a/FusionIIIT/applications/online_cms/admin.py +++ b/FusionIIIT/applications/online_cms/admin.py @@ -2,14 +2,14 @@ from .models import (Assignment, CourseDocuments, CourseVideo, Forum, ForumReply, Quiz, QuizQuestion, QuizResult, StudentAnswer, - StudentAssignment, Topics) + StudentAssignment, Topics,CourseSlide) class QuizResultAdmin(admin.ModelAdmin): model = QuizResult raw_id_fields = ("student_id",) admin.site.register(CourseDocuments) - +admin.site.register(CourseSlide) admin.site.register(CourseVideo) admin.site.register(Quiz) diff --git a/FusionIIIT/applications/online_cms/forms.py b/FusionIIIT/applications/online_cms/forms.py index e656a838f..802de9dbe 100644 --- a/FusionIIIT/applications/online_cms/forms.py +++ b/FusionIIIT/applications/online_cms/forms.py @@ -1,10 +1,13 @@ +# from django import forms import datetime from datetime import time, timedelta #import information from the models from django import forms # from .models import StoreMarks from applications.academic_information.models import Student_attendance +from django.forms import ModelForm +from .models import * #the types of exam whose marks can be stored from edit marks in assessment, related to StoreMarks table in models EXAM_TYPES= [ ('quiz1', 'Quiz 1'), @@ -112,4 +115,13 @@ def clean(self): examtype = self.cleaned_data.get("exam_type") enteredmarks = self.cleaned_data.get("entered_marks") - return self.cleaned_data \ No newline at end of file + return self.cleaned_data + + +class UploadSlideForm(forms.Form): + class Meta: + model=CourseDocuments + fields=['couse_id','doc'] + + # title = forms.CharField(max_length=50) + file = forms.FileField() \ No newline at end of file diff --git a/FusionIIIT/applications/online_cms/helpers.py b/FusionIIIT/applications/online_cms/helpers.py index 8fb9f530e..05babe3bc 100644 --- a/FusionIIIT/applications/online_cms/helpers.py +++ b/FusionIIIT/applications/online_cms/helpers.py @@ -5,12 +5,25 @@ def semester(roll): - month = datetime.now().month - sem = 0 - if month >= 8 and month <= 12: - sem = 1 - semester = (datetime.now().year-int(roll))*2+sem - return semester + if not roll.isnumeric(): + s='' + s+='2' + s+='0' + s+=roll[0] + s+=roll[1] + month = datetime.now().month + sem = 0 + if month >= 8 and month <= 12: + sem = 1 + semester = (datetime.now().year-int(s))*2+sem + return semester + else: + month = datetime.now().month + sem = 0 + if month >= 8 and month <= 12: + sem = 1 + semester = (datetime.now().year-int(roll))*2+sem + return semester #storing media files like images, videos and assignments def create_thumbnail(course_code,course, row, name, ext, attach_str, thumb_time, thumb_size): diff --git a/FusionIIIT/applications/online_cms/models.py b/FusionIIIT/applications/online_cms/models.py index a34e5c3ee..fe8dce565 100644 --- a/FusionIIIT/applications/online_cms/models.py +++ b/FusionIIIT/applications/online_cms/models.py @@ -4,13 +4,33 @@ from applications.academic_procedures.models import Register from applications.globals.models import ExtraInfo + + + +def content_file_name(instance, filename): + name, ext = filename.split('.') + obj=Curriculum.objects.get(course_id=instance.course_id) + course_code=obj.course_code + file_path = 'online_cms/{course_id}/doc/{fileName}.{ext}'.format( + course_id=course_code, fileName=instance.document_name, ext=ext) + return file_path #the documents in the course (slides , ppt) added by the faculty and can be downloaded by the students +class CourseSlide(models.Model): + course_id = models.ForeignKey(Course, on_delete=models.CASCADE) + upload_time = models.DateTimeField(auto_now=True) + document_name = models.CharField(max_length=40) + description = models.CharField(max_length=100) + doc=models.FileField(upload_to=content_file_name, null=True, blank=True) + def __str__(self): + return '{} - {}'.format(self.course_id, self.document_name) + class CourseDocuments(models.Model): course_id = models.ForeignKey(Course, on_delete=models.CASCADE) upload_time = models.DateTimeField(auto_now=True) description = models.CharField(max_length=100) document_name = models.CharField(max_length=40) - document_url = models.CharField(max_length=100, null=True) + document_url = models.CharField(max_length=500, null=True,blank=True) + # media = models.FileField(upload_to=content_file_name, null=True, blank=True) def __str__(self): return '{} - {}'.format(self.course_id, self.document_name) @@ -149,6 +169,23 @@ class Assignment(models.Model): def __str__(self): return '{} - {} - {}'.format(self.pk, self.course_id, self.assignment_name) +def assignment_file_name(instance, filename): + name, ext = filename.split('.') + obj=Curriculum.objects.get(course_id=instance.course_id) + course_code=obj.course_code + file_path = 'online_cms/{course_id}/doc/{fileName}.{ext}'.format( + course_id=course_code, fileName=instance.assignment_name, ext=ext) + return file_path +class CourseAssignment(models.Model): + course_id = models.ForeignKey(Course, on_delete=models.CASCADE) + upload_time = models.DateTimeField(auto_now=True) + submit_date = models.DateTimeField() + assignment_name = models.CharField(max_length=100) + doc = models.FileField(upload_to=assignment_file_name, null=True, blank=True) + + def __str__(self): + return '{} - {} - {}'.format(self.pk, self.course_id, self.assignment_name) + #details of the solution uploaded by the student class StudentAssignment(models.Model): student_id = models.ForeignKey(Student, on_delete=models.CASCADE) diff --git a/FusionIIIT/applications/online_cms/urls.py b/FusionIIIT/applications/online_cms/urls.py index c24c69cc2..a15cc3029 100644 --- a/FusionIIIT/applications/online_cms/urls.py +++ b/FusionIIIT/applications/online_cms/urls.py @@ -1,10 +1,11 @@ +from django.conf import settings +from django.conf.urls.static import static from django.conf.urls import url - from . import views -app_name = 'online_cms' +app_name = 'online_cms' urlpatterns = [ - + url(r'^$', views.viewcourses, name='viewcourses'), url(r'^(?P[A-z]+[0-9]+[A-z]?)/$', views.course, name='course'), # url(r'^(?P[A-z]+[0-9]+[A-z]?)/edit_marks$', views.edit_marks, name='edit_marks'), @@ -69,4 +70,6 @@ url(r'^(?P[A-z]+[0-9]+[A-z]?)/edit_bank/(?P[0-9]+)$', views.edit_bank, name='edit_bank'), url(r'^(?P[A-z]+[0-9]+[A-z]?)/attendance$', views.submit_attendance, - name='submit_attendance'),] + name='submit_attendance'),] + +urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/FusionIIIT/applications/online_cms/views.py b/FusionIIIT/applications/online_cms/views.py index cc74626f3..7f60b9363 100644 --- a/FusionIIIT/applications/online_cms/views.py +++ b/FusionIIIT/applications/online_cms/views.py @@ -39,13 +39,21 @@ def viewcourses(request): student = Student.objects.select_related('id').get(id=extrainfo) roll = student.id.id[:4] #get the roll no. of the student register = Register.objects.select_related().filter(student_id=student, semester=semester(roll)) #info of registered student - courses = collections.OrderedDict() #courses in which student is registerd + courses = [] #courses in which student is registerd + print(register) + # serializer=OCMSStudentSerializer(register,many=True) + for reg in register: #info of the courses - instructor = Curriculum_Instructor.objects.select_related().get(course_id=reg.course_id) - courses[reg] = instructor + course={} + course['data']=reg.curr_id + # course=reg.curr_id + course['instructor'] = Curriculum_Instructor.objects.select_related().get(curriculum_id=reg.curr_id) + courses.append(course) + # print(serializer.data) + # return Response(serializer.data) + # return Response({'status':200}) return render(request, 'coursemanagement/coursemanagement1.html', {'courses': courses, - 'extrainfo': extrainfo}) else: #if the user is lecturer instructor = Curriculum_Instructor.objects.select_related('curriculum_id').filter(instructor_id=extrainfo) #get info of the instructor @@ -62,6 +70,7 @@ def viewcourses(request): + @login_required def course(request, course_code): ''' @@ -81,87 +90,90 @@ def course(request, course_code): #course material uploaded by the instructor # videos = CourseVideo.objects.filter(course_id=course) videos = [] - if request.method == 'POST': - search_url = "https://www.googleapis.com/youtube/v3/search" - video_url = "https://www.googleapis.com/youtube/v3/videos" - search_params = { - 'part': 'snippet', - 'q': request.POST['search'], - 'key': settings.YOUTUBE_DATA_API_KEY, - 'type': 'video', - 'channelId': 'channel_id' - } - videos_ids = [] - r = requests.get(search_url, params=search_params) - # print(r) - results = r.json()['items'] - for result in results: - videos_ids.append(result['id']['videoId']) - - video_params = { - 'key': settings.YOUTUBE_DATA_API_KEY, - 'part': 'snippet,contentDetails', - 'id': ','.join(videos_ids), - 'maxResults': 9 - } - - p = requests.get(video_url, params=video_params) - results1 = p.json()['items'] - - for result in results1: - video_data = { - 'id': result['id'], - # 'url': f'https://www.youtube.com/watch?v={result["id"]}', - 'title': result['snippet']['title'], - # 'duration': int(parse_duration(result['contentDetails']['duration']).total_seconds() // 60), - # 'thumbnails': result['snippet']['thumbnails']['high']['url'] - } - - videos.append(video_data) - else: - channel_url = "https://www.googleapis.com/youtube/v3/channels" - playlist_url = "https://www.googleapis.com/youtube/v3/playlistItems" - videos_url = "https://www.googleapis.com/youtube/v3/videos" - - videos_list = [] - channel_params = { - 'part': 'contentDetails', - 'id': 'channel_id', - 'key': settings.YOUTUBE_DATA_API_KEY, - } - r = requests.get(channel_url, params=channel_params) - results = r.json()['items'][0]['contentDetails']['relatedPlaylists']['uploads'] - - playlist_params = { - 'key': settings.YOUTUBE_DATA_API_KEY, - 'part': 'snippet', - 'playlistId': results, - 'maxResults': 5, - } - p = requests.get(playlist_url, params=playlist_params) - results1 = p.json()['items'] - - for result in results1: - # print(results) - videos_list.append(result['snippet']['resourceId']['videoId']) - - videos_params = { - 'key': settings.YOUTUBE_DATA_API_KEY, - 'part': 'snippet', - 'id': ','.join(videos_list) - } - - v = requests.get(videos_url, params=videos_params) - results2 = v.json()['items'] - videos = [] - for res in results2: - video_data = { - 'id': res['id'], - 'title': res['snippet']['title'], - } - - videos.append(video_data) + # if request.method == 'POST': + # if(request) + # if request.method == 'POST': + # search_url = "https://www.googleapis.com/youtube/v3/search" + # video_url = "https://www.googleapis.com/youtube/v3/videos" + # search_params = { + # 'part': 'snippet', + # 'q': request.POST['search'], + # 'key': settings.YOUTUBE_DATA_API_KEY, + # 'type': 'video', + # 'channelId': 'channel_id' + # } + # videos_ids = [] + # r = requests.get(search_url, params=search_params) + # # print(r) + # results = r.json()['items'] + # for result in results: + # videos_ids.append(result['id']['videoId']) + + # video_params = { + # 'key': settings.YOUTUBE_DATA_API_KEY, + # 'part': 'snippet,contentDetails', + # 'id': ','.join(videos_ids), + # 'maxResults': 9 + # } + + # p = requests.get(video_url, params=video_params) + # results1 = p.json()['items'] + + # for result in results1: + # video_data = { + # 'id': result['id'], + # # 'url': f'https://www.youtube.com/watch?v={result["id"]}', + # 'title': result['snippet']['title'], + # # 'duration': int(parse_duration(result['contentDetails']['duration']).total_seconds() // 60), + # # 'thumbnails': result['snippet']['thumbnails']['high']['url'] + # } + + # videos.append(video_data) + # else: + # channel_url = "https://www.googleapis.com/youtube/v3/channels" + # playlist_url = "https://www.googleapis.com/youtube/v3/playlistItems" + # videos_url = "https://www.googleapis.com/youtube/v3/videos" + + # videos_list = [] + # channel_params = { + # 'part': 'contentDetails', + # 'id': 'channel_id', + # 'key': settings.YOUTUBE_DATA_API_KEY, + # } + # r = requests.get(channel_url, params=channel_params) + # results = r.json()['items'][0]['contentDetails']['relatedPlaylists']['uploads'] + + # playlist_params = { + # 'key': settings.YOUTUBE_DATA_API_KEY, + # 'part': 'snippet', + # 'playlistId': results, + # 'maxResults': 5, + # } + # p = requests.get(playlist_url, params=playlist_params) + # results1 = p.json()['items'] + + # for result in results1: + # # print(results) + # videos_list.append(result['snippet']['resourceId']['videoId']) + + # videos_params = { + # 'key': settings.YOUTUBE_DATA_API_KEY, + # 'part': 'snippet', + # 'id': ','.join(videos_list) + # } + + # v = requests.get(videos_url, params=videos_params) + # results2 = v.json()['items'] + # videos = [] + # for res in results2: + # video_data = { + # 'id': res['id'], + # 'title': res['snippet']['title'], + # } + + # videos.append(video_data) # print(videos) + slides = CourseDocuments.objects.select_related().filter(course_id=course) quiz = Quiz.objects.select_related().filter(course_id=course) assignment = Assignment.objects.select_related().filter(course_id=course) @@ -210,6 +222,7 @@ def course(request, course_code): 'curriculum': curriculum}) else: + instructor = Curriculum_Instructor.objects.select_related('curriculum_id').filter(instructor_id=extrainfo) for ins in instructor: if ins.curriculum_id.course_code == course_code: @@ -247,53 +260,62 @@ def course(request, course_code): lec = 1 # videos = CourseVideo.objects.filter(course_id=course) - channel_url = "https://www.googleapis.com/youtube/v3/channels" - playlist_url = "https://www.googleapis.com/youtube/v3/playlistItems" - videos_url = "https://www.googleapis.com/youtube/v3/videos" - - videos_list = [] - channel_params = { - 'part': 'contentDetails', - # 'forUsername': 'TechGuyWeb', - 'id': 'UCdGQeihs84hyCssI2KuAPmA', - 'key': settings.YOUTUBE_DATA_API_KEY, - } - r = requests.get(channel_url, params=channel_params) - results = r.json()['items'][0]['contentDetails']['relatedPlaylists']['uploads'] - - playlist_params = { - 'key': settings.YOUTUBE_DATA_API_KEY, - 'part': 'snippet', - 'playlistId': results, - 'maxResults': 5, - } - p = requests.get(playlist_url, params=playlist_params) - results1 = p.json()['items'] - - for result in results1: - videos_list.append(result['snippet']['resourceId']['videoId']) - - videos_params = { - 'key': settings.YOUTUBE_DATA_API_KEY, - 'part': 'snippet', - 'id': ','.join(videos_list) - } - - v = requests.get(videos_url, params=videos_params) - results2 = v.json()['items'] - videos = [] - for res in results2: - video_data = { - 'id': res['id'], - 'title': res['snippet']['title'], - } - - videos.append(video_data) + # channel_url = "https://www.googleapis.com/youtube/v3/channels" + # playlist_url = "https://www.googleapis.com/youtube/v3/playlistItems" + # videos_url = "https://www.googleapis.com/youtube/v3/videos" + + # videos_list = [] + # channel_params = { + # 'part': 'contentDetails', + # # 'forUsername': 'TechGuyWeb', + # 'id': 'UCdGQeihs84hyCssI2KuAPmA', + # 'key': settings.YOUTUBE_DATA_API_KEY, + # } + # r = requests.get(channel_url, params=channel_params) + # results = r.json()['items'][0]['contentDetails']['relatedPlaylists']['uploads'] + + # playlist_params = { + # 'key': settings.YOUTUBE_DATA_API_KEY, + # 'part': 'snippet', + # 'playlistId': results, + # 'maxResults': 5, + # } + # p = requests.get(playlist_url, params=playlist_params) + # results1 = p.json()['items'] + + # for result in results1: + # videos_list.append(result['snippet']['resourceId']['videoId']) + + # videos_params = { + # 'key': settings.YOUTUBE_DATA_API_KEY, + # 'part': 'snippet', + # 'id': ','.join(videos_list) + # } + + # v = requests.get(videos_url, params=videos_params) + # results2 = v.json()['items'] + # videos = [] + # for res in results2: + # video_data = { + # 'id': res['id'], + # 'title': res['snippet']['title'], + # } + + # videos.append(video_data) + # if request.method == 'POST': + # form = UploadSlideForm(request.POST, request.FILES) + # if form.is_valid(): + # tempform=form.save(commit=False) + # tempform.course_id=course + # tempform.save() + videos=[] + slides1=CourseSlide.objects.select_related().filter(course_id=course) slides = CourseDocuments.objects.select_related().filter(course_id=course) quiz = Quiz.objects.select_related().filter(course_id=course) marks = [] quizs = [] assignment = Assignment.objects.select_related().filter(course_id=course) + assignment1 = CourseAssignment.objects.select_related().filter(course_id=course) student_assignment = [] for assi in assignment: sa = StudentAssignment.objects.select_related().filter(assignment_id=assi) @@ -326,13 +348,15 @@ def course(request, course_code): 'course': course, 'answers': answers, 'assignment': assignment, + 'assignment1': assignment1, 'student_assignment': student_assignment, 'Lecturer': lec, 'questionbank': qb, 'students': students, 'total_attendance' : total_attendance, 'present_attendance':present_attendance, - 'test_marks': test_marks + 'test_marks': test_marks, + 'slides1':slides1 }) #when student uploads the assignment's solution @@ -387,6 +411,8 @@ def add_document(request, course_code): description = request.POST.get('description') doc = request.FILES.get('img') name = request.POST.get('name') + # obj =CourseDocuments.objects.create(course_id=course,description=description,) + # = request.FILES['img'] filename, file_extenstion = os.path.splitext(request.FILES.get('img').name) except: return HttpResponse("Please fill each and every field correctly!") @@ -401,15 +427,24 @@ def add_document(request, course_code): fs.save(filename + file_extenstion, doc) uploaded_file_url = full_path + filename + file_extenstion #save the info/details in the database - CourseDocuments.objects.create( + print(settings.MEDIA_ROOT) + CourseSlide.objects.create( course_id=course, upload_time=datetime.datetime.now(), description=description, - document_url=uploaded_file_url, - document_name=name+file_extenstion + document_name=name, + doc=doc ) + # CourseDocuments.objects.create( + # course_id=course, + # upload_time=datetime.datetime.now(), + # description=description, + # document_url=uploaded_file_url, + # document_name=name+file_extenstion + # ) return HttpResponse("Upload successful.") else: + return HttpResponse("not found") #it is to delete things(assignment, slides, videos, ) from the dustin icon or delete buttons @@ -636,6 +671,7 @@ def add_assignment(request, course_code): #from faculty side return HttpResponse("Please Enter The Form Properly") filename = name full_path = settings.MEDIA_ROOT + "/online_cms/" + course_code + "/assi/" + name + "/" + print(full_path) url = settings.MEDIA_URL + filename if not os.path.isdir(full_path): cmd = "mkdir " + full_path @@ -643,13 +679,20 @@ def add_assignment(request, course_code): #from faculty side fs = FileSystemStorage(full_path, url) fs.save(filename+file_extenstion, assi) uploaded_file_url = full_path + filename + file_extenstion - assign = Assignment( + print(uploaded_file_url) + CourseAssignment.objects.create( course_id=course, submit_date=request.POST.get('myDate'), - assignment_url=uploaded_file_url, + doc=assi, assignment_name=name ) - assign.save() + # assign = Assignment( + # course_id=course, + # submit_date=request.POST.get('myDate'), + # assignment_url=uploaded_file_url, + # assignment_name=name + # ) + # assign.save() return HttpResponse("Upload successful.") else: return HttpResponse("not found") diff --git a/FusionIIIT/templates/coursemanagement/addcontent.html b/FusionIIIT/templates/coursemanagement/addcontent.html index 22e9986c7..17b3363dc 100644 --- a/FusionIIIT/templates/coursemanagement/addcontent.html +++ b/FusionIIIT/templates/coursemanagement/addcontent.html @@ -69,13 +69,13 @@

Report:

- {% for slide in slides %} + {% for slide in slides1 %} {{forloop.counter}} {{slide.document_name}} + {% comment %}

{{slide.document_url}}

{% endcomment %} diff --git a/FusionIIIT/templates/coursemanagement/coursemanagement1.html b/FusionIIIT/templates/coursemanagement/coursemanagement1.html index 678d79b71..f4dcb29e4 100644 --- a/FusionIIIT/templates/coursemanagement/coursemanagement1.html +++ b/FusionIIIT/templates/coursemanagement/coursemanagement1.html @@ -85,16 +85,17 @@

Course Code Name Of the Course - {% ifequal extrainfo.designation|stringformat:"s" "student" %} + {% ifequal extrainfo.user_type|stringformat:"s" "student" %} Instructor {% endifequal %} - {% ifequal extrainfo.designation|stringformat:"s" "student" %} {% for course,instructor in courses.items %} + {% ifequal extrainfo.user_type|stringformat:"s" "student" %} {% for x in courses %} - {{course.course_id.course_name}} - {{course.course_id.course_id}} - {{instructor.instructor_id.user.username}} + {% comment %} {{x.data}} {% endcomment %} + {{x.data.course_code}} + {{x.data.course_id}} + {{x.instructor.instructor_id.user.username}} {% endfor %} {% else %} {% for curriculum in curriculum_list %} @@ -113,14 +114,13 @@

{% comment %}The Basic Course details segment ends here!{% endcomment %} {% comment %}The Assignment segment starts here!{% endcomment %} - -
- + {% comment %}

hfexlelel

{% endcomment %} +

-
+
- +
diff --git a/FusionIIIT/templates/coursemanagement/submitassignments.html b/FusionIIIT/templates/coursemanagement/submitassignments.html index 217a12bde..945a74ffc 100644 --- a/FusionIIIT/templates/coursemanagement/submitassignments.html +++ b/FusionIIIT/templates/coursemanagement/submitassignments.html @@ -188,12 +188,12 @@

Report:

- {% for assi in assignment %} + {% for assi in assignment1 %} {{forloop.counter}} {{assi.assignment_name}} {{assi.submit_date}} -
+
diff --git a/FusionIIIT/templates/coursemanagement/viewcourse.html b/FusionIIIT/templates/coursemanagement/viewcourse.html index 88e91fb2a..44f1d9fb8 100644 --- a/FusionIIIT/templates/coursemanagement/viewcourse.html +++ b/FusionIIIT/templates/coursemanagement/viewcourse.html @@ -333,11 +333,13 @@

Submitable Assignments

{% if Lecturer == 1 %} + {% comment %}

{{course.course_name}}

{% endcomment %}
{% block addcontent %} {% include 'coursemanagement/addcontent.html' %} {% endblock %}
{% else %} +

{{course.course_name}}

@@ -349,6 +351,7 @@

{{course.course_name}}

diff --git a/FusionIIIT/templates/dashboard/modules.html b/FusionIIIT/templates/dashboard/modules.html index a8680958a..c0dc5eff3 100755 --- a/FusionIIIT/templates/dashboard/modules.html +++ b/FusionIIIT/templates/dashboard/modules.html @@ -219,19 +219,8 @@
- + +
{% comment %}