70 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.http import HttpResponseRedirect
 | |
| from django.shortcuts import render
 | |
| from .models import Questionnaire, QuestionnaireResponse, QuestionnaireStorage
 | |
| from django.conf import settings
 | |
| from django.contrib import messages
 | |
| 
 | |
| import csv
 | |
| from uuid import uuid4
 | |
| from pathlib import Path
 | |
| 
 | |
| from storage.storage import Storage
 | |
| # Create your views here.
 | |
| 
 | |
| 
 | |
| def index(request):
 | |
|     # latest_question_list = Question.objects.order_by('-pub_date')[:5]
 | |
|     questionnaires = Questionnaire.objects.order_by('name')
 | |
|     context = {'questionnaires': questionnaires}
 | |
|     return render(request, 'vragenlijst/index.html', context)
 | |
| 
 | |
| 
 | |
| def questionnaire(request, questionnaire_id):
 | |
|     if request.method == 'POST':
 | |
| 
 | |
|         # As we should have a Django form, we could use te form validator. For now, everyhing is valid ;)
 | |
|         questionnaire = Questionnaire.objects.get(pk=questionnaire_id)
 | |
| 
 | |
|         # Get all the questions in one list with a single query
 | |
|         allQuestions = {}
 | |
|         for question in list(questionnaire.allQuestions.order_by('order').values('id','name')):
 | |
|             allQuestions[str(question['id'])] = question['name']
 | |
| 
 | |
|         # Store the response as a ';' seperated CSV file in order of the questionaire questions order
 | |
|         try:
 | |
|             csv_file = Path(f'{settings.HANZE_TEMP_CSV_STORAGE}/{questionnaire.name}-{uuid4()}.csv')
 | |
|             with open(csv_file, 'w') as csvfile:
 | |
|                 filewriter = csv.writer(csvfile, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
 | |
|                 # Add headers
 | |
|                 filewriter.writerow(['vraag', 'antwoord'])
 | |
| 
 | |
|                 for question in allQuestions:
 | |
|                     if request.POST.get(question):
 | |
|                         filewriter.writerow([allQuestions[question], request.POST[question]])
 | |
| 
 | |
|             # Store the data also in a database
 | |
|             QuestionnaireResponse(questionnaire=questionnaire, response=csv_file.read_text()).save()
 | |
|             storageSettings = QuestionnaireStorage.objects.first()
 | |
|             # Move data to external storage
 | |
|             webdav = Storage(
 | |
|                         storage_type=storageSettings.type,
 | |
|                         url=storageSettings.server,
 | |
|                         username=storageSettings.username,
 | |
|                         password=storageSettings.password
 | |
|                     )
 | |
| 
 | |
|             webdav.upload_file(source=csv_file, destination=f'{storageSettings.path}/{csv_file.name}')
 | |
| 
 | |
|             messages.success(request, 'Questionaire is saved to disk.')
 | |
| 
 | |
|         except Exception as ex:
 | |
|             messages.error(request, f'Could not save the questionaire. Error: {ex}')
 | |
| 
 | |
| 
 | |
|         # Redirect to starting point
 | |
|         return HttpResponseRedirect('/vragenlijst/')
 | |
| 
 | |
|     questionnaire = Questionnaire.objects.get(pk=questionnaire_id)
 | |
|     context = {'questionnaire': questionnaire, 'menu_width': 100 / questionnaire.topics.count()}
 | |
|     return render(request, 'vragenlijst/form.html', context)
 |