Completed
Push — master ( 8c007a...f10735 )
by Vijay
01:15
created

workshop_details()   C

Complexity

Conditions 8

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 8
dl 0
loc 16
rs 6.6666
c 3
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.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
    user = request.user
74
    if (
75
        [u for u in workshop_obj.presenter.all() if user == u] or
76
            [u for u in workshop_obj.requester.user.all() if user == u] or
77
            user.is_superuser):
78
        show_contact_flag = True
79
80
    context_dict = {
81
        'workshop': workshop_obj,
82
        'show_contact_flag': show_contact_flag
83
    }
84
    return render(request, template_name, context_dict)
85
86
87
@login_required
88
@verify_user_profile
89
def workshop_create(request):
90
    template_name = 'workshops/workshop_create.html'
91
    context_dict = {}
92
    if not Organisation.list_user_organisations(request.user).exists():
93
        msg = """
94
                To request workshop you need to create organisaiton.\n\n
95
                Please use organisation tab above to create your organisation
96
            """
97
        return render(request, 'error.html', {'message': msg})
98
    if request.method == 'GET':
99
        form = WorkshopForm(user=request.user)
100
        context_dict['form'] = form
101
        return render(request, template_name, context_dict)
102
    form = WorkshopForm(user=request.user, data=request.POST)
103
    if not form.is_valid():
104
        context_dict['form'] = form
105
        context_dict['errors'] = form.errors
106
        return render(request, template_name, context_dict)
107
    workshop = form.save()
108
    context = {
109
        'workshop': workshop,
110
        'date': workshop.expected_date,
111
        'workshop_url': 'https://pythonexpress.in/workshop/{}/'.format(
112
            workshop.id)
113
    }
114
    # Collage POC and admin email
115
    poc_admin_user = Profile.get_user_with_type(
116
        user_type=['Collage POC', 'admin']
117
    ).values_list('email', flat=True)
118
119
    org_user_emails = workshop.requester.user.filter(
120
        is_active=True).values_list('email', flat=True)
121
    # all presenter if any
122
    all_presenter_email = workshop.presenter.values_list(
123
        'email', flat=True)
124
    # List of tutor who have shown interest in that location
125
    region_interested_member = Profile.objects.filter(
126
        interested_locations=workshop.requester.location,
127
        usertype__slug='tutor'
128
    ).values_list('user__email', flat=True)
129
    all_email = []
130
    all_email.extend(org_user_emails)
131
    all_email.extend(all_presenter_email)
132
    all_email.extend(poc_admin_user)
133
    all_email.extend(region_interested_member)
134
    all_email = set(all_email)
135
    send_tweet(context)
136
137
    subject = '[PythonExpress] Workshop request status.'
138
    email_body = loader.get_template(
139
        'email_messages/workshop/create_workshop/message.html').render(context)
140
    text_body = loader.get_template(
141
        'email_messages/workshop/create_workshop/message.txt').render(context)
142
    send_email_to_list(
143
        subject,
144
        body=email_body,
145
        users_list=all_email,
146
        text_body=text_body)
147
    success_url = reverse_lazy('workshops:workshop_list')
148
    return HttpResponseRedirect(success_url)
149
150
151
class WorkshopUpdate(views.LoginRequiredMixin, WorkshopAccessMixin,
152
                     generic.UpdateView):
153
    model = Workshop
154
    form_class = WorkshopEditForm
155
    template_name = 'workshops/workshop_update.html'
156
157
    def get_success_url(self):
158
        # pk = self.kwargs.get(self.pk_url_kwarg, None)
159
        self.success_url = reverse("workshops:workshop_list")
160
        return super(WorkshopUpdate, self).get_success_url()
161
162
    def get_initial(self):
163
        return {
164
            "requester": self.object.requester.name,
165
        }
166
167
    def get_form_kwargs(self):
168
        kwargs = super(WorkshopUpdate, self).get_form_kwargs()
169
        kwargs['request'] = self.request
170
        return kwargs
171
172
173
class WorkshopToggleActive(views.LoginRequiredMixin, views.CsrfExemptMixin,
174
                           views.JSONResponseMixin, WorkshopAccessMixin,
175
                           generic.UpdateView):
176
    model = Workshop
177
    fields = ('is_active', 'id')
178
179
    def post(self, request, *args, **kwargs):
180
        self.object = self.get_object()
181
        response = self.object.toggle_active(request.user, **kwargs)
182
        return self.render_json_response(response)
183
184
185
class WorkshopAction(views.CsrfExemptMixin, views.LoginRequiredMixin,
186
                     views.JSONResponseMixin, WorkshopEmailMixin,
187
                     generic.UpdateView):
188
189
    model = Workshop
190
    email_dir = 'email_messages/workshop/assign_me/'
191
192
    def post(self, request, *args, **kwargs):
193
        self.object = self.get_object()
194
        response = self.object.manage_action(request.user, **kwargs)
195
196
        if response['status'] and response.get('notify') is not None:
197
            self.send_mail(request.user, response['assigned'])
198
            del response['notify']
199
        return self.render_json_response(response)
200
201
    def send_mail(self, user, assigned):
202
        """Send email to presenter and org users."""
203
204
        workshop = self.object
205
        context = {
206
            'presenter': True,
207
            'assigned': assigned,
208
            'date': workshop.expected_date,
209
            'presenter_name': user.username,
210
            'workshop_organization': workshop.requester,
211
            'workshop_url': self.request.build_absolute_uri(reverse(
212
                'workshops:workshop_detail', args=[workshop.pk]
213
            ))
214
        }
215
        # email to presenter and group
216
        self.send_mail_to_presenter(user, context)
217
        context['presenter'] = False
218
        self.send_mail_to_group(context, exclude_emails=[user.email])
219
220
221
class WorkshopFeedbackView(views.LoginRequiredMixin,
222
                           generic.FormView):
223
    form_class = WorkshopFeedbackForm
224
    template_name = "workshops/workshop_feedback.html"
225
    success_url = reverse_lazy('workshops:workshop_list')
226
227
    def form_valid(self, form):
228
        workshop_id = self.kwargs.get('pk')
229
        form.save(self.request.user, workshop_id)
230
        return super(WorkshopFeedbackView, self).form_valid(form)
231
232
    def get_context_data(self, *args, **kwargs):
233
        context = super(WorkshopFeedbackView, self).get_context_data(
234
            *args, **kwargs)
235
        context['workshop'] = Workshop.objects.get(pk=self.kwargs.get('pk'))
236
        return context
237
238
239
def upcoming_workshops(request):
240
    template_name = 'upcoming.html'
241
    workshop_list = Workshop.objects.filter(is_active=True).filter(
242
        status__in=[WorkshopStatus.REQUESTED,
243
                    WorkshopStatus.ACCEPTED]).order_by('expected_date')
244
    for workshop in workshop_list:
245
        print(workshop.presenter)
246
    context_dict = {}
247
    context_dict['workshop_list'] = workshop_list
248
249
    return render(request, template_name, context_dict)
250