Completed
Push — master ( 2b3bff...10952a )
by Vijay
02:16 queued 01:05
created

WorkshopCreate.get_form_kwargs()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
from django.contrib.auth.decorators import login_required
2
from django.core.urlresolvers import reverse, reverse_lazy
3
from django.db.models import Q
4
from django.http import HttpResponseRedirect
5
from django.shortcuts import get_object_or_404
6
from django.shortcuts import redirect, render
7
from django.template import loader
8
from django.views import generic
9
10
from braces import views
11
from wye.base.emailer_html import send_email_to_list
12
from wye.organisations.models import Organisation
13
from wye.profiles.models import Profile
14
from wye.regions.models import RegionalLead
15
from wye.social.sites.twitter import send_tweet
16
from wye.base.views import verify_user_profile
17
from .forms import WorkshopForm, WorkshopEditForm, WorkshopFeedbackForm
18
from .mixins import (
19
    WorkshopEmailMixin,
20
    WorkshopAccessMixin
21
    )
22
from .models import Workshop
23
24
25
@login_required
26
@verify_user_profile
27
def workshop_list(request):
28
    template_name = 'workshops/workshop_list.html'
29
    user_profile, created = Profile.objects.get_or_create(
30
        user__id=request.user.id)
31
    if not user_profile.is_profile_filled:
32
        return redirect('profiles:profile-edit', slug=request.user.username)
33
    context_dict = {}
34
    workshop_list = Workshop.objects.all().order_by('-expected_date')
35
    if Profile.is_organiser(request.user):
36
        workshop_list = workshop_list.filter(
37
            requester__user=request.user)
38
    elif Profile.is_presenter(request.user):
39
        workshop_list = workshop_list.filter(
40
            Q(presenter=request.user) | Q
41
            (requester__location__id__in=[
42
                x.id for x in
43
                request.user.profile.interested_locations.all()]))
44
    elif Profile.is_regional_lead(request.user):
45
        regions = RegionalLead.objects.filter(leads=request.user)
46
        workshop_list = workshop_list.filter(
47
            location__id__in=[x.location.id for x in regions])
48
49
    context_dict['workshop_list'] = workshop_list
50
    context_dict['user'] = request.user
51
    # need to improve the part
52
    context_dict['is_not_tutor'] = False
53
    # as user can be tutor and regional lead hence we need to verify like
54
    # this
55
    if (Profile.is_regional_lead(request.user) or
56
            Profile.is_organiser(request.user) or
57
            Profile.is_admin(request.user)):
58
        context_dict['is_not_tutor'] = True
59
60
    return render(request, template_name, context_dict)
61
62
63
def workshop_details(request, pk):
64
    template_name = 'workshops/workshop_detail.html'
65
    workshop_obj = get_object_or_404(Workshop, id=pk)
66
    context_dict = {'workshop': workshop_obj}
67
    return render(request, template_name, context_dict)
68
69
70
@login_required
71
@verify_user_profile
72
def workshop_create(request):
73
    template_name = 'workshops/workshop_create.html'
74
    context_dict = {}
75
    if not Organisation.list_user_organisations(request.user).exists():
76
        msg = """
77
                To request workshop you need to create organisaiton.\n\n
78
                Please use organisation tab above to create your organisation
79
            """
80
        return render(request, 'error.html', {'message': msg})
81
    if request.method == 'GET':
82
        form = WorkshopForm(user=request.user)
83
        context_dict['form'] = form
84
        return render(request, template_name, context_dict)
85
    form = WorkshopForm(user=request.user, data=request.POST)
86
    if not form.is_valid():
87
        context_dict['form'] = form
88
        context_dict['errors'] = form.errors
89
        return render(request, template_name, context_dict)
90
    workshop = form.save()
91
    context = {
92
        'workshop': workshop,
93
        'date': workshop.expected_date,
94
        'workshop_url': '/workshop/{}/'.format(workshop.id)
95
    }
96
    # Collage POC and admin email
97
    poc_admin_user = Profile.get_user_with_type(
98
        user_type=['Collage POC', 'admin']
99
        ).values_list('email', flat=True)
100
101
    org_user_emails = workshop.requester.user.filter(
102
        is_active=True).values_list('email', flat=True)
103
    # all presenter if any
104
    all_presenter_email = workshop.presenter.values_list(
105
        'email', flat=True)
106
    # List of tutor who have shown interest in that location
107
    region_interested_member = Profile.objects.filter(
108
        interested_locations=workshop.requester.location,
109
        usertype__slug='tutor'
110
        ).values_list('user__email', flat=True)
111
    all_email = []
112
    all_email.extend(org_user_emails)
113
    all_email.extend(all_presenter_email)
114
    all_email.extend(poc_admin_user)
115
    all_email.extend(region_interested_member)
116
    all_email = set(all_email)
117
    send_tweet(context)
118
119
    subject = '[PythonExpress] Workshop request status.'
120
    email_body = loader.get_template(
121
        'email_messages/workshop/create_workshop/message.html').render(context)
122
    text_body = loader.get_template(
123
        'email_messages/workshop/create_workshop/message.txt').render(context)
124
    send_email_to_list(
125
        subject,
126
        body=email_body,
127
        users_list=all_email,
128
        text_body=text_body)
129
    success_url = reverse_lazy('workshops:workshop_list')
130
    return HttpResponseRedirect(success_url)
131
132
133
class WorkshopUpdate(views.LoginRequiredMixin, WorkshopAccessMixin,
134
                     generic.UpdateView):
135
    model = Workshop
136
    form_class = WorkshopEditForm
137
    template_name = 'workshops/workshop_update.html'
138
139
    def get_success_url(self):
140
        # pk = self.kwargs.get(self.pk_url_kwarg, None)
141
        self.success_url = reverse("workshops:workshop_list")
142
        return super(WorkshopUpdate, self).get_success_url()
143
144
    def get_initial(self):
145
        return {
146
            "requester": self.object.requester.name,
147
        }
148
149
    def get_form_kwargs(self):
150
        kwargs = super(WorkshopUpdate, self).get_form_kwargs()
151
        kwargs['request'] = self.request
152
        return kwargs
153
154
155
class WorkshopToggleActive(views.LoginRequiredMixin, views.CsrfExemptMixin,
156
                           views.JSONResponseMixin, WorkshopAccessMixin,
157
                           generic.UpdateView):
158
    model = Workshop
159
    fields = ('is_active', 'id')
160
161
    def post(self, request, *args, **kwargs):
162
        self.object = self.get_object()
163
        response = self.object.toggle_active(request.user, **kwargs)
164
        return self.render_json_response(response)
165
166
167
class WorkshopAction(views.CsrfExemptMixin, views.LoginRequiredMixin,
168
                     views.JSONResponseMixin, WorkshopEmailMixin,
169
                     generic.UpdateView):
170
171
    model = Workshop
172
    email_dir = 'email_messages/workshop/assign_me/'
173
174
    def post(self, request, *args, **kwargs):
175
        self.object = self.get_object()
176
        response = self.object.manage_action(request.user, **kwargs)
177
178
        if response['status'] and response.get('notify') is not None:
179
            self.send_mail(request.user, response['assigned'])
180
            del response['notify']
181
        return self.render_json_response(response)
182
183
    def send_mail(self, user, assigned):
184
        """Send email to presenter and org users."""
185
186
        workshop = self.object
187
        context = {
188
            'presenter': True,
189
            'assigned': assigned,
190
            'date': workshop.expected_date,
191
            'presenter_name': user.username,
192
            'workshop_organization': workshop.requester,
193
            'workshop_url': self.request.build_absolute_uri(reverse(
194
                'workshops:workshop_detail', args=[workshop.pk]
195
            ))
196
        }
197
        # email to presenter and group
198
        self.send_mail_to_presenter(user, context)
199
        context['presenter'] = False
200
        self.send_mail_to_group(context, exclude_emails=[user.email])
201
202
203
class WorkshopFeedbackView(views.LoginRequiredMixin,
204
                           generic.FormView):
205
    form_class = WorkshopFeedbackForm
206
    template_name = "workshops/workshop_feedback.html"
207
    success_url = reverse_lazy('workshops:workshop_list')
208
209
    def form_valid(self, form):
210
        workshop_id = self.kwargs.get('pk')
211
        form.save(self.request.user, workshop_id)
212
        return super(WorkshopFeedbackView, self).form_valid(form)
213
214
    def get_context_data(self, *args, **kwargs):
215
        context = super(WorkshopFeedbackView, self).get_context_data(
216
            *args, **kwargs)
217
        context['workshop'] = Workshop.objects.get(pk=self.kwargs.get('pk'))
218
        return context
219