root/questionnaire/views.py

Revision 1, 8.1 KB (checked in by alex, 4 years ago)
  • initial djangoquest import
Line 
1# Django imports
2from django.http import HttpResponseRedirect, HttpResponse
3from django.shortcuts import render_to_response, get_object_or_404
4from django.contrib.auth.decorators import login_required
5
6# Local imports
7from djangoquest import settings
8from models import RegUser, Question, Category, Answer, Choice
9from nicepass import nicepass
10
11def check_login(request):
12    if request.session.get('logged_in'):
13        return request.session['logged_in']
14    return False
15
16def logout(request):
17    if request.session != False:
18        request.session['logged_in'] = False
19    return render_to_response(settings.QUESTIONNAIRE_TEMPLATES + 'login.html', {'error': u"You are logged out."})
20
21@login_required
22def send_invitations(request):
23    """
24    If POSTed, send the users specified by their ids an invitation e-mail.
25    If one of these users doesn't have a password, generate one.
26
27    If this isn't a POST request, return the list of users with selection
28    options for choosing which users to send an invitation.
29    """
30    success = []
31    failure = []
32    sent = False
33    if len(request.POST) > 0:
34        from email import send_welcome
35        for item in request.POST.items():
36            users = RegUser.objects.filter(id = int(item[0]))
37            if len(users) > 0:
38                user = users[0]
39                if user.password == "":
40                    user.password = nicepass()
41                    user.save()
42                if send_welcome(user):
43                    success += [user]
44                else:
45                    failure += [user]
46            sent = True
47       
48    return render_to_response(settings.QUESTIONNAIRE_TEMPLATES + 'email.html', {'users': RegUser.objects.all(), 'success': success, 'failure': failure, 'sent': sent })
49       
50def login(request):
51    if request.session.get('logged_in') and request.session['logged_in'] == True:
52        return True
53    try:
54        if request.POST['email'] != '' and request.POST['password'] != '':
55            possible_users = RegUser.objects.filter(email = request.POST['email'], password = request.POST['password'])
56            if possible_users.count() == 0:
57                request.session['logged_in'] = False
58                return False
59            else:
60                request.session['logged_in'] = True
61                request.session['email'] = possible_users[0].email
62                return True
63    except KeyError:
64        request.session['logged_in'] = False
65    return True
66
67def delete_answer(question, user):
68    answer = Answer.objects.filter(question = question, user = user)
69    if len(answer) > 0:
70        for a in answer:
71            a.delete()
72
73def get_question(id):
74    question = Question.objects.filter(id = id)
75    if len(question) > 0:
76        return question[0]
77    return False
78
79def add_answer(question, user, value):
80    if value == '':
81        return False
82    answer = Answer()
83    answer.question = question
84    answer.user = user
85    answer.answer = value
86    answer.save()
87    return True
88
89def get_user(request):
90    user = RegUser.objects.filter(email = request.session['email'])
91    if len(user) > 0:
92        return user[0]
93    return False
94
95def questionnaire(request):
96    """
97    If this is a POST request, parse the submitted data in order to
98    store all submitted answers. Then return the next category of questions,
99    or return a completed response.
100
101    If this isn't a POST request, redirect to the main/login page
102    """
103    user = get_user(request)
104    if len(request.POST) > 0 and user:
105        multiple_answers = []
106        items = request.POST.items()
107
108        for item in items:
109            key = item[0]
110            value = item[1]
111            if key.startswith("question_"):
112                answer = key.split("_")
113                question = get_question(int(answer[-1]))
114                if len(answer) <= 1:
115                    continue
116                if len(answer) == 2 and question: # A single-choice or open answer
117                    delete_answer(question, user)
118                    add_answer(question, user, value)
119                if len(answer) == 4 and question: # A multiple-selection answer
120                    multiple_answers += [ [question, value] ]
121                   
122        for answer in multiple_answers:
123            delete_answer(answer[0], user)
124           
125        for answer in multiple_answers:
126            add_answer(answer[0], user, answer[1])
127           
128        return get_complete_or_continue_response(user)
129    return HttpResponseRedirect('/')
130
131def category_complete(user, category):
132    """
133    Return if a certain user has completed all questions for this category
134    """
135    questions = Question.objects.filter(category = category)
136    for question in questions:
137        answers = Answer.objects.filter(question = question, user = user)
138        if len(answers) == 0:
139            return False
140    return True
141
142def get_complete_or_continue_response(user):
143    """
144    Determine if the user has completed all questions
145      (in that case return the completed page),
146    or if not all questions are completed which category has to be shown
147    """
148    categories = Category.objects.all()
149    for category in categories:
150       if not category_complete(user, category):
151           last = False
152           if category == Category.objects.all().order_by('-id')[0]:
153               last = True
154           return render_to_response(settings.QUESTIONNAIRE_TEMPLATES + 'questionnaire.html', {'user': user, 'categories': [category], 'last': last})
155
156    return render_to_response(settings.QUESTIONNAIRE_TEMPLATES + 'completed.html', {'user': user})
157   
158def do_login(request):
159    if len(request.POST) > 0:
160        if login(request) == False and request.POST.get('email'):
161            error = ""
162            if len(RegUser.objects.filter(email = request.POST['email'])) == 0:
163                error = u"Your emailaddress is not known. Please make sure you entered your emailaddress correctly. Note: both your emailaddress and your password are case-sensitive. Use the address as stated in your invitiation."
164            else: # emailadres is know, password is incorrect
165                error = u"Your password is incorrect. Please make sure you entered your password correctly. Note: both your emailaddress and your password are case-sensitive. Use the password as stated in your invitation."
166            return render_to_response(settings.QUESTIONNAIRE_TEMPLATES + 'login.html', {'error': error})
167        return True
168    return False
169
170@login_required
171def export_csv(request):
172    """
173    Return a .csv-file containing all the answers submitted by the
174    users.
175    """
176    import csv
177    response = HttpResponse(mimetype='text/csv')
178    response['Content-Disposition'] = 'attachment; filename=results_questionnaire.csv'
179
180    writer = csv.writer(response, dialect=csv.excel, delimiter=';')
181
182    question_names = []
183    questions = Question.objects.all().order_by('category', 'nr')
184    for question in questions:
185        question_names += [ u'%s' % (question.text) ]
186    writer.writerow(["User"] + question_names)
187    writer.writerow([])
188
189    users = RegUser.objects.all()
190    for user in users:
191        answer_list = [user.email]
192        for question in questions:
193            answers = Answer.objects.filter(question = question, user = user)
194            if len(answers) > 0:
195                answer_str = ""
196                for answer in answers:
197                    answer_str += answer.answer + " "
198                answer_list += [answer_str]               
199        writer.writerow(answer_list)
200
201    writer.writerow([])
202    writer.writerow(["Legend:"])
203    choices = Choice.objects.all()
204    for choice in choices:
205        if choice.question:
206            writer.writerow([u'%s: %s = %d' % (str(question), choice.name, choice.nr)])
207    return response
208
209def index(request):
210    response = do_login(request)
211    if response == True and check_login(request):
212        user = get_user(request)
213        complete = user.check_complete()
214        if complete:
215            return render_to_response(settings.QUESTIONNAIRE_TEMPLATES + 'completed.html', {'user': user })
216
217        return get_complete_or_continue_response(user)
218    elif response == False:
219        return render_to_response(settings.QUESTIONNAIRE_TEMPLATES + 'login.html')
220    else:
221        return response
222
Note: See TracBrowser for help on using the browser.