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