summaryrefslogtreecommitdiff
path: root/website
diff options
context:
space:
mode:
authorFOSSEE Git User2018-10-10 19:32:10 +0530
committerFOSSEE Git User2018-10-10 19:32:10 +0530
commit4099238c0bc191ab6ad0b236a1f45d530559982d (patch)
treee4e2238e3927951fcc825504aead2ef6737090ba /website
parentfdf46a6dd8d33d96f5b3d0e032bcfa153b6155a5 (diff)
parentdf5b673cfb13f4ce66146723384172ee981a6a07 (diff)
downloadnccps-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-xwebsite/forms.py22
-rw-r--r--website/migrations/0004_auto_20181010_0942.py45
-rw-r--r--website/models.py28
-rw-r--r--website/urls.py9
-rw-r--r--website/views.py209
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]})
+