Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ### views.py ###
- from .forms import SDQForm, LoginForm, ProfileSelectionForm, SlugForm, GeneratedHashForm
- from .models import Question, GradingCategory, SDQProfile, Answer, Choice, GeneratedHash
- from .pdfgen import ProfileRenderer
- from collections import OrderedDict
- from django.contrib import messages
- from django.contrib.auth import authenticate, login, logout
- from django.contrib.auth.mixins import LoginRequiredMixin
- from django.core.exceptions import ValidationError
- from django.core.urlresolvers import reverse, reverse_lazy
- from django.core.validators import URLValidator
- from django.db.models import Q
- from django.http import Http404, HttpResponse
- from django.shortcuts import get_object_or_404, redirect
- from django.utils.translation import ugettext as _
- from django.views.generic import FormView, TemplateView, ListView
- from django.views.generic.base import RedirectView
- from django.conf import settings
- from helpers import generate_random_string
- from formtools.wizard.views import SessionWizardView
- from django.shortcuts import render_to_response
- class LoginView(FormView):
- template_name = "login.html"
- form_class = LoginForm
- success_url = "/"
- def form_valid(self, form):
- user = authenticate(
- username=form.cleaned_data.get("username"),
- password=form.cleaned_data.get("password")
- )
- if user is not None:
- if user.is_active:
- login(self.request, user)
- return redirect(reverse('list-profiles'))
- else:
- return redirect(reverse('login'))
- else:
- return redirect(reverse('login'))
- class ToolsView(LoginRequiredMixin, FormView):
- template_name = "tools.html"
- form_class = GeneratedHashForm
- login_url = '/login/'
- success_url= "/"
- def form_valid(self, form):
- amount = form.cleaned_data['amount']
- for i in range(0, amount):
- model = GeneratedHash()
- generated_hash = generate_random_string(length=5, stringset="abcdefghjklmnpqrstuvwxyz23456789")
- if not GeneratedHash.objects.filter(generated_hash=generated_hash).exists():
- model.generated_hash = generated_hash
- model.save()
- return redirect(reverse('success'))
- class LogoutView(RedirectView):
- url = "/"
- def get(self, request, *args, **kwargs):
- logout(request)
- return super(LogoutView, self).get(request, *args, **kwargs)
- class ProfilesListView(LoginRequiredMixin, FormView, ListView):
- template_name = "list_profiles.html"
- login_url = '/login/'
- redirect_field_name = 'redirect_to'
- context_object_name = "slug"
- form_class = ProfileSelectionForm
- model = SDQProfile
- def get_queryset(self):
- slug = self.kwargs.get("slug")
- if slug:
- return SDQProfile.objects.filter(
- pk__in=map(lambda x: x.profile.pk,
- Answer.objects.filter(
- Q(choice__text=slug) | Q(answer=slug),
- choice__question__form_field_identifier=settings.KUNTA_IDENTIFIER
- )
- )
- )
- else:
- return SDQProfile.objects.all()
- def get_context_data(self, *args, **kwargs):
- context = super(ProfilesListView, self).get_context_data(*args, **kwargs)
- custom_answers = map(
- lambda x: x["answer"],
- Answer.objects.all().filter(
- question__form_field_identifier=settings.KUNTA_IDENTIFIER,
- choice__choice_type=Choice.CUSTOM
- ).values("answer")
- )
- choice_answers = map(
- lambda x: x["text"],
- Choice.objects.filter(
- question__form_field_identifier=settings.KUNTA_IDENTIFIER,
- choice_type=Choice.CHOICE
- ).values("text")
- )
- context["filter_options"] = [(reverse("list-profiles", args=[o]), o) for o in custom_answers+choice_answers]
- return context
- def form_valid(self, form):
- profiles = form.cleaned_data.get("profiles")
- response = HttpResponse(content_type='text/plain')
- response['Content-Disposition'] = 'attachment; filename=profiles.pdf'
- ProfileRenderer(profiles, response).render_pdf()
- return response
- def is_slug_valid(slug):
- illegal_slug_chars = set(["i", "I", "1", "0", "o", "O"])
- return GeneratedHash.objects.filter(generated_hash=slug, used=False).exists() and illegal_slug_chars & set(slug) == set() and len(slug) == 5
- class ProfileFormView(FormView):
- template_name = "profile_form.html"
- form_class = SDQForm
- form_list = form_class
- def done(self, form_list, **kwargs):
- return render_to_response('thank_you.html', {
- 'form_data': [form.cleaned_data for form in form_list]
- })
- def dispatch(self, request, *args, **kwargs):
- slug = self.kwargs.get("slug")
- if is_slug_valid(slug):
- return super(ProfileFormView, self).dispatch(request, *args, **kwargs)
- else:
- return redirect(reverse("index"))
- def get_context_data(self, *args, **kwargs):
- context = super(ProfileFormView, self).get_context_data(*args, **kwargs)
- questions_by_category = {}
- for q in Question.objects.all().order_by("order"):
- questions_by_category[q.category] = questions_by_category.get(q.category, [])+[q]
- context['questions_by_category'] = OrderedDict(sorted(questions_by_category.iteritems(), key=lambda x: x[0].order))
- return context
- def form_valid(self, form):
- profile = SDQProfile()
- profile.save()
- slug = self.kwargs.get("slug")
- f = GeneratedHash.objects.get(generated_hash=slug)
- f.used = True
- f.save()
- for question in Question.objects.all():
- if question.required == False and not form.cleaned_data.get(question.form_field_identifier):
- continue
- if question.question_type == Question.SELECT_MULTIPLE:
- form_answers = form.cleaned_data.get(question.form_field_identifier)
- for form_answer in form_answers:
- answer = Answer()
- answer.profile = profile
- answer.question = question
- choice = question.choices.all().get(id=form_answer)
- answer.choice = choice
- if choice.choice_type == Choice.CUSTOM:
- answer.answer = form.cleaned_data.get(choice.get_custom_identifier())
- else:
- answer.answer = form_answer
- else:
- form_answer = form.cleaned_data.get(question.form_field_identifier)
- answer = Answer()
- answer.profile = profile
- answer.question = question
- if question.question_type in (Question.SELECT_ONE, Question.DROPDOWN):
- choice = question.choices.all().get(id=form_answer)
- answer.choice = choice
- if choice.choice_type == Choice.CUSTOM:
- answer.answer = form.cleaned_data.get(choice.get_custom_identifier())
- else:
- answer.answer = form_answer
- elif question.question_type == Question.SSN:
- start = form.cleaned_data.get(question.form_field_identifier+"_start")
- end = form.cleaned_data.get(question.form_field_identifier+"_end")
- answer.answer = start+"A"+end
- else:
- answer.answer = form_answer
- answer.save()
- return redirect(reverse('success'))
- class IndexView(FormView):
- form_class = SlugForm
- template_name = "index.html"
- def form_valid(self, form):
- slug = form.cleaned_data.get("slug", "")
- if is_slug_valid(slug):
- return redirect(reverse('profile-form', args=(slug,)))
- else:
- messages.error(self.request, _(u"Virheellinen koodi"))
- return redirect(reverse('index'))
- class SuccessView(TemplateView):
- template_name = "thank_you.html"
- ### question_category.html ###
- {% load filters %}
- {% load i18n %}
- <div class="panel panel-primary">
- <div class="panel-heading">{{ category.name }}</div>
- <div class="panel-body">
- <h5>{{ category.subheader }}</h5>
- {% for question in questions %}
- {% include 'partials/question_row.html' with question=question %}
- {% endfor %}
- </div>
- </div>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement