Completed
Push — master ( cb6660...0be0a9 )
by Fox
01:29
created

TriggerUpdateView   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 23
Duplicated Lines 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 23
rs 10
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A get() 0 12 2
A get_context_data() 0 2 1
1
# coding: utf-8
2
from __future__ import unicode_literals
3
4
import arrow
5
from django.conf import settings
6
from django.shortcuts import render, redirect
7
from django.shortcuts import get_object_or_404
8
from django.contrib.auth.decorators import login_required
9
from django.utils.decorators import method_decorator
10
from django.http import HttpResponseRedirect
11
from django.core.urlresolvers import reverse_lazy, reverse
12
from django.contrib.auth import logout
13
14
from django.views.generic import TemplateView, UpdateView, ListView, DeleteView
15
from django.db.models import Q
16
from django.utils.translation import ugettext as _
17
18
19
# trigger_happy
20
from django_th.models import TriggerService, UserService, ServicesActivated
21
from django_th.tools import get_service
22
from django_th.forms.base import TriggerServiceForm
23
24
import logging
25
# Get an instance of a logger
26
logger = logging.getLogger(__name__)
27
28
29
"""
30
   Part I : Trigger Part
31
"""
32
33
# ************************
34
#  FBV : simple actions  *
35
# ************************
36
37
38
def can_modify_trigger(request, provider, consumer):
39
    # do not permit to edit the details of one trigger
40
    # if the provider or consumer is disabled
41
    if provider and consumer:
42
        return False
43
    else:
44
        from django.contrib import messages
45
        messages.warning(request, 'You cant modify a disabled trigger')
46
        return True
47
48
49
def logout_view(request):
50
    """
51
        logout the user then redirect him to the home page
52
    """
53
    logout(request)
54
    return HttpResponseRedirect(reverse('base'))
55
56
57
def trigger_on_off(request, trigger_id):
58
    """
59
        enable/disable the status of the trigger then go back home
60
        :param request: request object
61
        :param trigger_id: the trigger ID to switch the status to True or False
62
        :type request: HttpRequest object
63
        :type trigger_id: int
64
        :return render
65
        :rtype HttpResponse
66
    """
67
    now = arrow.utcnow().to(settings.TIME_ZONE).format(
68
        'YYYY-MM-DD HH:mm:ssZZ')
69
    trigger = get_object_or_404(TriggerService, pk=trigger_id)
70
    if trigger.status:
71
        title = 'disabled'
72
        title_trigger = _('Set this trigger on')
73
        btn = 'success'
74
        trigger.status = False
75
    else:
76
        title = _('Edit your service')
77
        title_trigger = _('Set this trigger off')
78
        btn = 'primary'
79
        trigger.status = True
80
        # set the trigger to the current date when the
81
        # the trigger is back online
82
        trigger.date_triggered = now
83
    trigger.save()
84
85
    return render(request, 'triggers/trigger_line.html',
86
                           {'trigger': trigger,
87
                            'title': title,
88
                            'title_trigger': title_trigger,
89
                            'btn': btn})
90
91
92
def service_related_triggers_switch_to(request, user_service_id, switch):
93
    """
94
        switch the status of all the triggers related to the service,
95
        then go back home
96
        :param request: request object
97
        :param user_service_id: the service ID to switch the status to
98
        True or False of all the related trigger
99
        :param switch: the switch value
100
        :type request: HttpRequest object
101
        :type user_service_id: int
102
        :type switch: string off or on
103
    """
104
    status = True
105
    if switch == 'off':
106
        status = False
107
108
    TriggerService.objects.filter(provider__id=user_service_id).update(
109
        status=status)
110
    TriggerService.objects.filter(consumer__id=user_service_id).update(
111
        status=status)
112
113
    return HttpResponseRedirect(reverse('user_services'))
114
115
116
def trigger_switch_all_to(request, switch):
117
    """
118
        switch the status of all the "my" triggers then go back home
119
        :param request: request object
120
        :param switch: the switch value
121
        :type request: HttpRequest object
122
        :type switch: string off or on
123
    """
124
    now = arrow.utcnow().to(settings.TIME_ZONE).format('YYYY-MM-DD HH:mm:ss')
125
    status = True
126
    if switch == 'off':
127
        status = False
128
    if status:
129
        TriggerService.objects.filter(user=request.user).update(
130
            status=status, date_triggered=now)
131
    else:
132
        TriggerService.objects.filter(user=request.user).update(status=status)
133
134
    return HttpResponseRedirect(reverse('base'))
135
136
137
def list_services(request, step):
138
    """
139
        get the activated services added from the administrator
140
        :param request: request object
141
        :param step: the step which is proceeded
142
        :type request: HttpRequest object
143
        :type step: string
144
        :return the activated services added from the administrator
145
    """
146
    all_datas = []
147
148
    if step == '0':
149
        services = ServicesActivated.objects.filter(status=1)
150
    elif step == '3':
151
        services = ServicesActivated.objects.filter(status=1,
152
                                                    id__iexact=request.id)
153
    for class_name in services:
154
        all_datas.append({class_name: class_name.name.rsplit('Service', 1)[1]})
155
156
    return all_datas
157
158
159
def trigger_edit(request, trigger_id, edit_what):
160
    """
161
        edit the provider
162
        :param request: request object
163
        :param trigger_id: ID of the trigger to edit
164
        :param edit_what: edit a 'Provider' or 'Consumer' ?
165
        :type request: HttpRequest object
166
        :type trigger_id: int
167
        :type edit_what: string
168
        :return render
169
        :rtype HttpResponse
170
    """
171
    if edit_what not in ('Provider', 'Consumer'):
172
        # bad request
173
        return redirect('base')
174
175
    form_name = edit_what + 'Form'
176
177
    # get the trigger object
178
    service = TriggerService.objects.get(id=trigger_id)
179
180
    if can_modify_trigger(request,
181
                          service.provider.name.status,
182
                          service.consumer.name.status):
183
        return HttpResponseRedirect(reverse('base'))
184
185
    if edit_what == 'Consumer':
186
        my_service = service.consumer.name.name
187
    else:
188
        my_service = service.provider.name.name
189
190
    # get the service name
191
    service_name = str(my_service).split('Service')[1]
192
    # get the model of this service
193
    model = get_service(my_service)
194
195
    # get the data of this service linked to that trigger
196
    data = model.objects.get(trigger_id=trigger_id)
197
198
    template = service_name.lower() + '/edit_' + edit_what.lower() + ".html"
199
200
    if request.method == 'POST':
201
        form = get_service(my_service, 'forms', form_name)(
202
            request.POST, instance=data)
203
        if form.is_valid():
204
            form.save()
205
            return HttpResponseRedirect(reverse('trigger_edit_thanks'))
206
    else:
207
        form = get_service(my_service, 'forms', form_name)(instance=data)
208
209
    context = {'description': service.description, 'edit_what': edit_what}
210
    return render(request, template, {'form': form, 'context': context})
211
212
213
class TriggerListView(ListView):
214
    """
215
        list of Triggers
216
        the list can be filtered by service
217
    """
218
    context_object_name = "triggers_list"
219
    queryset = TriggerService.objects.all()
220
    template_name = "home.html"
221
    paginate_by = 3
222
223
    def get_paginate_by(self, queryset):
224
        """
225
            Get the number of items to paginate by,
226
            from the settings
227
        """
228
        paginate_by = 3
229
        if hasattr(settings, 'DJANGO_TH'):
230
            if settings.DJANGO_TH.get('paginate_by'):
231
                paginate_by = settings.DJANGO_TH['paginate_by']
232
        return paginate_by
233
234
    def get_queryset(self):
235
        filtered_by = None
236
        # by default, sort by date_created
237
        ordered_by = (str('-date_triggered'), )
238
        # get the Trigger of the connected user
239
        if self.request.user.is_authenticated():
240
            # if the user selected a filter, get its ID
241
            if self.kwargs.get('trigger_filtered_by'):
242
                filtered_by = UserService.objects.filter(
243
                    user=self.request.user,
244
                    name=self.kwargs.get('trigger_filtered_by'))[0].id
245
246
            if self.kwargs.get('trigger_ordered_by'):
247
                """
248
                    sort by 'name' property in the related model UserService
249
                """
250
                order_by = str(self.kwargs.get('trigger_ordered_by') + "__name")
251
                # append to the tuple, the selected 'trigger_ordered_by'
252
                # choosen in the dropdown
253
                ordered_by = (order_by, ) + ordered_by
254
255
            # no filter selected
256
            if filtered_by is None:
257
                return self.queryset.filter(user=self.request.user).order_by(
258
                    *ordered_by).select_related('consumer__name',
259
                                                'provider__name')
260
261
            # filter selected : display all related triggers
262
            else:
263
                # here the queryset will do :
264
                # 1) get trigger of the connected user AND
265
                # 2) get the triggers where the provider OR the consumer match
266
                # the selected service
267
                return self.queryset.filter(user=self.request.user).filter(
268
                    Q(provider=filtered_by) |
269
                    Q(consumer=filtered_by)).order_by(
270
                    *ordered_by).select_related('consumer__name',
271
                                                'provider__name')
272
        # otherwise return nothing when user is not connected
273
        return TriggerService.objects.none()
274
275
    def get_context_data(self, **kw):
276
        """
277
            get the data of the view
278
279
            data are :
280
            1) number of triggers enabled
281
            2) number of triggers disabled
282
            3) number of activated services
283
            4) list of activated services by the connected user
284
        """
285
        triggers_enabled = triggers_disabled = services_activated = ()
286
287
        context = super(TriggerListView, self).get_context_data(**kw)
288
289
        if self.kwargs.get('trigger_filtered_by'):
290
            page_link = reverse('trigger_filter_by',
291
                                kwargs={'trigger_filtered_by':
292
                                        self.kwargs.get('trigger_filtered_by')})
293
        elif self.kwargs.get('trigger_ordered_by'):
294
            page_link = reverse('trigger_order_by',
295
                                kwargs={'trigger_ordered_by':
296
                                        self.kwargs.get('trigger_ordered_by')})
297
        else:
298
            page_link = reverse('home')
299
300
        if self.request.user.is_authenticated():
301
            # get the enabled triggers
302
            triggers_enabled = TriggerService.objects.filter(
303
                user=self.request.user, status=1).count()
304
            # get the disabled triggers
305
            triggers_disabled = TriggerService.objects.filter(
306
                user=self.request.user, status=0).count()
307
            # get the activated services
308
            user_service = UserService.objects.filter(user=self.request.user)
309
            """
310
                List of triggers activated by the user
311
            """
312
            context['trigger_filter_by'] = user_service
313
            """
314
                number of service activated for the current user
315
            """
316
            services_activated = user_service.count()
317
318
        """
319
            which triggers are enabled/disabled
320
        """
321
        context['nb_triggers'] = {'enabled': triggers_enabled,
322
                                  'disabled': triggers_disabled}
323
        """
324
            Number of services activated
325
        """
326
        context['nb_services'] = services_activated
327
328
        context['page_link'] = page_link
329
330
        return context
331
332
333 View Code Duplication
class TriggerServiceMixin(object):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
334
    """
335
        Mixin for UpdateView and DeleteView
336
    """
337
    queryset = TriggerService.objects.all()
338
339
    @method_decorator(login_required)
340
    def dispatch(self, *args, **kwargs):
341
        return super(TriggerServiceMixin, self).dispatch(*args, **kwargs)
342
343
    def get_queryset(self):
344
        # get the trigger of the connected user
345
        if self.request.user.is_authenticated():
346
            return self.queryset.filter(user=self.request.user,
347
                                        id=self.kwargs.get('pk'))
348
        # otherwise return nothing
349
        return TriggerService.objects.none()
350
351
352
class TriggerUpdateView(TriggerServiceMixin, UpdateView):
353
    """
354
        Form to update description
355
    """
356
    form_class = TriggerServiceForm
357
    template_name = "triggers/edit_description_trigger.html"
358
    success_url = reverse_lazy("trigger_edit_thanks")
359
360
    def get_context_data(self, **kw):
361
        return super(TriggerUpdateView, self).get_context_data(**kw)
362
363
    def get(self, *args, **kwargs):
364
        # Go through keyword arguments, and either save their values to our
365
        # instance, or raise an error.
366
        self.object = self.get_object()
367
        status = can_modify_trigger(self.request,
368
                                    self.object.provider.name.status,
369
                                    self.object.consumer.name.status)
370
        if status:
371
            return HttpResponseRedirect(reverse('base'))
372
        else:
373
            return super(TriggerUpdateView, self).get(
374
                self.request, *args, **kwargs)
375
376
377
class TriggerEditedTemplateView(TemplateView):
378
    """
379
        just a simple form to say thanks :P
380
    """
381
    template_name = "triggers/thanks_trigger.html"
382
383
    def get_context_data(self, **kw):
384
        context = super(TriggerEditedTemplateView, self).get_context_data(**kw)
385
        context['sentence'] = 'Your trigger has been successfully modified'
386
        return context
387
388
389
class TriggerDeleteView(TriggerServiceMixin, DeleteView):
390
    """
391
        page to delete a trigger
392
    """
393
    template_name = "triggers/delete_trigger.html"
394
    success_url = reverse_lazy("trigger_delete_thanks")
395
396
397
class TriggerDeletedTemplateView(TemplateView):
398
    """
399
        just a simple form to say thanks :P
400
    """
401
    template_name = "triggers/thanks_trigger.html"
402
403
    def get_context_data(self, **kw):
404
        context = super(TriggerDeletedTemplateView, self).\
405
            get_context_data(**kw)
406
        context['sentence'] = 'Your trigger has been successfully deleted'
407
        return context
408