Advertisement
Guest User

Untitled

a guest
May 18th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.44 KB | None | 0 0
  1. ### views.py ###
  2.  
  3. from .forms import SDQForm, LoginForm, ProfileSelectionForm, SlugForm, GeneratedHashForm
  4. from .models import Question, GradingCategory, SDQProfile, Answer, Choice, GeneratedHash
  5. from .pdfgen import ProfileRenderer
  6. from collections import OrderedDict
  7. from django.contrib import messages
  8. from django.contrib.auth import authenticate, login, logout
  9. from django.contrib.auth.mixins import LoginRequiredMixin
  10. from django.core.exceptions import ValidationError
  11. from django.core.urlresolvers import reverse, reverse_lazy
  12. from django.core.validators import URLValidator
  13. from django.db.models import Q
  14. from django.http import Http404, HttpResponse
  15. from django.shortcuts import get_object_or_404, redirect
  16. from django.utils.translation import ugettext as _
  17. from django.views.generic import FormView, TemplateView, ListView
  18. from django.views.generic.base import RedirectView
  19. from django.conf import settings
  20. from helpers import generate_random_string
  21. from formtools.wizard.views import SessionWizardView
  22. from django.shortcuts import render_to_response
  23.  
  24. class LoginView(FormView):
  25.     template_name = "login.html"
  26.     form_class = LoginForm
  27.     success_url = "/"
  28.  
  29.     def form_valid(self, form):
  30.         user = authenticate(
  31.             username=form.cleaned_data.get("username"),
  32.             password=form.cleaned_data.get("password")
  33.         )
  34.  
  35.         if user is not None:
  36.             if user.is_active:
  37.                 login(self.request, user)
  38.                 return redirect(reverse('list-profiles'))
  39.             else:
  40.                 return redirect(reverse('login'))
  41.         else:
  42.             return redirect(reverse('login'))
  43.  
  44.  
  45. class ToolsView(LoginRequiredMixin, FormView):
  46.     template_name = "tools.html"
  47.     form_class = GeneratedHashForm
  48.     login_url = '/login/'
  49.     success_url= "/"
  50.  
  51.  
  52.     def form_valid(self, form):
  53.         amount = form.cleaned_data['amount']
  54.  
  55.         for i in range(0, amount):
  56.             model = GeneratedHash()
  57.             generated_hash = generate_random_string(length=5, stringset="abcdefghjklmnpqrstuvwxyz23456789")
  58.  
  59.             if not GeneratedHash.objects.filter(generated_hash=generated_hash).exists():
  60.                 model.generated_hash = generated_hash
  61.                 model.save()
  62.  
  63.         return redirect(reverse('success'))
  64.  
  65.  
  66. class LogoutView(RedirectView):
  67.     url = "/"
  68.     def get(self, request, *args, **kwargs):
  69.         logout(request)
  70.         return super(LogoutView, self).get(request, *args, **kwargs)
  71.  
  72. class ProfilesListView(LoginRequiredMixin, FormView, ListView):
  73.     template_name = "list_profiles.html"
  74.     login_url = '/login/'
  75.     redirect_field_name = 'redirect_to'
  76.     context_object_name = "slug"
  77.     form_class = ProfileSelectionForm
  78.     model = SDQProfile
  79.  
  80.     def get_queryset(self):
  81.         slug = self.kwargs.get("slug")
  82.         if slug:
  83.             return SDQProfile.objects.filter(
  84.                 pk__in=map(lambda x: x.profile.pk,
  85.                     Answer.objects.filter(
  86.                         Q(choice__text=slug) | Q(answer=slug),
  87.                         choice__question__form_field_identifier=settings.KUNTA_IDENTIFIER
  88.                     )
  89.                 )
  90.             )
  91.         else:
  92.             return SDQProfile.objects.all()
  93.  
  94.     def get_context_data(self, *args, **kwargs):
  95.         context = super(ProfilesListView, self).get_context_data(*args, **kwargs)
  96.  
  97.         custom_answers = map(
  98.             lambda x: x["answer"],
  99.             Answer.objects.all().filter(
  100.                 question__form_field_identifier=settings.KUNTA_IDENTIFIER,
  101.                 choice__choice_type=Choice.CUSTOM
  102.             ).values("answer")
  103.         )
  104.  
  105.         choice_answers = map(
  106.             lambda x: x["text"],
  107.             Choice.objects.filter(
  108.                 question__form_field_identifier=settings.KUNTA_IDENTIFIER,
  109.                 choice_type=Choice.CHOICE
  110.             ).values("text")
  111.         )
  112.  
  113.         context["filter_options"] = [(reverse("list-profiles", args=[o]), o) for o in custom_answers+choice_answers]
  114.  
  115.         return context
  116.  
  117.  
  118.     def form_valid(self, form):
  119.         profiles = form.cleaned_data.get("profiles")
  120.         response = HttpResponse(content_type='text/plain')
  121.         response['Content-Disposition'] = 'attachment; filename=profiles.pdf'
  122.  
  123.         ProfileRenderer(profiles, response).render_pdf()
  124.  
  125.         return response
  126.  
  127. def is_slug_valid(slug):
  128.     illegal_slug_chars = set(["i", "I", "1", "0", "o", "O"])
  129.     return GeneratedHash.objects.filter(generated_hash=slug, used=False).exists() and illegal_slug_chars & set(slug) == set() and len(slug) == 5
  130.  
  131. class ProfileFormView(FormView):
  132.     template_name = "profile_form.html"
  133.     form_class = SDQForm
  134.     form_list = form_class
  135.  
  136.     def done(self, form_list, **kwargs):
  137.         return render_to_response('thank_you.html', {
  138.             'form_data': [form.cleaned_data for form in form_list]
  139.             })
  140.  
  141.     def dispatch(self, request, *args, **kwargs):
  142.         slug = self.kwargs.get("slug")
  143.         if is_slug_valid(slug):
  144.             return super(ProfileFormView, self).dispatch(request, *args, **kwargs)
  145.         else:
  146.             return redirect(reverse("index"))
  147.  
  148.     def get_context_data(self, *args, **kwargs):
  149.         context = super(ProfileFormView, self).get_context_data(*args, **kwargs)
  150.  
  151.         questions_by_category = {}
  152.         for q in Question.objects.all().order_by("order"):
  153.             questions_by_category[q.category] = questions_by_category.get(q.category, [])+[q]
  154.  
  155.         context['questions_by_category'] = OrderedDict(sorted(questions_by_category.iteritems(), key=lambda x: x[0].order))
  156.         return context
  157.  
  158.     def form_valid(self, form):
  159.         profile = SDQProfile()
  160.         profile.save()
  161.         slug = self.kwargs.get("slug")
  162.         f = GeneratedHash.objects.get(generated_hash=slug)
  163.         f.used = True
  164.         f.save()
  165.  
  166.         for question in Question.objects.all():
  167.  
  168.             if question.required == False and not form.cleaned_data.get(question.form_field_identifier):
  169.                 continue
  170.  
  171.             if question.question_type == Question.SELECT_MULTIPLE:
  172.  
  173.                 form_answers = form.cleaned_data.get(question.form_field_identifier)
  174.  
  175.                 for form_answer in form_answers:
  176.                     answer = Answer()
  177.                     answer.profile = profile
  178.                     answer.question = question
  179.  
  180.                     choice = question.choices.all().get(id=form_answer)
  181.                     answer.choice = choice
  182.  
  183.                     if choice.choice_type == Choice.CUSTOM:
  184.                         answer.answer = form.cleaned_data.get(choice.get_custom_identifier())
  185.                     else:
  186.                         answer.answer = form_answer
  187.             else:
  188.  
  189.                 form_answer = form.cleaned_data.get(question.form_field_identifier)
  190.                 answer = Answer()
  191.                 answer.profile = profile
  192.                 answer.question = question
  193.  
  194.                 if question.question_type in (Question.SELECT_ONE, Question.DROPDOWN):
  195.                     choice = question.choices.all().get(id=form_answer)
  196.                     answer.choice = choice
  197.  
  198.                     if choice.choice_type == Choice.CUSTOM:
  199.                         answer.answer = form.cleaned_data.get(choice.get_custom_identifier())
  200.                     else:
  201.                         answer.answer = form_answer
  202.  
  203.                 elif question.question_type == Question.SSN:
  204.                     start = form.cleaned_data.get(question.form_field_identifier+"_start")
  205.                     end = form.cleaned_data.get(question.form_field_identifier+"_end")
  206.                     answer.answer = start+"A"+end
  207.  
  208.                 else:
  209.                     answer.answer = form_answer
  210.  
  211.                 answer.save()
  212.  
  213.  
  214.         return redirect(reverse('success'))
  215.  
  216. class IndexView(FormView):
  217.     form_class = SlugForm
  218.     template_name = "index.html"
  219.  
  220.     def form_valid(self, form):
  221.         slug = form.cleaned_data.get("slug", "")
  222.         if is_slug_valid(slug):
  223.             return redirect(reverse('profile-form', args=(slug,)))
  224.         else:
  225.             messages.error(self.request, _(u"Virheellinen koodi"))
  226.             return redirect(reverse('index'))
  227.  
  228.  
  229. class SuccessView(TemplateView):
  230.     template_name = "thank_you.html"
  231.    
  232.  
  233.    
  234. ### question_category.html ###
  235.  
  236. {% load filters %}
  237. {% load i18n %}
  238.  
  239. <div class="panel panel-primary">
  240.     <div class="panel-heading">{{ category.name }}</div>
  241.     <div class="panel-body">
  242.         <h5>{{ category.subheader }}</h5>
  243.         {% for question in questions %}
  244.             {%  include 'partials/question_row.html' with question=question %}
  245.         {% endfor %}
  246.     </div>
  247. </div>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement