Completed
Push — master ( ac4cc2...edf0e4 )
by Vijay
01:10
created

WorkshopFeedbackForm.__init__()   A

Complexity

Conditions 2

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 2
dl 0
loc 14
rs 9.4285
1
import datetime
2
3
from django import forms
4
from django.conf import settings
5
from django.utils.text import slugify
6
from django.contrib.auth.models import User
7
from django.core.exceptions import ValidationError
8
9
from wye.base.constants import WorkshopRatings
10
from wye.base.widgets import CalendarWidget
11
from wye.organisations.models import Organisation
12
from wye.profiles.models import Profile
13
from wye.regions.models import RegionalLead
14
15
from .models import Workshop, WorkshopRatingValues, WorkshopFeedBack
16
17
18
class WorkshopForm(forms.ModelForm):
19
20
    def __init__(self, *args, **kwargs):
21
        user = kwargs.pop('user')
22
        super(WorkshopForm, self).__init__(*args, **kwargs)
23
        self.fields['expected_date'] = forms.DateField(
24
            widget=CalendarWidget,
25
            input_formats=settings.ALLOWED_DATE_FORMAT)
26
        self.fields['requester'].queryset = self.get_organisations(user)
27
        self.fields['location'].required = False
28
        self.fields['location'].widget = forms.HiddenInput()
29
30
    def clean_location(self):
31
        if "requester" not in self.cleaned_data:
32
            return ""
33
34
        organisation = self.cleaned_data['requester']
35
        return organisation.location
36
37
    def get_organisations(self, user):
38
        if Profile.is_admin(user):
39
            return Organisation.objects.all()
40
        elif Profile.is_regional_lead(user):
41
            return Organisation.objects.filter(location=user.profile.location)
42
        else:
43
            return Organisation.list_user_organisations(user)
44
45
    def clean_expected_date(self):
46
        date = self.cleaned_data['expected_date']
47
        if not (date > datetime.date.today() + datetime.timedelta(days=14)):
48
            raise ValidationError('Workshop request has to future date and atleast 2 weeks ahead of today')
49
        else:
50
            return date
51
52
    class Meta:
53
        model = Workshop
54
        exclude = (
55
            'presenter', 'created_at', 'modified_at',
56
            'is_active', 'status',)
57
58
59
class WorkshopEditForm(forms.ModelForm):
60
    requester = forms.CharField()
61
62
    def __init__(self, request, *args, **kwargs):
63
        super(WorkshopEditForm, self).__init__(*args, **kwargs)
64
        self.fields['expected_date'] = forms.DateField(
65
            widget=CalendarWidget,
66
            input_formats=settings.ALLOWED_DATE_FORMAT)
67
        self.fields['requester'].widget = forms.TextInput()
68
        self.fields['requester'].widget.attrs['readonly'] = True
69
        if RegionalLead.is_regional_lead(
70
                request.user, self.instance.location):
71
            self.fields['presenter'].queryset = User.objects.filter(
72
                profile__usertype__slug="tutor"
73
            )
74
        else:
75
            del self.fields['presenter']
76
77
    def clean_requester(self):
78
        return self.instance.requester
79
80
    class Meta:
81
        model = Workshop
82
        exclude = (
83
            'created_at', 'modified_at', 'is_active',
84
            'status', 'location')
85
86
87
class WorkshopFeedbackForm(forms.Form):
88
    """
89
    Dynamically generates feedback form depending on questions available
90
    in model assigend to question_model.
91
    """
92
93
    question_model = WorkshopRatingValues
94
95
    def __init__(self, *args, **kwargs):
96
        super(WorkshopFeedbackForm, self).__init__(*args, **kwargs)
97
        questions = self.question_model.get_questions()
98
99
        for question in questions:
100
            key = "{}-{}".format(
101
                slugify(question["name"]), question["pk"]
102
            )
103
            self.fields[key] = forms.ChoiceField(
104
                choices=WorkshopRatings.CHOICES, required=True,
105
                widget=forms.RadioSelect())
106
            self.fields[key].label = question["name"]
107
108
        self.fields["comment"] = forms.CharField(widget=forms.Textarea)
109
110
    def save(self, user, workshop_id):
111
        data = {k.split("-")[-1]: v for k, v in self.cleaned_data.items()}
112
        WorkshopFeedBack.save_feedback(user, workshop_id, **data)
113