diff options
author | FOSSEE Git User | 2018-10-10 19:32:10 +0530 |
---|---|---|
committer | FOSSEE Git User | 2018-10-10 19:32:10 +0530 |
commit | 4099238c0bc191ab6ad0b236a1f45d530559982d (patch) | |
tree | e4e2238e3927951fcc825504aead2ef6737090ba /website | |
parent | fdf46a6dd8d33d96f5b3d0e032bcfa153b6155a5 (diff) | |
parent | df5b673cfb13f4ce66146723384172ee981a6a07 (diff) | |
download | nccps-2018-4099238c0bc191ab6ad0b236a1f45d530559982d.tar.gz nccps-2018-4099238c0bc191ab6ad0b236a1f45d530559982d.tar.bz2 nccps-2018-4099238c0bc191ab6ad0b236a1f45d530559982d.zip |
Merge branch 'master' of https://github.com/FOSSEE/nccps-2018
Diffstat (limited to 'website')
-rwxr-xr-x | website/forms.py | 22 | ||||
-rw-r--r-- | website/migrations/0004_auto_20181010_0942.py | 45 | ||||
-rw-r--r-- | website/models.py | 28 | ||||
-rw-r--r-- | website/urls.py | 9 | ||||
-rw-r--r-- | website/views.py | 209 |
5 files changed, 304 insertions, 9 deletions
diff --git a/website/forms.py b/website/forms.py index 72bdace..5b094e7 100755 --- a/website/forms.py +++ b/website/forms.py @@ -19,7 +19,7 @@ from django.contrib.auth.models import User from django.contrib.auth import authenticate from django.utils import timezone from website.models import ( - Profile, User + Profile, User, Question ) UNAME_CHARS = letters + "._" + digits @@ -377,5 +377,23 @@ class UserRegistrationForm(forms.Form): new_profile.save() key = Profile.objects.get(user=new_user).activation_key return u_name, pwd, key + + +class DateInput(forms.DateInput): + input_type = 'date' + + +class QuestionUploadForm(forms.ModelForm): + """Creates a form to add or edit a Question. + It has the related fields and functions required.""" -
\ No newline at end of file + + class Meta: + model = Question + fields = ['question', 'option_1', 'option_2', 'option_3', + 'option_4', 'correct_answer', 'question_day' + ] + + widgets = { + 'question_day': DateInput(), + }
\ No newline at end of file diff --git a/website/migrations/0004_auto_20181010_0942.py b/website/migrations/0004_auto_20181010_0942.py new file mode 100644 index 0000000..7d3f607 --- /dev/null +++ b/website/migrations/0004_auto_20181010_0942.py @@ -0,0 +1,45 @@ +# Generated by Django 2.1 on 2018-10-10 09:42 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('website', '0003_auto_20180919_1026'), + ] + + operations = [ + migrations.CreateModel( + name='AnswerPaper', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('validate_ans', models.BooleanField()), + ('date', models.DateTimeField(auto_now=True)), + ], + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('question', models.TextField()), + ('option_1', models.CharField(max_length=255)), + ('option_2', models.CharField(max_length=255)), + ('option_3', models.CharField(max_length=255)), + ('option_4', models.CharField(max_length=255)), + ('correct_answer', models.CharField(help_text='please write it as written in the option above(Case-sensitive)', max_length=255)), + ('question_day', models.DateField()), + ], + ), + migrations.AddField( + model_name='answerpaper', + name='answered_q', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='website.Question'), + ), + migrations.AddField( + model_name='answerpaper', + name='participant', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='website.Profile'), + ), + ] diff --git a/website/models.py b/website/models.py index 7906960..2481177 100644 --- a/website/models.py +++ b/website/models.py @@ -1,9 +1,12 @@ from django.db import models from django.contrib.auth.models import User +from django.utils import timezone +from datetime import datetime, timedelta from social.apps.django_app.default.models import UserSocialAuth from nccps2018 import settings from django.core.validators import RegexValidator import os +import pytz position_choices = ( ("student", "Student"), @@ -98,7 +101,26 @@ class Profile(models.Model): self.user.last_name, self.user.email ) - - + + +class Question(models.Model): + + question = models.TextField() + option_1 = models.CharField(max_length=255) + option_2 = models.CharField(max_length=255) + option_3 = models.CharField(max_length=255) + option_4 = models.CharField(max_length=255) + correct_answer = models.CharField(max_length=255, + help_text='please write it as written in the option \ + above(Case-sensitive)') -
\ No newline at end of file + # The date for the question. + question_day = models.DateField() + + +class AnswerPaper(models.Model): + + participant = models.ForeignKey(Profile, on_delete=models.CASCADE) + answered_q = models.ForeignKey(Question, on_delete=models.CASCADE) + validate_ans = models.BooleanField() + date = models.DateTimeField(auto_now=True)
\ No newline at end of file diff --git a/website/urls.py b/website/urls.py index 136afc9..7cf47c5 100644 --- a/website/urls.py +++ b/website/urls.py @@ -18,6 +18,13 @@ urlpatterns = [ re_path(r'^dwsimquiz/$', views.dwsimquiz, name='dwsimquiz'), re_path(r'^cfp/$', views.cfp, name='cfp'), + #re_path(r'^quiz/$', views.quiz_view, name='quiz_view'), + re_path(r'^question_list/$', views.question_list, name='question_list'), + re_path(r'^add_questions/$', views.add_questions, name='add_questions'), + re_path(r'^edit_question/(?P<qid>\d+)$', views.edit_question, name='edit_question'), + re_path(r'^take_quiz/$', views.take_quiz, name='take_quiz'), + re_path(r'^quiz_intro/$', views.quiz_intro, name='quiz_intro'), + re_path(r'^leaderboard/$', views.leaderboard, name='leaderboard'), re_path(r'^submit-cfp/$', views.submitcfp, name='submitcfp'), re_path(r'^submit-cfw/$', views.submitcfw, name='submitcfw'), #url(r'^submit-cfp/$', 'website.views.cfp', name='home'), @@ -41,4 +48,4 @@ urlpatterns = [ views.rate_proposal, name='rate_proposal'), re_path(r'^process-contact-form/(?P<next_url>\d+)', views.contact_us, name='contact_us'), -] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
\ No newline at end of file +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/website/views.py b/website/views.py index 6a4aeac..d45db5f 100644 --- a/website/views.py +++ b/website/views.py @@ -12,18 +12,23 @@ from django.views.decorators.csrf import (csrf_exempt, csrf_protect, requires_csrf_token) from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User -from website.models import Proposal, Comments, Ratings +from website.models import (Proposal, Comments, Ratings, Question, + AnswerPaper, Profile) from website.forms import (ProposalForm, UserRegisterForm, UserRegistrationForm, - UserLoginForm, WorkshopForm) # ,ContactForm + UserLoginForm, WorkshopForm,QuestionUploadForm) # ,ContactForm from website.models import Proposal, Comments, Ratings from social.apps.django_app.default.models import UserSocialAuth from django.contrib.auth import authenticate, login, logout - +from datetime import datetime +from django import template from django.core.mail import EmailMultiAlternatives import os from nccps2018.config import * from website.send_mails import send_email +from django.contrib.auth.models import Group +from django.contrib import messages + def is_email_checked(user): @@ -996,3 +1001,201 @@ def view_profile(request): except: return redirect('/register/') +"""@csrf_protect +@login_required +def question_add(request): + context = {} + if request.user.is_authenticated: + social_user = request.user + + django_user = User.objects.get(username=social_user) + context['user'] = django_user + if request.method == 'POST': + form = QuestionForm(request.POST) + if form.is_valid(): + data = form.save(commit=False) + data.user = django_user + data.email = social_user.email + data.save() + return render_to_response('question-display.html', context) + return HttpResponse(template.render(context, request)) + else: + context['qform'] = form + template = loader.get_template('question-display.html') + return HttpResponse(template.render(context, request)) + else: + form = QuestionForm() + return render(request, 'question-display.html', {'qform': form}) + else: + context['login_required'] = True + return render_to_response('login.html', context) + +@csrf_protect +def quiz_view(request): + context = {} + if request.user.is_authenticated: + social_user = request.user + django_user = User.objects.get(username=social_user) + questions = Question.objects.all() + context['user'] = django_user + context['questions'] = questions + template = loader.get_template('quiz-display.html') + return HttpResponse(template.render(context, request)) + else: + context['login_required'] = True + return render_to_response('login.html', context) +""" + + +def has_group(user, group_name): + group = Group.objects.get(name=group_name) + return True if group in user.groups.all() else False + + +@login_required +def question_list(request): + user = request.user + grouptype = Group.objects.get(name='moderator') + if has_group(user, grouptype): + question_list = Question.objects.all() + return render(request, 'question_list.html', {'question_list': question_list}) + else: + logout(request) + return redirect('/nccps-2018/accounts/login/') + + +@login_required +def add_questions(request): + user = request.user + if request.method == 'POST': + form = QuestionUploadForm(request.POST) + if form.is_valid(): + form.save() + messages.success(request, 'Question Uploaded Successfully! .') + else: + return redirect('/nccps-2018/add_questions') + + grouptype = Group.objects.get(name='moderator') + if has_group(user, grouptype): + question_form = QuestionUploadForm() + return render(request, 'add_question.html', {'questions': question_form}) + else: + logout(request) + return redirect('/nccps-2018/accounts/login/') + + +@login_required +def edit_question(request, qid=None): + """ edit profile details facility for instructor and coordinator """ + + user = request.user + context = {'template': template} + if request.method == 'POST': + form = QuestionUploadForm(request.POST) + if form.is_valid(): + form.save() + return render( + request, 'add_question.html' + ) + else: + context['form'] = form + return render(request, 'add_question.html', context) + else: + question = Question.objects.get(id=qid) + form = QuestionUploadForm(instance=question) + return render(request, 'edit_question.html', {'form': form}) + + +@login_required +def quiz_intro(request): + return render(request, 'quiz_intro.html') + +@login_required +def take_quiz(request): + user = request.user + today = datetime.today().date() + question_list = Question.objects.filter(question_day=today) + user_profile = Profile.objects.get(user_id=user.profile.user_id) + questions = dict(enumerate(question_list)) + + if request.method == 'POST': + data = request.body.decode("utf-8").split('&') + if len(data) <3: + messages.info(request, 'Please answer both the questions!') + else: + ans1 = data[1].split("=on")[0].replace("+", ' ').replace("%2F", "/") + ans2 = data[2].split("=on")[0].replace("+", ' ').replace("%2F", "/") + ans1 = ans1.split("q1=")[1] + ans2 = ans2.split("q2=")[1] + + #For First Answer + ans1_obj = AnswerPaper() + ans1_obj.participant = user_profile + ans1_obj.answered_q = questions[0] + + try: + question1 = AnswerPaper.objects.get( + answered_q=questions[0], + participant_id=user_profile.id) + question2 = AnswerPaper.objects.get( + answered_q=questions[1], + participant_id=user_profile.id) + except: + if questions[0].correct_answer==ans1: + ans1_obj.validate_ans = 1 + else: + ans1_obj.validate_ans = 0 + ans1_obj.save() + + #For Second Answer + ans2_obj = AnswerPaper() + ans2_obj.participant = user_profile + ans2_obj.answered_q = questions[1] + if questions[1].correct_answer==ans2: + ans2_obj.validate_ans = 1 + else: + ans2_obj.validate_ans = 0 + ans2_obj.save() + messages.info(request, "Submitted Successfully!") + + return redirect('/nccps-2018/take_quiz/') + + if question1 or question2: + messages.info(request, "You've already taken the quiz") + + else: + + try: + question1 = AnswerPaper.objects.get( + answered_q=questions[0], + participant_id=user_profile.id) + question2 = AnswerPaper.objects.get( + answered_q=questions[1], + participant_id=user_profile.id) + + if question1 or question2: + questions = None + except: + pass + + return render(request, 'take_quiz.html', { + 'question_list' : questions + }) + + +def leaderboard(request): + profiles = Profile.objects.all() + + leaderboard = {p:0 for p in profiles} + + answers = AnswerPaper.objects.all() + + for i in leaderboard: + profile_data = AnswerPaper.objects.filter(participant=i) + for pro in profile_data: + if pro.validate_ans==1: + leaderboard[i] +=1 + + sorted_leaderboard = sorted(leaderboard.items(), key=lambda kv: kv[1]) + return render(request, "leaderboard.html", {'leaderboard': sorted_leaderboard[::-1]}) + |