Completed
Push — master ( 442380...a5ee20 )
by Vijay
9s
created

workshop_feedback_view()   A

Complexity

Conditions 3

Size

Total Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 20
rs 9.4285
cc 3
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.contrib.sites.models import Site
5
from django.http import HttpResponseRedirect
6
from django.shortcuts import get_object_or_404
7
from django.shortcuts import redirect, render
8
from django.template import loader
9
from django.views import generic
10
11
from braces import views
12
from wye.base.emailer_html import send_email_to_list
13
from wye.organisations.models import Organisation
14
from wye.profiles.models import Profile
15
# from wye.regions.models import RegionalLead
16
from wye.base.constants import WorkshopStatus
17
18
from wye.social.sites.twitter import send_tweet
19
from wye.base.views import verify_user_profile
20
from .forms import (
21
    WorkshopForm,
22
    WorkshopEditForm,
23
    WorkshopFeedbackForm,
24
    WorkshopListForm)
25
from .mixins import (
26
    WorkshopEmailMixin,
27
    WorkshopAccessMixin
28
)
29
from .models import Workshop, WorkshopFeedBack
30
31
32
@login_required
33
@verify_user_profile
34
def workshop_list(request):
35
    template_name = 'workshops/workshop_list.html'
36
    user_profile, created = Profile.objects.get_or_create(
37
        user__id=request.user.id)
38
    if not user_profile.is_profile_filled:
39
        return redirect('profiles:profile-edit', slug=request.user.username)
40
    context_dict = {}
41
    workshop_list = Workshop.objects.all().order_by('-expected_date')
42
    workshop_list = workshop_list.filter(
43
        requester__location__id__in=[
44
            x.id for x in request.user.profile.interested_locations.all()]
45
    )
46
47
    location_list = request.GET.getlist("location")
48
    if location_list:
49
        workshop_list = workshop_list.filter(
50
            location__id__in=location_list
51
        )
52
53
    presenter_list = request.GET.getlist("presenter")
54
    if presenter_list:
55
        workshop_list = workshop_list.filter(
56
            presenter__id__in=presenter_list
57
        )
58
59
    workshop_level_list = request.GET.getlist("level")
60
    if workshop_level_list:
61
        workshop_list = workshop_list.filter(
62
            workshop_level__in=workshop_level_list
63
        )
64
65
    workshop_section_list = request.GET.getlist("section")
66
    if workshop_section_list:
67
        workshop_list = workshop_list.filter(
68
            workshop_section__id__in=workshop_section_list
69
        )
70
71
    status_list = request.GET.getlist("status")
72
    if status_list:
73
        workshop_list = workshop_list.filter(
74
            status__in=status_list
75
        )
76
77
    context_dict['workshop_list'] = workshop_list
78
    context_dict['user'] = request.user
79
    # need to improve the part
80
    context_dict['is_not_tutor'] = False
81
    # as user can be tutor and regional lead hence we need to verify like
82
    # this
83
    if (Profile.is_regional_lead(request.user) or
84
            Profile.is_organiser(request.user) or
85
            Profile.is_admin(request.user)):
86
        context_dict['is_not_tutor'] = True
87
    context_dict['form'] = WorkshopListForm(user=request.user)
88
89
    return render(request, template_name, context_dict)
90
91
92
def workshop_details(request, pk):
93
    template_name = 'workshops/workshop_detail.html'
94
    workshop_obj = get_object_or_404(Workshop, id=pk)
95
    show_contact_flag = False
96
    display_edit_button = False
97
    user = request.user
98
    user_is_presenter = [u for u in workshop_obj.presenter.all() if user == u]
99
    user_is_requester = [
100
        u for u in workshop_obj.requester.user.all() if user == u]
101
    if (user_is_presenter or user_is_requester or
102
            user.is_superuser or (
103
                (not user.is_anonymous()) and Profile.is_coordinator(user))):
104
        show_contact_flag = True
105
    if (user_is_presenter):
106
        display_edit_button = True
107
108
    context_dict = {
109
        'workshop': workshop_obj,
110
        'show_contact_flag': show_contact_flag,
111
        'display_edit_button': display_edit_button
112
    }
113
    return render(request, template_name, context_dict)
114
115
116
@login_required
117
@verify_user_profile
118
def workshop_create(request):
119
    template_name = 'workshops/workshop_create.html'
120
    context_dict = {}
121
    if not Organisation.list_user_organisations(request.user).exists():
122
        msg = """
123
                To request workshop you need to create organisaiton.\n\n
124
                Please use organisation tab above to create your organisation
125
            """
126
        return render(request, 'error.html', {'message': msg})
127
    if request.method == 'GET':
128
        form = WorkshopForm(user=request.user)
129
        context_dict['form'] = form
130
        return render(request, template_name, context_dict)
131
    form = WorkshopForm(user=request.user, data=request.POST)
132
    if not form.is_valid():
133
        context_dict['form'] = form
134
        context_dict['errors'] = form.errors
135
        return render(request, template_name, context_dict)
136
    workshop = form.save()
137
    domain = Site.objects.get_current().domain
138
    context = {
139
        'workshop': workshop,
140
        'date': workshop.expected_date,
141
        'workshop_url': domain + '/workshop/{}/'.format(workshop.id)
142
    }
143
    # Collage POC and admin email
144
    poc_admin_user = Profile.get_user_with_type(
145
        user_type=['Collage POC', 'admin']
146
    ).values_list('email', flat=True)
147
148
    org_user_emails = workshop.requester.user.filter(
149
        is_active=True).values_list('email', flat=True)
150
    # all presenter if any
151
    all_presenter_email = workshop.presenter.values_list(
152
        'email', flat=True)
153
    # List of tutor who have shown interest in that location
154
    region_interested_member = Profile.objects.filter(
155
        interested_locations=workshop.requester.location,
156
        usertype__slug='tutor'
157
    ).values_list('user__email', flat=True)
158
    all_email = []
159
    all_email.extend(org_user_emails)
160
    all_email.extend(all_presenter_email)
161
    all_email.extend(poc_admin_user)
162
    all_email.extend(region_interested_member)
163
    all_email = set(all_email)
164
    send_tweet(context)
165
166
    subject = '[PythonExpress] Workshop request status.'
167
    email_body = loader.get_template(
168
        'email_messages/workshop/create_workshop/message.html').render(context)
169
    text_body = loader.get_template(
170
        'email_messages/workshop/create_workshop/message.txt').render(context)
171
    send_email_to_list(
172
        subject,
173
        body=email_body,
174
        users_list=all_email,
175
        text_body=text_body)
176
    success_url = reverse_lazy('workshops:workshop_list')
177
    return HttpResponseRedirect(success_url)
178
179
180
class WorkshopUpdate(views.LoginRequiredMixin, WorkshopAccessMixin,
181
                     generic.UpdateView):
182
    model = Workshop
183
    form_class = WorkshopEditForm
184
    template_name = 'workshops/workshop_update.html'
185
186
    def get_success_url(self):
187
        # pk = self.kwargs.get(self.pk_url_kwarg, None)
188
        self.success_url = reverse("workshops:workshop_list")
189
        return super(WorkshopUpdate, self).get_success_url()
190
191
    def get_initial(self):
192
        return {
193
            "requester": self.object.requester.name,
194
        }
195
196
    def get_form_kwargs(self):
197
        kwargs = super(WorkshopUpdate, self).get_form_kwargs()
198
        kwargs['request'] = self.request
199
        return kwargs
200
201
202
class WorkshopToggleActive(views.LoginRequiredMixin, views.CsrfExemptMixin,
203
                           views.JSONResponseMixin, WorkshopAccessMixin,
204
                           generic.UpdateView):
205
    model = Workshop
206
    fields = ('is_active', 'id')
207
208
    def post(self, request, *args, **kwargs):
209
        self.object = self.get_object()
210
        response = self.object.toggle_active(request.user, **kwargs)
211
        return self.render_json_response(response)
212
213
214
class WorkshopAction(views.CsrfExemptMixin, views.LoginRequiredMixin,
215
                     views.JSONResponseMixin, WorkshopEmailMixin,
216
                     generic.UpdateView):
217
218
    model = Workshop
219
    email_dir = 'email_messages/workshop/assign_me/'
220
221
    def post(self, request, *args, **kwargs):
222
        self.object = self.get_object()
223
        response = self.object.manage_action(request.user, **kwargs)
224
225
        if response['status'] and response.get('notify') is not None:
226
            self.send_mail(request.user, response['assigned'])
227
            del response['notify']
228
        return self.render_json_response(response)
229
230
    def send_mail(self, user, assigned):
231
        """Send email to presenter and org users."""
232
233
        workshop = self.object
234
        context = {
235
            'presenter': True,
236
            'assigned': assigned,
237
            'date': workshop.expected_date,
238
            'presenter_name': user.username,
239
            'workshop_organization': workshop.requester,
240
            'workshop_url': self.request.build_absolute_uri(reverse(
241
                'workshops:workshop_detail', args=[workshop.pk]
242
            ))
243
        }
244
        # email to presenter and group
245
        self.send_mail_to_presenter(user, context)
246
        context['presenter'] = False
247
        self.send_mail_to_group(context, exclude_emails=[user.email])
248
249
250
# class WorkshopFeedbackView(views.LoginRequiredMixin,
251
#                            generic.FormView):
252
#     form_class = WorkshopFeedbackForm
253
#     template_name = "workshops/workshop_feedback.html"
254
#     success_url = reverse_lazy('workshops:workshop_list')
255
256
#     def form_valid(self, form):
257
#         workshop_id = self.kwargs.get('pk')
258
#         form.save(self.request.user, workshop_id)
259
#         return super(WorkshopFeedbackView, self).form_valid(form)
260
261
#     def get_context_data(self, *args, **kwargs):
262
#         context = super(WorkshopFeedbackView, self).get_context_data(
263
#             *args, **kwargs)
264
#         context['workshop'] = Workshop.objects.get(pk=self.kwargs.get('pk'))
265
#         return context
266
267
268
@login_required
269
def workshop_feedback_view(request, pk):
270
    context_dict = {}
271
    template_name = "workshops/workshop_feedback.html"
272
    context_dict['workshop'] = Workshop.objects.get(pk=pk)
273
    if request.method == 'POST':
274
        form = WorkshopFeedbackForm(
275
            data=request.POST, user=request.user, id=pk)
276
        if form.is_valid():
277
            WorkshopFeedBack.save_feedback(
278
                request.user, pk, **request.POST)
279
            # w = Workshop.objects.get(pk=pk)
280
            success_url = reverse_lazy('workshops:workshop_list')
281
            return HttpResponseRedirect(success_url)
282
        print(form.errors)
283
    else:
284
        context_dict['form'] = WorkshopFeedbackForm(
285
            user=request.user, id=pk)
286
    context_dict['user'] = request.user
287
    return render(request, template_name, context_dict)
288
289
290
def upcoming_workshops(request):
291
    template_name = 'upcoming.html'
292
    workshop_list = Workshop.objects.filter(is_active=True).filter(
293
        status__in=[WorkshopStatus.REQUESTED,
294
                    WorkshopStatus.ACCEPTED]).order_by('expected_date')
295
    context_dict = {}
296
    context_dict['workshop_list'] = workshop_list
297
298
    return render(request, template_name, context_dict)
299