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