Completed
Push — master ( 3f47a5...2b3bff )
by Vijay
01:29
created

WorkshopRestrictMixin.dispatch()   D

Complexity

Conditions 8

Size

Total Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
c 1
b 0
f 0
dl 0
loc 25
rs 4
1
from django.contrib import messages
2
from django.core.exceptions import PermissionDenied
3
from django.core.urlresolvers import reverse
4
from django.http import Http404
5
from django.http import HttpResponseForbidden
6
from django.http import HttpResponseRedirect, JsonResponse
7
from django.shortcuts import redirect, render
8
9
from wye.base.constants import WorkshopStatus, FeedbackType
10
from wye.base.emailer import send_mail
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, WorkshopFeedBack
16
17
18
class WorkshopAccessMixin(object):
19
20
    def dispatch(self, request, *args, **kwargs):
21
        user = request.user
22
        pk = self.kwargs.get(self.pk_url_kwarg, None)
23
        workshop = Workshop.objects.get(id=pk)
24
        is_admin = Profile.is_admin(user)
25
        is_lead = (Profile.is_regional_lead(user) and
26
                   RegionalLead.is_regional_lead(user, workshop.location))
27
        is_organiser = (Profile.is_organiser(user) and
28
                        user in workshop.requester.user.all())
29
30
        if not (is_admin or is_lead or is_organiser):
31
            return HttpResponseForbidden("Not sufficent permission")
32
        return super(WorkshopAccessMixin, self).dispatch(request, *args, **kwargs)
33
34
35
class WorkshopFeedBackMixin(object):
36
    """
37
    Restrict access to feedback url if
38
    - Workshop is not completed
39
    - If the user accessing the url is not presenter or
40
      organiser
41
    """
42
43
    def dispatch(self, request, *args, **kwargs):
44
        pk = self.kwargs.get('pk')
45
        workshop = Workshop.objects.get(id=pk)
46
        user = self.request.user
47
48
        if workshop.status != WorkshopStatus.COMPLETED:
49
            raise Http404
50
        if not (workshop.is_presenter(user) or workshop.is_organiser(user)):
51
            raise PermissionDenied
52
        return super(WorkshopFeedBackMixin, self).dispatch(request, *args, **kwargs)
53
54
55
class WorkshopRestrictMixin(object):
56
    """
57
    Mixin to restrict
58
        - For organisation to add workshop if no feedback is shared.
59
        - For presenter to takeup workshop if no feedback is shared
60
    """
61
62
    allow_presenter = False
63
64
    def dispatch(self, request, *args, **kwargs):
65
        self.user = request.user
66
        self.feedback_required = []
67
68
        # check if user is tutor
69
        if Profile.is_presenter(self.user) and self.allow_presenter:
70
            self.validate_presenter_feedback()
71
        elif (Profile.is_organiser(self.user) and
72
                Organisation.list_user_organisations(self.user).exists()):
73
            # if user is from organisation
74
            self.validate_organisation_feedback()
75
        elif (Profile.is_regional_lead(self.user) or
76
                Profile.is_admin(self.user)):
77
            pass  # don't restrict lead and admin
78
        else:
79
            msg = """
80
                    To request workshop you need to create organisaiton.\n\n 
81
                    Please use organisation tab above to create your organisation"""
82
83
            # return json for ajax request
84
            return render(request, 'error.html', {'message': msg})
85
86
        if self.feedback_required:
87
            return self.return_response(request)
88
        return super(WorkshopRestrictMixin, self).dispatch(request, *args, **kwargs)
89
90
    def validate_presenter_feedback(self):
91
        workshops = Workshop.objects.filter(
92
            presenter=self.user, status=WorkshopStatus.COMPLETED)
93
94
        for workshop in workshops:
95
            feedback = WorkshopFeedBack.objects.filter(
96
                workshop=workshop, feedback_type=FeedbackType.PRESENTER
97
            ).count()
98
            if feedback == 0:
99
                self.feedback_required.append(workshop)
100
101
    def validate_organisation_feedback(self):
102
        workshops = Workshop.objects.filter(
103
            requester__user=self.user, status=WorkshopStatus.COMPLETED)
104
105
        for workshop in workshops:
106
            feedback = WorkshopFeedBack.objects.filter(
107
                workshop=workshop, feedback_type=FeedbackType.ORGANISATION
108
            ).count()
109
            if feedback == 0:
110
                self.feedback_required.append(workshop)
111
112
    def return_response(self, request):
113
        msg = "Please complete the feeback for %s" % (
114
            ", ".join(map(str, self.feedback_required)))
115
116
        # return json for ajax request
117
        if request.is_ajax():
118
            return JsonResponse({"status": False, "msg": msg})
119
120
        messages.error(request, msg)
121
        return HttpResponseRedirect(reverse('workshops:workshop_list'))
122
123
124
class WorkshopEmailMixin(object):
125
126
    def send_mail_to_presenter(self, user, context):
127
        """
128
        Send email to presenter.
129
        @param user: Is user object
130
        @param context: Is dict of data required by email template.
131
        """
132
133
        # Send email to presenter
134
        return send_mail([user.email], context, self.email_dir)
135
136
    def send_mail_to_group(self, context, exclude_emails=None):
137
        """
138
        Send email to org/group users.
139
        @param context: Is dict of data required by email template.
140
        @exclude_emails: Is list of email to be excluded from
141
        email update.
142
        """
143
144
        if exclude_emails is None:
145
            exclude_emails = []
146
147
        # Collage POC and admin email
148
        poc_admin_user = Profile.get_user_with_type(
149
            user_type=['Collage POC', 'admin']
150
        ).values_list('email', flat=True)
151
        # Org user email
152
        org_user_emails = self.object.requester.user.filter(
153
            is_active=True
154
        ).values_list('email', flat=True)
155
        # all presenter if any
156
        all_presenter_email = self.object.presenter.values_list(
157
            'email', flat=True
158
        )
159
        # List of tutor who have shown interest in that location
160
        region_interested_member = Profile.objects.filter(
161
            interested_locations=self.object.requester.location,
162
            usertype__slug='tutor'
163
        ).values_list('user__email', flat=True)
164
165
        all_email = []
166
        all_email.extend(org_user_emails)
167
        all_email.extend(all_presenter_email)
168
        all_email.extend(poc_admin_user)
169
        all_email.extend(region_interested_member)
170
        all_email = set(all_email)
171
        all_email = list(all_email.difference(exclude_emails))
172
        send_mail(all_email, context, self.email_dir)
173