diff options
-rwxr-xr-x | .gitignore | 8 | ||||
-rw-r--r-- | nccps2018/settings.py | 8 | ||||
-rw-r--r-- | static/website/templates/navbar.html | 1 | ||||
-rw-r--r-- | static/website/templates/take_quiz.html | 75 | ||||
-rw-r--r-- | static/website/templates/view_solutions.html | 40 | ||||
-rw-r--r-- | website/admin.py | 10 | ||||
-rwxr-xr-x | website/forms.py | 5 | ||||
-rw-r--r-- | website/migrations/0005_uploadmodel.py | 22 | ||||
-rw-r--r-- | website/models.py | 14 | ||||
-rw-r--r-- | website/urls.py | 1 | ||||
-rw-r--r-- | website/views.py | 98 |
11 files changed, 251 insertions, 31 deletions
@@ -20,4 +20,10 @@ db.sqlite3 # Django Migration files #MAC OS specific -.DS_Store
\ No newline at end of file +.DS_Store + +#VScode +.vscode/ + +# +uploads/ diff --git a/nccps2018/settings.py b/nccps2018/settings.py index f28ffa7..9ce4c32 100644 --- a/nccps2018/settings.py +++ b/nccps2018/settings.py @@ -81,10 +81,10 @@ WSGI_APPLICATION = 'nccps2018.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', - 'NAME': DB_NAME_DEFAULT, # Or path to database file if using sqlite3. - 'USER': DB_USER_DEFAULT, - 'PASSWORD': DB_PASS_DEFAULT, - 'HOST': DB_HOST_DEFAULT, + 'NAME': DB_NAME_DEFAULT, # Or path to database file if using sqlite3. + 'USER': DB_USER_DEFAULT, + 'PASSWORD': DB_PASS_DEFAULT, + 'HOST': DB_HOST_DEFAULT, } } diff --git a/static/website/templates/navbar.html b/static/website/templates/navbar.html index d43f6d0..993a4e9 100644 --- a/static/website/templates/navbar.html +++ b/static/website/templates/navbar.html @@ -57,6 +57,7 @@ {% else %} <!--<li><a href="{% url 'website:proposal' %}">Submit your Paper</a></li> --> <li><a href="{% url 'website:quiz_intro' %}">Take Quiz</a></li> + <li><a href="{% url 'website:view_solutions' %}">View Solutions</a></li> {% endif %} <!-- <li><a href="{{SITE_URL}}/#registration">Book your Ticket</a></li> --> <li><a href="{% url 'auth:logout' %}?next=/nccps-2018"><i class="fa fa-sign-out"></i> Logout</a></li> diff --git a/static/website/templates/take_quiz.html b/static/website/templates/take_quiz.html index 15bb05e..3e62018 100644 --- a/static/website/templates/take_quiz.html +++ b/static/website/templates/take_quiz.html @@ -3,7 +3,9 @@ {% load static %} {% block content %} <br><br><br><br> -<div class="container"> + +{% if set_visible %} + <div class="container"> {% if messages %} <ul class="messages"> @@ -43,6 +45,75 @@ <button class="btn btn-primary center-block" type="Submit">Submit</button> <br> </form> {% endif %} + </div> + + {% else %} + + <div class="container"> + <h2> DWSIM Flowsheeting Creation Competition</h2> + <br> + <ul> + <li> Top 8 participants in the leaderboard by end of 02-11-2018, 11:59 PM are eligible for this competition.</li> + <li> These participants will receive the problem statement to be solved in DWSIM directly through e-mail by 03-11-2018, 12:00 noon.</li> + <li>Participants have to propose the assigned flowsheet in the DWSIM Flowsheeting Project webpage using the proposal form + <a href="https://dwsim.fossee.in/flowsheeting-project/proposal" style="color: #cc0000">here.</a> + The proposal should be submitted by 04-11-2018, 12:00 noon.</li> + <li>In case of any issues regarding submission of proposal, please write to us at <a href="mailto:contact-dwsim@fossee.in" style="color: hsl(236, 95%, 50%)">contact-dwsim@fossee.in</a> before the deadline for proposal submission.</li> + <li>Participants can start creating the simulation for the assigned flowsheet as soon as they submit the proposal. Participants need not wait for approval of the proposal to start working on the flowsheet.</li> + <li>No extension in deadline will be granted for submission of proposal. If any of the participant doesn’t submit the proposal by the given deadline, flowsheet will be assigned to the next participant i.e. the 9th participant in the leaderboard and so on.</li> + <li>Solve the flowsheet using <u>DWSIM Version 5.4 Update 2.</u></li> + <li>Flowsheet and a well written abstract should be submitted <a href="https://dwsim.fossee.in/flowsheeting-project/abstract-code/upload" style="color: #cc0000">here.</a></li> + <li>Flowsheet creation competition would carry 50 marks in total divided in the following manner.</li> + <ol> + <li>Approach to the flowsheet - 10</li> + <li>Validation / Accuracy of results in the flowsheet - 20 </li> + <li>Presentation of the flowsheet - 10 </li> + <li>Abstract - 10</li> + </ol> + <li>Please adhere to the guidelines for the flowsheet development and abstract mentioned <a href="https://dwsim.fossee.in/flowsheeting-project/coding-guidelines-flowsheeting" style="color: #cc0000">here.</a></li> + <li>The last date for submission of flow sheet is 8-11-2018, 11:59 PM.</li> + <li>Submission of correct flowsheet by 04-11-2018, 11:59 PM will attract bonus of 10 marks.</li> + <li>Submission of correct flowsheet by 05-11-2018, 11:59 PM will attract bonus of 7 marks.</li> + <li> Submission of correct flowsheet by 06-11-2018, 11:59 PM will attract bonus of 5 marks.</li> + <li>If the flowsheet is not as per the given problem statement, participants will be given chance to correct and re-upload the flowsheet. In that case, no bonus marks will be rewarded.</li> + <li>Decision of the NCCPS team regarding marking of the flowsheeting competition will be final.</li> + <br> + </ul> + </div> + + <br> + + <section> + <div class="container"> + <h3>Leaderboard</h3> + <table border="1" width="90%"> + <thead> + <tr> + <th>Participant Name</th> +   + <th>Score</th> + </tr> + </thead> + + {% for participant in leaderboard %} + <tbody> + <tr> + <td> +   {{ participant.0.user.get_full_name }} + </td> + + <td> +   {{ participant.1 }} + </td> + </tr> + </tbody> + {% endfor %} + </table> + + </div> + </section> +<br><br> + + {% endif %} -</div> {% endblock %}
\ No newline at end of file diff --git a/static/website/templates/view_solutions.html b/static/website/templates/view_solutions.html new file mode 100644 index 0000000..2074dcb --- /dev/null +++ b/static/website/templates/view_solutions.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} + +{% load static %} + {% block content %} + <br><br> + <br><br> + + <div class="container"> + {% if set_visible %} + <form method="POST"> + {% csrf_token %} + <button class="btn-default btn-info btn-lg" name="Download">Download Model Files</button> + </form> + <br><br> + + <table style="width:100%" class="table table-hover"> + <thead> + <tr> + <th>Question</th> + <th>Answer</th> + </tr> + </thead> + {% for q in question_ans_list %} + <tbody> + <tr> + <td>{{ q.question }} </td> + <td>{{ q.correct_answer }} </td> + </tr> + </tbody> + {% endfor %} + </table> + + {% else %} + <div class="jumbotron"> + <p>This page will be visible from <strong>15-11-2018</strong></p> + </div> + {% endif %} +</div> + +{% endblock %}
\ No newline at end of file diff --git a/website/admin.py b/website/admin.py index c6a7d78..7a6ba2e 100644 --- a/website/admin.py +++ b/website/admin.py @@ -3,7 +3,8 @@ import csv from django.http import HttpResponse from .models import( Profile, AnswerPaper, - Question + Question, + UploadModel ) try: @@ -45,7 +46,12 @@ class AnswerPaperAdmin(admin.ModelAdmin): +class UploadModelAdmin(admin.ModelAdmin): + list_display = ['question'] + + # Register your models here. admin.site.register(Profile, ProfileAdmin) admin.site.register(AnswerPaper, AnswerPaperAdmin) -admin.site.register(Question, QuestionAdmin)
\ No newline at end of file +admin.site.register(Question, QuestionAdmin) +admin.site.register(UploadModel, UploadModelAdmin)
\ No newline at end of file diff --git a/website/forms.py b/website/forms.py index 5b094e7..9df1fcb 100755 --- a/website/forms.py +++ b/website/forms.py @@ -1,7 +1,7 @@ from django import forms from django.forms import ModelForm, widgets - +import datetime from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from django.core.validators import MinLengthValidator, MinValueValidator, \ @@ -396,4 +396,5 @@ class QuestionUploadForm(forms.ModelForm): widgets = { 'question_day': DateInput(), - }
\ No newline at end of file + } + diff --git a/website/migrations/0005_uploadmodel.py b/website/migrations/0005_uploadmodel.py new file mode 100644 index 0000000..a357f95 --- /dev/null +++ b/website/migrations/0005_uploadmodel.py @@ -0,0 +1,22 @@ +# Generated by Django 2.1 on 2018-10-31 05:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('website', '0004_auto_20181012_0951'), + ] + + operations = [ + migrations.CreateModel( + name='UploadModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('model_file', models.FileField(upload_to='uploads/')), + ('question', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='website.Question')), + ], + ), + ] diff --git a/website/models.py b/website/models.py index 2481177..ad6b3e4 100644 --- a/website/models.py +++ b/website/models.py @@ -34,7 +34,7 @@ def get_document_dir(instance, filename): fname, fext = os.path.splitext(filename) # print "----------------->",instance.user return '%s/attachment/%s/%s.%s' % (instance.user, instance.proposal_type, fname+'_'+str(instance.user), fext) - + class Proposal(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE,) @@ -117,10 +117,20 @@ class Question(models.Model): # The date for the question. question_day = models.DateField() + def __str__(self): + return u"{0} || {1}".format(self.correct_answer, self.question_day) + 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 + date = models.DateTimeField(auto_now=True) + + +#To upload model for each question + +class UploadModel(models.Model): + question = models.ForeignKey(Question, on_delete=models.CASCADE, blank=True) + model_file = models.FileField(upload_to='uploads/') diff --git a/website/urls.py b/website/urls.py index a6aabe3..841f338 100644 --- a/website/urls.py +++ b/website/urls.py @@ -21,6 +21,7 @@ urlpatterns = [ 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'^view_solutions/$', views.view_solutions, name='view_solutions'), 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'), diff --git a/website/views.py b/website/views.py index 4a52495..5aee28e 100644 --- a/website/views.py +++ b/website/views.py @@ -1,6 +1,6 @@ # Create your views here. -from django.http import HttpResponse +from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.shortcuts import render_to_response, render, redirect from django.template import loader @@ -13,21 +13,27 @@ from django.views.decorators.csrf import (csrf_exempt, csrf_protect, from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from website.models import (Proposal, Comments, Ratings, Question, - AnswerPaper, Profile) + AnswerPaper, Profile, UploadModel) from website.forms import (ProposalForm, UserRegisterForm, UserRegistrationForm, - UserLoginForm, WorkshopForm,QuestionUploadForm) # ,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 datetime import datetime, date from django import template from django.core.mail import EmailMultiAlternatives -import os +import os, re from nccps2018.config import * from website.send_mails import send_email from django.contrib.auth.models import Group from django.contrib import messages +from zipfile import ZipFile +try: + from StringIO import StringIO as string_io +except ImportError: + from io import BytesIO as string_io @@ -1094,6 +1100,30 @@ def edit_question(request, qid=None): def quiz_intro(request): return render(request, 'quiz_intro.html') + +def calculate_leader(): + profiles = Profile.objects.all() + leaderboard = {p:0 for p in profiles} + marks = { + '5': [date(2018, 10, 29), date(2018, 11, 4)], + '10': [date(2018, 11, 5), date(2018, 11, 12)] + } + answers = AnswerPaper.objects.all() + + for i in leaderboard: + profiles = AnswerPaper.objects.filter(participant=i) + for p in profiles: + if p.validate_ans==1: + if marks['5'][0] <= p.answered_q.question_day <= marks['5'][1]: + leaderboard[i] +=5 + else: + leaderboard[i] +=1 + + + sorted_leaderboard = sorted(leaderboard.items(), key=lambda kv: kv[1]) + return sorted_leaderboard + + @login_required def take_quiz(request): user = request.user @@ -1162,24 +1192,56 @@ def take_quiz(request): except: pass + today = datetime.today().date() + if today > date(2018, 11, 4): + set_visible = 0 + else: + set_visible = 1 + sorted_leaderboard = calculate_leader() + return render(request, 'take_quiz.html', { - 'question_list' : questions + 'question_list' : questions, + 'set_visible': set_visible, + "leaderboard": sorted_leaderboard[::-1] }) -def leaderboard(request): - profiles = Profile.objects.all() - leaderboard = {p:0 for p in profiles} +def leaderboard(request): + sorted_leaderboard = calculate_leader() + return render(request, "leaderboard.html", {'leaderboard': sorted_leaderboard[::-1]}) - 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]}) +@login_required +def view_solutions(request,id=None): + ''''Show solutions to participants after a specific date''' + question_ans_list = Question.objects.all() + today = datetime.today().date() + if today < date(2018, 11, 15): + set_visible = 0 + else: + set_visible = 1 + if request.method == 'POST': + filename = UploadModel.objects.all() + attachment_path = os.path.dirname(filename[0].model_file.path) + zipfile_name = string_io() + zipfile = ZipFile(zipfile_name, "w") + attachments = os.listdir(attachment_path) + for file in attachments: + file_path = os.sep.join((attachment_path, file)) + zipfile.write(file_path, os.path.basename(file_path)) + zipfile.close() + zipfile_name.seek(0) + response = HttpResponse(content_type='application/zip') + response['Content-Disposition'] = 'attachment; filename={0}.zip'.format( + "Solutions" + ) + response.write(zipfile_name.read()) + return response + + + return render(request, 'view_solutions.html', {"question_ans_list": question_ans_list, + "set_visible": set_visible + }) +
\ No newline at end of file |