From b0ab5d93393d191ffbc6e0c4b0cc3ebc2624fc27 Mon Sep 17 00:00:00 2001
From: prathamesh
Date: Fri, 13 Nov 2020 15:34:22 +0530
Subject: Use QRcode to upload a file from any device
---
yaksh/models.py | 81 +++++++++++++++++++++++++++++++++-
yaksh/templates/yaksh/question.html | 9 +++-
yaksh/templates/yaksh/upload_file.html | 32 ++++++++++++++
yaksh/urls.py | 4 ++
yaksh/views.py | 75 ++++++++++++++++++++++++++++++-
5 files changed, 198 insertions(+), 3 deletions(-)
create mode 100644 yaksh/templates/yaksh/upload_file.html
diff --git a/yaksh/models.py b/yaksh/models.py
index e2b9952..e9b2c1b 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -26,6 +26,8 @@ import tempfile
from textwrap import dedent
from ast import literal_eval
import pandas as pd
+import qrcode
+import hashlib
# Django Imports
from django.db import models
@@ -2923,7 +2925,7 @@ class TOCManager(models.Manager):
topic = Topic.objects.create(**content)
toc.append(TableOfContents(
course_id=course_id, lesson_id=lesson_id, time=time,
- content_object=topic, content=content_type
+ content_object=topic, content=content_type
))
messages.append((True, f"{topic.name} added successfully"))
else:
@@ -3175,3 +3177,80 @@ class MicroManager(models.Model):
def __str__(self):
return 'MicroManager for {0} - {1}'.format(self.student.username,
self.course.name)
+
+
+class QRcode(models.Model):
+ random_key = models.CharField(max_length=128, blank=True)
+ short_key = models.CharField(max_length=128, null=True, unique=True)
+ image = models.ImageField(upload_to='qrcode', blank=True)
+ used = models.BooleanField(default=False)
+ active = models.BooleanField(default=False)
+ handler = models.ForeignKey('QRcodeHandler', on_delete=models.CASCADE)
+
+ def __str__(self):
+ return 'QRcode {0}'.format(self.short_key)
+
+ def is_active(self):
+ return self.active
+
+ def is_used(self):
+ return self.used
+
+ def deactivate(self):
+ self.active = False
+
+ def activate(self):
+ self.active = True
+
+ def set_used(self):
+ self.used = True
+
+ def set_random_key(self):
+ key = hashlib.sha1('{0}'.format(self.id).encode()).hexdigest()
+ self.random_key = key
+
+ def set_short_key(self):
+ key = self.random_key
+ if key:
+ num = 5
+ for i in range(40):
+ try:
+ self.short_key = key[0 : num]
+ break
+ except django.db.IntegrityError:
+ num = num + 1
+
+ def generate_image(self, content):
+ img = qrcode.make(content)
+ path = os.path.join(settings.MEDIA_ROOT, 'qrcode',
+ '{0}.png'.format(self.short_key))
+ img.save(path)
+ self.image = os.path.join('qrcode', '{0}.png'.format(self.short_key))
+ self.activate()
+
+
+class QRcodeHandler(models.Model):
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ answerpaper = models.ForeignKey(AnswerPaper, on_delete=models.CASCADE)
+ question = models.ForeignKey(Question, on_delete=models.CASCADE)
+
+
+ def __str__(self):
+ return 'QRcode Handler for {0}'.format(self.user.username)
+
+ def get_qrcode(self):
+ qrcodes = self.qrcode_set.filter(active=True, used=False)
+ if qrcodes.exists():
+ return qrcodes.last()
+ else:
+ return self._create_qrcode()
+
+ def _create_qrcode(self):
+ qrcode = QRcode.objects.create(handler=self)
+ qrcode.set_random_key()
+ qrcode.set_short_key()
+ return qrcode
+
+ def can_use(self):
+ return self.answerpaper.is_attempt_inprogress()
+
diff --git a/yaksh/templates/yaksh/question.html b/yaksh/templates/yaksh/question.html
index 2dbfeed..9189324 100644
--- a/yaksh/templates/yaksh/question.html
+++ b/yaksh/templates/yaksh/question.html
@@ -285,6 +285,14 @@ question_type = "{{ question.type }}";
{% endfor %}
{% endif %}
+ {% if qrcode %}
+
+ {% else %}
+ Generate QR Code
+ {% endif %}
+
{% endif %}
@@ -365,7 +373,6 @@ question_type = "{{ question.type }}";
{% if question.type == 'code' or question.type == 'upload' %}
{% endif %}
-
diff --git a/yaksh/templates/yaksh/upload_file.html b/yaksh/templates/yaksh/upload_file.html
new file mode 100644
index 0000000..04d8b09
--- /dev/null
+++ b/yaksh/templates/yaksh/upload_file.html
@@ -0,0 +1,32 @@
+
+
Upload File
+
+
+
+
+{% if success %}
+
{{ msg }}
+{% else %}
+
+{% endif %}
+
+
diff --git a/yaksh/urls.py b/yaksh/urls.py
index e93d80a..f75df3d 100644
--- a/yaksh/urls.py
+++ b/yaksh/urls.py
@@ -156,6 +156,10 @@ urlpatterns = [
name="questions_filter"),
url(r'^editprofile/$', views.edit_profile, name='edit_profile'),
url(r'^viewprofile/$', views.view_profile, name='view_profile'),
+ url(r'^generate_qrcode/(?P
\d+)/(?P\d+)/(?P\d+)/$',
+ views.generate_qrcode, name='generate_qrcode'),
+ url(r'^upload_file/(?P.+)/$',
+ views.upload_file, name='upload_file'),
url(r'^manage/searchteacher/(?P\d+)/$', views.search_teacher,
name="search_teacher"),
diff --git a/yaksh/views.py b/yaksh/views.py
index b3b1e02..63a41af 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -40,7 +40,8 @@ from yaksh.models import (
StdIOBasedTestCase, StringTestCase, TestCase, User,
get_model_class, FIXTURES_DIR_PATH, MOD_GROUP_NAME, Lesson, LessonFile,
LearningUnit, LearningModule, CourseStatus, question_types, Post, Comment,
- Topic, TableOfContents, LessonQuizAnswer, MicroManager
+ Topic, TableOfContents, LessonQuizAnswer, MicroManager, QRcode,
+ QRcodeHandler
)
from yaksh.forms import (
UserRegisterForm, UserLoginForm, QuizForm, QuestionForm,
@@ -57,6 +58,7 @@ from .send_emails import (send_user_mail,
from .decorators import email_verified, has_profile
from .tasks import regrade_papers
from notifications_plugin.models import Notification
+import hashlib
def my_redirect(url):
@@ -671,6 +673,7 @@ def show_question(request, question, paper, error_message=None,
quiz_type = 'Exam'
can_skip = False
assignment_files = []
+ qrcode = []
if previous_question:
delay_time = paper.time_left_on_question(previous_question)
else:
@@ -719,6 +722,13 @@ def show_question(request, question, paper, error_message=None,
user=request.user,
question_paper_id=paper.question_paper_id
)
+ handlers = QRcodeHandler.objects.filter(user=request.user,
+ question=question,
+ answerpaper=paper)
+ qrcode = None
+ if handlers.exists():
+ handler = handlers.last()
+ qrcode = handler.qrcode_set.filter(active=True, used=False).last()
files = FileUpload.objects.filter(question_id=question.id, hide=False)
course = Course.objects.get(id=course_id)
module = course.learning_module.get(id=module_id)
@@ -739,6 +749,7 @@ def show_question(request, question, paper, error_message=None,
'quiz_type': quiz_type,
'all_modules': all_modules,
'assignment_files': assignment_files,
+ 'qrcode': qrcode,
}
answers = paper.get_previous_answers(question)
if answers:
@@ -4136,3 +4147,65 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids):
messages.info(request,
'Updated successfully for user: {0}, question: {1}'.format(
username, question.summary))
+
+
+@login_required
+@email_verified
+def generate_qrcode(request, answerpaper_id, question_id, module_id):
+ user = request.user
+ answerpaper = get_object_or_404(AnswerPaper, pk=answerpaper_id)
+ question = get_object_or_404(Question, pk=question_id)
+
+ if not answerpaper.is_attempt_inprogress():
+ pass
+ handler = QRcodeHandler.objects.get_or_create(user=user, question=question,
+ answerpaper=answerpaper)[0]
+ qrcode = handler.get_qrcode()
+ content = '{0}/exam/upload_file/{1}'.format(URL_ROOT, qrcode.short_key)
+ qrcode.generate_image(content)
+ qrcode.save()
+ return show_question(request, question, answerpaper,
+ course_id=answerpaper.course.id, module_id=module_id,
+ previous_question=question)
+
+
+def upload_file(request, key):
+ qrcode = get_object_or_404(QRcode, short_key=key, active=True, used=False)
+ handler = qrcode.handler
+ context = {'question' : handler.question, 'key' : qrcode.short_key}
+ if not handler.can_use():
+ context['success'] = True
+ context['msg'] = 'Sorry, test time up!'
+ return render(request, 'yaksh/upload_file.html', context)
+ if request.method == 'POST':
+ assignment_filename = request.FILES.getlist('assignment')
+ if not assignment_filename:
+ msg = 'Please upload assignment file'
+ context['msg'] = msg
+ return render(request, 'yaksh/upload_file.html', context)
+ for fname in assignment_filename:
+ fname._name = fname._name.replace(" ", "_")
+ assignment_files = AssignmentUpload.objects.filter(
+ assignmentQuestion=handler.question,
+ course_id=handler.answerpaper.course.id,
+ assignmentFile__icontains=fname, user=handler.user,
+ question_paper=handler.answerpaper.question_paper)
+ if assignment_files.exists():
+ assign_file = assignment_files.first()
+ if os.path.exists(assign_file.assignmentFile.path):
+ os.remove(assign_file.assignmentFile.path)
+ assign_file.delete()
+ AssignmentUpload.objects.create(user=handler.user,
+ assignmentQuestion=handler.question,
+ course_id=handler.answerpaper.course.id, assignmentFile=fname,
+ question_paper=handler.answerpaper.question_paper)
+ qrcode.set_used()
+ qrcode.deactivate()
+ qrcode.save()
+ context['success'] = True
+ msg = "File Uploaded Successfully! Reload the (test)question "\
+ "page to see the uploaded file"
+ context['msg'] = msg
+ return render(request, 'yaksh/upload_file.html', context)
+ return render(request, 'yaksh/upload_file.html', context)
+
--
cgit
From 01efe49e230163d276c340a7de7317a949dde31a Mon Sep 17 00:00:00 2001
From: prathamesh
Date: Fri, 4 Dec 2020 08:29:54 +0530
Subject: Add qrcode package to the requirements and fix PEP8
---
requirements/requirements-common.txt | 3 ++-
yaksh/models.py | 4 +---
yaksh/urls.py | 9 ++++-----
yaksh/views.py | 21 +++++++++++----------
4 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/requirements/requirements-common.txt b/requirements/requirements-common.txt
index 4475957..8c397c7 100644
--- a/requirements/requirements-common.txt
+++ b/requirements/requirements-common.txt
@@ -18,4 +18,5 @@ django-celery-results==1.2.1
djangorestframework==3.11.0
django-cors-headers==3.1.0
Pillow
-pandas
\ No newline at end of file
+pandas
+qrcode
diff --git a/yaksh/models.py b/yaksh/models.py
index e9b2c1b..3182cc8 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -3215,7 +3215,7 @@ class QRcode(models.Model):
num = 5
for i in range(40):
try:
- self.short_key = key[0 : num]
+ self.short_key = key[0:num]
break
except django.db.IntegrityError:
num = num + 1
@@ -3234,7 +3234,6 @@ class QRcodeHandler(models.Model):
answerpaper = models.ForeignKey(AnswerPaper, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
-
def __str__(self):
return 'QRcode Handler for {0}'.format(self.user.username)
@@ -3253,4 +3252,3 @@ class QRcodeHandler(models.Model):
def can_use(self):
return self.answerpaper.is_attempt_inprogress()
-
diff --git a/yaksh/urls.py b/yaksh/urls.py
index f75df3d..0107988 100644
--- a/yaksh/urls.py
+++ b/yaksh/urls.py
@@ -156,11 +156,10 @@ urlpatterns = [
name="questions_filter"),
url(r'^editprofile/$', views.edit_profile, name='edit_profile'),
url(r'^viewprofile/$', views.view_profile, name='view_profile'),
- url(r'^generate_qrcode/(?P\d+)/(?P\d+)/(?P\d+)/$',
- views.generate_qrcode, name='generate_qrcode'),
- url(r'^upload_file/(?P.+)/$',
- views.upload_file, name='upload_file'),
-
+ url(r'^generate_qrcode/(?P\d+)/(?P\d+)/'
+ r'(?P\d+)/$',
+ views.generate_qrcode, name='generate_qrcode'),
+ url(r'^upload_file/(?P.+)/$', views.upload_file, name='upload_file'),
url(r'^manage/searchteacher/(?P\d+)/$', views.search_teacher,
name="search_teacher"),
url(r'^manage/addteacher/(?P\d+)/$', views.add_teacher,
diff --git a/yaksh/views.py b/yaksh/views.py
index 63a41af..7ec6f0f 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -723,8 +723,8 @@ def show_question(request, question, paper, error_message=None,
question_paper_id=paper.question_paper_id
)
handlers = QRcodeHandler.objects.filter(user=request.user,
- question=question,
- answerpaper=paper)
+ question=question,
+ answerpaper=paper)
qrcode = None
if handlers.exists():
handler = handlers.last()
@@ -4104,8 +4104,8 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids):
username = row['username']
user = User.objects.filter(username=username).first()
if user:
- answerpapers = question_paper.answerpaper_set.filter(course=course,
- user_id=user.id)
+ answerpapers = question_paper.answerpaper_set.filter(
+ course=course, user_id=user.id)
else:
messages.info(request, '{0} user not found!'.format(username))
continue
@@ -4119,7 +4119,7 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids):
question = Question.objects.filter(id=qid).first()
if not question:
messages.info(request,
- '{0} is an invalid question id!'.format(qid))
+ '{0} is an invalid question id!'.format(qid))
continue
if qid in questions:
answer = answers.filter(question_id=qid).last()
@@ -4138,13 +4138,14 @@ def _read_marks_csv(request, reader, course, question_paper, question_ids):
answer.set_marks(float(row[key1]))
except ValueError:
messages.info(request,
- '{0} invalid marks!'.format(row[key1]))
+ '{0} invalid marks!'.format(row[key1]))
if key2 in reader.fieldnames:
answer.set_comment(row[key2])
answer.save()
answerpaper.update_marks(state='completed')
answerpaper.save()
- messages.info(request,
+ messages.info(
+ request,
'Updated successfully for user: {0}, question: {1}'.format(
username, question.summary))
@@ -4172,7 +4173,7 @@ def generate_qrcode(request, answerpaper_id, question_id, module_id):
def upload_file(request, key):
qrcode = get_object_or_404(QRcode, short_key=key, active=True, used=False)
handler = qrcode.handler
- context = {'question' : handler.question, 'key' : qrcode.short_key}
+ context = {'question': handler.question, 'key': qrcode.short_key}
if not handler.can_use():
context['success'] = True
context['msg'] = 'Sorry, test time up!'
@@ -4195,7 +4196,8 @@ def upload_file(request, key):
if os.path.exists(assign_file.assignmentFile.path):
os.remove(assign_file.assignmentFile.path)
assign_file.delete()
- AssignmentUpload.objects.create(user=handler.user,
+ AssignmentUpload.objects.create(
+ user=handler.user,
assignmentQuestion=handler.question,
course_id=handler.answerpaper.course.id, assignmentFile=fname,
question_paper=handler.answerpaper.question_paper)
@@ -4208,4 +4210,3 @@ def upload_file(request, key):
context['msg'] = msg
return render(request, 'yaksh/upload_file.html', context)
return render(request, 'yaksh/upload_file.html', context)
-
--
cgit
From f5224d8d1866122ad2ecfb3118ffd724c4dd3cf8 Mon Sep 17 00:00:00 2001
From: prathamesh
Date: Fri, 4 Dec 2020 12:38:55 +0530
Subject: Add Test Case for upload using QR Code
---
yaksh/models.py | 5 +-
yaksh/test_models.py | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 164 insertions(+), 4 deletions(-)
diff --git a/yaksh/models.py b/yaksh/models.py
index 3182cc8..407435e 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -30,7 +30,7 @@ import qrcode
import hashlib
# Django Imports
-from django.db import models
+from django.db import models, IntegrityError
from django.contrib.auth.models import User, Group, Permission
from django.core.exceptions import ValidationError
from django.contrib.contenttypes.models import ContentType
@@ -3216,8 +3216,9 @@ class QRcode(models.Model):
for i in range(40):
try:
self.short_key = key[0:num]
+ self.save()
break
- except django.db.IntegrityError:
+ except IntegrityError:
num = num + 1
def generate_image(self, content):
diff --git a/yaksh/test_models.py b/yaksh/test_models.py
index fe0d3b5..d6e5a12 100644
--- a/yaksh/test_models.py
+++ b/yaksh/test_models.py
@@ -6,7 +6,8 @@ from yaksh.models import User, Profile, Question, Quiz, QuestionPaper,\
QuestionSet, AnswerPaper, Answer, Course, StandardTestCase,\
StdIOBasedTestCase, FileUpload, McqTestCase, AssignmentUpload,\
LearningModule, LearningUnit, Lesson, LessonFile, CourseStatus, \
- create_group, legend_display_types, Post, Comment, MicroManager
+ create_group, legend_display_types, Post, Comment, MicroManager, QRcode, \
+ QRcodeHandler
from yaksh.code_server import (
ServerPool, get_result as get_result_from_code_server
)
@@ -22,6 +23,7 @@ import zipfile
import os
import shutil
import tempfile
+import hashlib
from threading import Thread
from collections import defaultdict
from yaksh import settings
@@ -121,7 +123,6 @@ def tearDownModule():
MicroManager.objects.all().delete()
Group.objects.all().delete()
-
###############################################################################
class GlobalMethodsTestCases(unittest.TestCase):
def test_create_group_when_group_exists(self):
@@ -2451,3 +2452,161 @@ class PostModelTestCases(unittest.TestCase):
self.user3.delete()
self.course.delete()
self.post1.delete()
+
+
+class QRcodeTestCase(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ quiz = Quiz.objects.get(description='demo quiz 1')
+ cls.questionpaper = QuestionPaper.objects.create(quiz=quiz)
+ question = Question.objects.get(summary='Q1')
+ question.type = 'upload'
+ question.save()
+ cls.questionpaper.fixed_questions.add(question)
+ cls.questionpaper.update_total_marks()
+ student = User.objects.get(username='course_user')
+ course = Course.objects.get(name='Python Course')
+ attempt = 1
+ ip = '127.0.0.1'
+ answerpaper = cls.questionpaper.make_answerpaper(
+ student, ip, attempt, course.id)
+ cls.qrcode_handler = QRcodeHandler.objects.create(
+ user=student, answerpaper=answerpaper, question=question)
+ cls.old_qrcode = cls.qrcode_handler._create_qrcode()
+ cls.old_qrcode.set_used()
+ cls.old_qrcode.save()
+ cls.qrcode = cls.qrcode_handler.get_qrcode()
+ cls.answerpaper = answerpaper
+
+ @classmethod
+ def tearDownClass(cls):
+ cls.qrcode.image.delete()
+ cls.qrcode.delete()
+ cls.qrcode_handler.delete()
+ cls.answerpaper.delete()
+ cls.questionpaper.delete()
+ QRcode.objects.all().delete()
+ QRcodeHandler.objects.all().delete()
+
+ def test_active(self):
+ # Given
+ qrcode = self.qrcode
+
+ # Then
+ self.assertFalse(qrcode.is_active())
+
+ # When
+ qrcode.activate()
+ qrcode.save()
+
+ # Then
+ self.assertTrue(qrcode.is_active())
+
+ # When
+ qrcode.deactivate()
+ qrcode.save()
+
+ # Then
+ self.assertFalse(qrcode.is_active())
+
+ def test_used(self):
+ # Given
+ qrcode = self.qrcode
+
+ # Then
+ self.assertFalse(qrcode.is_used())
+
+ # When
+ qrcode.set_used()
+ qrcode.save()
+
+ # Then
+ self.assertTrue(qrcode.is_used())
+
+ # When
+ qrcode.used = False
+ qrcode.save()
+
+ # Then
+ self.assertFalse(qrcode.is_used())
+
+ def test_random_key(self):
+ # Given
+ qrcode = self.qrcode
+
+ # When
+ expect_key = hashlib.sha1('{0}'.format(qrcode.id).encode()).hexdigest()
+
+ # Then
+ self.assertEqual(qrcode.random_key, expect_key)
+ self.assertEqual(len(qrcode.random_key), 40)
+
+ def test_short_key(self):
+ # Given
+ qrcode = self.qrcode
+
+ # When
+ expect_key = hashlib.sha1('{0}'.format(qrcode.id).encode()).hexdigest()
+
+ # Then
+ self.assertEqual(qrcode.short_key, expect_key[0:5])
+ self.assertEqual(len(qrcode.short_key), 5)
+
+ # Given
+ old_qrcode = self.old_qrcode
+ old_qrcode.random_key = qrcode.random_key
+ old_qrcode.save()
+
+ # When
+ old_qrcode.set_short_key()
+
+ # Then
+ self.assertEqual(old_qrcode.short_key, expect_key[0:6])
+ self.assertEqual(len(old_qrcode.short_key), 6)
+
+ def test_generate_image(self):
+ # Given
+ qrcode = self.qrcode
+ image_name = 'qrcode/{0}.png'.format(qrcode.short_key)
+
+ # When
+ qrcode.generate_image('test')
+
+ # Then
+ self.assertTrue(qrcode.is_active())
+ self.assertEqual(qrcode.image.name, image_name)
+
+ def test_get_qrcode(self):
+ # Given
+ handler = self.qrcode_handler
+ self.qrcode.activate()
+ self.qrcode.save()
+ expected_qrcode = self.qrcode
+
+ # When
+ qrcode = handler.get_qrcode()
+
+ # Then
+ self.assertEqual(qrcode, expected_qrcode)
+ self.qrcode.deactivate()
+ self.qrcode.save()
+
+ def test_can_use(self):
+ # Given
+ handler = self.qrcode_handler
+
+ # When
+ can_use = handler.can_use()
+
+ # Then
+ self.assertTrue(can_use)
+
+ # Given
+ answerpaper = self.answerpaper
+
+ # When
+ answerpaper.update_marks(state='complete')
+ can_use = handler.can_use()
+
+ # Then
+ self.assertFalse(can_use)
--
cgit
From f38664721ed117f445b27af839fe41898ed90a47 Mon Sep 17 00:00:00 2001
From: prathamesh
Date: Wed, 24 Mar 2021 12:56:33 +0530
Subject: Modify QR code functionality, courtesy @adityacp
---
yaksh/models.py | 6 ++-
yaksh/templates/yaksh/question.html | 9 +++--
yaksh/templates/yaksh/upload_file.html | 72 ++++++++++++++++++++++++++++------
yaksh/views.py | 58 ++++++++++++++-------------
4 files changed, 98 insertions(+), 47 deletions(-)
diff --git a/yaksh/models.py b/yaksh/models.py
index d792205..efe772c 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -3360,8 +3360,10 @@ class QRcode(models.Model):
def generate_image(self, content):
img = qrcode.make(content)
- path = os.path.join(settings.MEDIA_ROOT, 'qrcode',
- '{0}.png'.format(self.short_key))
+ qr_dir = os.path.join(settings.MEDIA_ROOT, 'qrcode')
+ if not os.path.exists(qr_dir):
+ os.makedirs(qr_dir)
+ path = os.path.join(qr_dir, f'{self.short_key}.png')
img.save(path)
self.image = os.path.join('qrcode', '{0}.png'.format(self.short_key))
self.activate()
diff --git a/yaksh/templates/yaksh/question.html b/yaksh/templates/yaksh/question.html
index 3b73781..17305b6 100644
--- a/yaksh/templates/yaksh/question.html
+++ b/yaksh/templates/yaksh/question.html
@@ -290,12 +290,13 @@ question_type = "{{ question.type }}";
{% endif %}
+
{% if qrcode %}
-

+

{% else %}
-
Generate QR Code
+
+
Generate QR Code
{% endif %}
{% endif %}
diff --git a/yaksh/templates/yaksh/upload_file.html b/yaksh/templates/yaksh/upload_file.html
index 04d8b09..e25e8e7 100644
--- a/yaksh/templates/yaksh/upload_file.html
+++ b/yaksh/templates/yaksh/upload_file.html
@@ -1,16 +1,10 @@
+{% load static %}
Upload File
-
-
+
+
+
+