Completed
Push — master ( 86e229...33e372 )
by Vijay
9s
created

OrganisationMemberAdd.get_urls()   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
import uuid
2
3
from django.conf import settings
4
from django.conf.urls import patterns, url
5
from django.core.urlresolvers import reverse_lazy
6
from django.contrib.auth.tokens import PasswordResetTokenGenerator
7
from django.http import Http404
8
from django.http.response import HttpResponseRedirect
9
from django.shortcuts import redirect, render
10
from django.template import Context, loader
11
from django.views import generic
12
13
14
from braces import views
15
from wye.base.emailer_html import send_email_to_id, send_email_to_list
16
from wye.profiles.models import Profile
17
from wye.regions.models import RegionalLead
18
from .forms import (
19
    OrganisationForm, OrganisationMemberAddForm,
20
    UserRegistrationForm
21
)
22
from .models import Organisation, User
23
24
25
class OrganisationList(views.LoginRequiredMixin, generic.ListView):
26
    model = Organisation
27
    template_name = 'organisation/list.html'
28
29
    def dispatch(self, request, *args, **kwargs):
30
        user_profile, created = Profile.objects.get_or_create(
31
            user__id=self.request.user.id)
32
        if not user_profile.get_user_type:
33
            return redirect('profiles:profile-edit', slug=request.user.username)
34
        return super(OrganisationList, self).dispatch(request, *args, **kwargs)
35
36
    def get_queryset(self):
37
        return Organisation.objects.filter(active=True)
38
39
    def get_context_data(self, *args, **kwargs):
40
        context = super(OrganisationList, self).get_context_data(
41
            *args, **kwargs)
42
        if Profile.is_organiser(self.request.user):
43
            context['org_created_list'] = self.get_queryset().filter(
44
                created_by=self.request.user)
45
            context['org_belongs_list'] = self.get_queryset().exclude(
46
                created_by=self.request.user).filter(
47
                user=self.request.user)
48
        elif Profile.is_regional_lead(self.request.user):
49
            regions = RegionalLead.objects.filter(leads=self.request.user)
50
            context['regional_org_list'] = self.get_queryset().filter(
51
                location__id__in=[x.location.id for x in regions])
52
        context['user'] = self.request.user
53
        # need to improve the part
54
        context['is_not_tutor'] = False
55
        # as user can be tutor and regional lead hence we need to verify like
56
        # this
57
        if (Profile.is_regional_lead(self.request.user) or
58
                Profile.is_organiser(self.request.user) or
59
                Profile.is_admin(self.request.user)):
60
            context['is_not_tutor'] = True
61
        return context
62
63
64
class OrganisationCreate(views.LoginRequiredMixin, generic.CreateView):
65
    model = Organisation
66
    form_class = OrganisationForm
67
    template_name = 'organisation/create.html'
68
    success_url = reverse_lazy('organisations:organisation_list')
69
70
    def post(self, request, *args, **kwargs):
71
        form = OrganisationForm(data=request.POST)
72
        if form.is_valid():
73
            form.instance.modified_by = request.user
74
            form.instance.created_by = request.user
75
            form.instance.save()
76
            form.instance.user.add(request.user)
77
            form.instance.save()
78
            host = '{}://{}'.format(settings.SITE_PROTOCOL,
79
                                    request.META['HTTP_HOST'])
80
            email_context = Context({
81
                'full_name': '%s %s' % (request.user.first_name,
82
                                        request.user.last_name),
83
                'org_id': form.instance.id,
84
                'host': host
85
86
            })
87
            subject = "%s organisation for region %s is created" % (
88
                form.instance.name, form.instance.location.name)
89
            email_body = loader.get_template(
90
                'email_messages/organisation/new.html').render(email_context)
91
            text_body = loader.get_template(
92
                'email_messages/organisation/new.txt').render(email_context)
93
94
            regional_lead = Profile.objects.filter(
95
                interested_locations=form.instance.location,
96
                usertype__slug='lead').values_list('user__email', flat=True)
97
            send_email_to_id(subject,
98
                             body=email_body,
99
                             email_id=request.user.email,
100
                             text_body=text_body)
101
102
            send_email_to_list(subject,
103
                               body=email_body,
104
                               users_list=regional_lead,
105
                               text_body=text_body)
106
107
            return HttpResponseRedirect(self.success_url)
108
        else:
109
            return render(request, self.template_name, {'form': form})
110
111
112
class OrganisationDetail(views.LoginRequiredMixin, generic.DetailView):
113
    model = Organisation
114
    template_name = 'organisation/detail.html'
115
    success_url = reverse_lazy('organisations:organisation_list')
116
117
    def get_queryset(self):
118
        return Organisation.objects.filter(
119
            user=self.request.user,
120
            id=self.kwargs['pk'])
121
122
123
class OrganisationUpdate(views.LoginRequiredMixin, generic.UpdateView):
124
    model = Organisation
125
    form_class = OrganisationForm
126
    template_name = 'organisation/edit.html'
127
    success_url = reverse_lazy('organisations:organisation_list')
128
129
    def get_object(self, queryset=None):
130
        return Organisation.objects.get(user=self.request.user, id=self.kwargs['pk'])
131
132
133
class OrganisationMemberAdd(views.LoginRequiredMixin, generic.UpdateView):
134
    model = Organisation
135
    form_class = OrganisationMemberAddForm
136
    template_name = 'organisation/member-add.html'
137
    success_url = reverse_lazy('organisations:organisation_list')
138
139
    def get_username(self, email):
140
        """
141
        Returns a UUID-based 'random' and unique username.
142
143
        This is required data for user models with a username field.
144
        """
145
        uuid_str = str(uuid.uuid4())
146
        username = email.split("@")[0]
147
        uuid_str = uuid_str[:30 - len(username)]
148
        return username + uuid_str
149
150
    def get_token(self, user, **kwargs):
151
        """Returns a unique token for the given user"""
152
        return PasswordResetTokenGenerator().make_token(user)
153
154
    def get_urls(self):
155
        return patterns('',
156
                        url(r'^(?P<user_id>[\d]+)-(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/',
157
                            view=self.activate_view, name="invitation_register")
158
                        )
159
160
    def post(self, request, *args, **kwargs):
161
        form = OrganisationMemberAddForm(data=request.POST)
162
        if form.is_valid():
163
            existing_user = form.cleaned_data['existing_user']
164
            new_user = form.cleaned_data['new_user']
165
166
            org = Organisation.objects.get(id=self.kwargs['pk'])
167
            host = '{}://{}'.format(settings.SITE_PROTOCOL,
168
                                    request.META['HTTP_HOST'])
169
170
            context = {
171
                'full_name': '%s %s' % (request.user.first_name,
172
                                        request.user.last_name),
173
                'org_name': org.name,
174
                'host': host
175
            }
176
177
            if existing_user:
178
                # add user to organisation
179
                user = existing_user
180
                org.user.add(user)
181
                org.save()
182
183
                # set email user's name in context
184
                context['new_member_name'] = '%s %s' % (user.first_name,
185
                                                        user.last_name)
186
                email_context = Context(context)
187
188
                # send mail to user being added
189
                subject = "You are added in %s organisation" % (
190
                    org.location.name)
191
                email_body = loader.get_template(
192
                    'email_messages/organisation/to_new_member_existing.html').render(
193
                        email_context)
194
                text_body = loader.get_template(
195
                    'email_messages/organisation/to_new_member_existing.txt').render(email_context)
196
197
                send_email_to_id(subject,
198
                                 body=email_body,
199
                                 email_id=user.email,
200
                                 text_body=text_body)
201
202
            elif new_user:
203
                # generate a random password
204
                random_password = User.objects.make_random_password()
205
206
                # create a user with the email from form
207
                user = User(username=self.get_username(new_user),
208
                            email=new_user,
209
                            password=random_password)
210
211
                # user is inactive initialy
212
                user.is_active = False
213
                user.save()
214
215
                # add the user to organisation
216
                org.user.add(user.id)
217
                org.save()
218
219
                # set the email context, the token will be used to generate a unique varification
220
                # link
221
                token = self.get_token(user)
222
223
                context['new_member_name'] = '%s' % (user.email)
224
                context['token'] = token
225
                context['user'] = user
226
                email_context = Context(context)
227
228
                # set the meta
229
                subject = "[Python Express]:You are added in %s organisation" % (
230
                    org.location.name)
231
                email_body = loader.get_template(
232
                    'email_messages/organisation/to_new_member.html').render(email_context)
233
                text_body = loader.get_template(
234
                    'email_messages/organisation/to_new_member.txt').render(email_context)
235
236
                # send the mail to new user
237
                send_email_to_id(subject,
238
                                 body=email_body,
239
                                 email_id=new_user,
240
                                 text_body=text_body)
241
242
            # These mails will be sent in both cases.
243
            subject = "user %s %s added in %s organisation" % (
244
                user.first_name, user.last_name, org.location.name)
245
            email_body = loader.get_template(
246
                'email_messages/organisation/member_addition_to_user.html').render(
247
                    email_context)
248
            text_body = loader.get_template(
249
                'email_messages/organisation/member_addition_to_user.txt').render(
250
                    email_context)
251
252
            # send mail to the user who added the new member
253
            send_email_to_id(subject,
254
                             body=email_body,
255
                             email_id=request.user.email,
256
                             text_body=text_body)
257
258
            regional_lead = Profile.objects.filter(
259
                interested_locations=org.location,
260
                usertype__slug='lead').values_list('user__email', flat=True)
261
262
            email_body = loader.get_template(
263
                'email_messages/organisation/member_addition_to_lead.html').render(
264
                    email_context)
265
            text_body = loader.get_template(
266
                'email_messages/organisation/member_addition_to_lead.txt').render(
267
                    email_context)
268
269
            # send mail to the regional leads
270
            send_email_to_list(subject,
271
                               body=email_body,
272
                               users_list=regional_lead,
273
                               text_body=text_body)
274
275
            return HttpResponseRedirect(self.success_url)
276
277
        else:
278
            return render(request, self.template_name, {'form': form})
279
280
281
def activate_view(request, user_id, token):
282
    """
283
    View function that activates the given User by setting `is_active` to
284
    true if the provided information is verified.
285
    """
286
    try:
287
        user = User.objects.get(id=user_id, is_active=False)
288
    except(User.DoesNotExist):
289
        raise Http404("Your URL may have expired.")
290
291
    if not PasswordResetTokenGenerator().check_token(user, token):
292
        raise Http404("Your URL may have expired.")
293
294
    form = UserRegistrationForm(data=request.POST or None, instance=user)
295
    if form.is_valid():
296
        user.is_active = True
297
        user.username = form.cleaned_data['username']
298
        user.first_name = form.cleaned_data['first_name']
299
        user.last_name = form.cleaned_data['last_name']
300
        user.set_password(form.cleaned_data['password'])
301
        user.save()
302
        return redirect(reverse_lazy('organisations:organisation_list'))
303
    else:
304
        return render(request, 'organisation/register_form.html',
305
                      {'form': form})
306
307
308
class OrganisationDeactive(views.CsrfExemptMixin,
309
                           views.LoginRequiredMixin,
310
                           views.JSONResponseMixin,
311
                           generic.UpdateView):
312
    model = Organisation
313
    fields = ('active', 'id')
314
315
    def get_object(self, queryset=None):
316
        return Organisation.objects.get(user=self.request.user,
317
                                        id=self.kwargs['pk'])
318
319
    def post(self, request, *args, **kwargs):
320
        self.object = self.get_object()
321
        response = self.object.toggle_active(request.user, **kwargs)
322
        return self.render_json_response(response)
323