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