summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/models.py6
-rw-r--r--yaksh/templates/yaksh/question.html9
-rw-r--r--yaksh/templates/yaksh/upload_file.html72
-rw-r--r--yaksh/views.py58
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 }}";
</ul>
</div>
{% endif %}
+ <br>
{% if qrcode %}
- <img src="{{ qrcode.image.url }}">
+ <img src="{{ qrcode.image.url }}" width="200" height="200">
{% else %}
- <a class="active btn btn-outline-primary " href="#"data-toggle="tooltip"
- title="Upload from any device using the QR Code"
- onclick="call_skip('{% url 'yaksh:generate_qrcode' paper.id question.id module.id %}')">Generate QR Code</a>
+ <br>
+ <a class="active btn btn-outline-primary " href="{% url 'yaksh:generate_qrcode' paper.id question.id module.id %}" data-toggle="tooltip"
+ title="Upload from any device using the QR Code">Generate QR Code</a>
{% endif %}
<p></p>
{% 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 %}
<html>
<title> Upload File </title>
-
-<script>
-function validate(){
- uploaded_file = document.getElementById("assignment").value;
- if(uploaded_file == ""){
- $("#upload_alert").modal("show");
- return false;
- }
- return true;
-}
-</script>
+<script language="JavaScript" type="text/javascript" src="{% static 'yaksh/js/jquery-3.3.1.min.js' %}"></script>
+<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.8.1/dropzone.min.css">
+<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.8.1/basic.min.css">
+<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.8.1/min/dropzone.min.js"></script>
<style>
div, input, button {
font-size: x-large;
@@ -24,9 +18,61 @@ div, input, button {
<form id="code" action="{% url 'yaksh:upload_file' key %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<h3>Upload assignment file for {{ question.summary }}</h3>
- <input type=file id="assignment" name="assignment" multiple="">
- <button class="btn btn-success" type="submit" name="check" id="check" onClick="return validate();">Upload</button>
+ <div class="dropzone needsclick dz-clickable" id="dropzone_file">
+ <div class="dz-message needsclick">
+ <button type="button" class="dz-button">
+ Drop files here or click to upload.
+ </button>
+ </div>
+ </div>
+ <br>
+ <button class="btn btn-success" type="submit" name="check" id="check">Upload</button>
</form>
{% endif %}
</div>
</html>
+<script>
+ Dropzone.autoDiscover = false;
+ var submitfiles;
+ $(document).ready(function(){
+ var filezone = $("div#dropzone_file").dropzone({
+ url: $("#code").attr("action"),
+ parallelUploads: 10,
+ uploadMultiple: true,
+ maxFiles:20,
+ paramName: "assignment",
+ autoProcessQueue: false,
+ init: function() {
+ var submitButton = document.querySelector("#check");
+ myDropzone = this;
+ submitButton.addEventListener("click", function(e) {
+ if (myDropzone.getQueuedFiles().length === 0) {
+ alert("Please select a file and upload");
+ e.preventDefault();
+ return;
+ }
+ if (myDropzone.getAcceptedFiles().length > 0) {
+ if (submitfiles === true) {
+ submitfiles = false;
+ return;
+ }
+ e.preventDefault();
+ myDropzone.processQueue();
+ myDropzone.on("complete", function () {
+ submitfiles = true;
+ $('#check').trigger('click');
+ });
+ }
+ });
+ },
+ success: function (file, response) {
+ document.open();
+ document.write(response);
+ document.close();
+ },
+ headers: {
+ "X-CSRFToken": document.getElementById("code").elements[0].value
+ }
+ });
+ });
+</script>
diff --git a/yaksh/views.py b/yaksh/views.py
index f8af247..a93f6e0 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -4158,11 +4158,13 @@ def generate_qrcode(request, answerpaper_id, question_id, module_id):
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)
+ content = request.build_absolute_uri(
+ reverse("yaksh:upload_file", args=[qrcode.short_key])
+ )
qrcode.generate_image(content)
qrcode.save()
return show_question(request, question, answerpaper,
- course_id=answerpaper.course.id, module_id=module_id,
+ course_id=answerpaper.course_id, module_id=module_id,
previous_question=question)
@@ -4175,36 +4177,36 @@ def upload_file(request, key):
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:
+ assign_files = []
+ assignments = request.FILES
+ for i in range(len(assignments)):
+ assign_files.append(assignments[f"assignment[{i}]"])
+ if not assign_files:
msg = 'Please upload assignment file'
context['msg'] = msg
return render(request, 'yaksh/upload_file.html', context)
- for fname in assignment_filename:
+ AssignmentUpload.objects.filter(
+ assignmentQuestion_id=handler.question_id,
+ answer_paper_id=handler.answerpaper_id
+ ).delete()
+ uploaded_files = []
+ for fname in assign_files:
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)
+ uploaded_files.append(
+ AssignmentUpload(
+ assignmentQuestion_id=handler.question_id,
+ assignmentFile=fname,
+ answer_paper_id=handler.answerpaper_id)
+ )
+ AssignmentUpload.objects.bulk_create(uploaded_files)
+ 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)