Completed
Push — master ( bbdf1d...a587a6 )
by Fox
44s
created

MeUpdate   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 14
Duplicated Lines 0 %

Importance

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

1 Method

Rating   Name   Duplication   Size   Complexity  
A get_object() 0 8 1
1
# coding: utf-8
2
from __future__ import unicode_literals
3
4
from django.conf import settings
5
from django.contrib.auth.models import User
6
from django.contrib.auth.decorators import login_required
7
from django.contrib.auth.mixins import LoginRequiredMixin
8
from django.core.cache import caches
9
from django.db.models import Q
10
from django.http import HttpResponseRedirect
11
from django.shortcuts import render
12
from django.utils.decorators import method_decorator
13
from django.urls import reverse, reverse_lazy
14
from django.views.generic import TemplateView, UpdateView, ListView, DeleteView
15
16
# trigger_happy
17
from django_th.forms.base import TriggerServiceForm, MeForm
18
from django_th.models import TriggerService, UserService
19
from django_th.views_fbv import can_modify_trigger
20
21
import logging
22
# Get an instance of a logger
23
logger = logging.getLogger(__name__)
24
cache = caches['django_th']
25
26
27
class MeUpdate(LoginRequiredMixin, UpdateView):
28
    model = User
29
    form_class = MeForm
30
    template_name = 'edit_me.html'
31
    success_url = '/me'
32
33
    def get_object(self, queryset=None):
34
        """
35
        get only the data of the current user
36
        :param queryset:
37
        :return:
38
        """
39
        obj = User.objects.get(id=self.request.user.id)
40
        return obj
41
42
43
@login_required()
44
def me(request):
45
    return render(request, 'me.html', {'object': request.user})
46
47
48
"""
49
   Part I : Triggers
50
"""
51
52
53
class TriggerListView(ListView):
54
    """
55
        list of Triggers
56
        the list can be filtered by service
57
    """
58
    context_object_name = "triggers_list"
59
    queryset = TriggerService.objects.all()
60
    template_name = "home.html"
61
    paginate_by = 3
62
63
    def get_paginate_by(self, queryset):
64
        """
65
            Get the number of items to paginate by,
66
            from the settings
67
        """
68
        return settings.DJANGO_TH.get('paginate_by', self.paginate_by)
69
70
    def get_queryset(self):
71
        filtered_by = None
72
        # by default, sort by date_created
73
        ordered_by = (str('-date_triggered'), )
74
        # get the Trigger of the connected user
75
        if self.request.user.is_authenticated:
76
            # if the user selected a filter, get its ID
77
            if self.kwargs.get('trigger_filtered_by'):
78
                filtered_by = UserService.objects.filter(user=self.request.user,
79
                                                         name=self.kwargs.get('trigger_filtered_by'))[0].id
80
81
            if self.kwargs.get('trigger_ordered_by'):
82
                """
83
                    sort by 'name' property in the related model UserService
84
                """
85
                order_by = str(self.kwargs.get('trigger_ordered_by') + "__name")
86
                # append to the tuple, the selected 'trigger_ordered_by'
87
                # choosen in the dropdown
88
                ordered_by = (order_by, ) + ordered_by
89
90
            # no filter selected
91
            if filtered_by is None:
92
                return self.queryset.filter(user=self.request.user).order_by(*ordered_by).select_related(
93
                    'consumer__name', 'provider__name')
94
95
            # filter selected : display all related triggers
96
            else:
97
                # here the queryset will do :
98
                # 1) get trigger of the connected user AND
99
                # 2) get the triggers where the provider OR the consumer match
100
                # the selected service
101
                return self.queryset.filter(user=self.request.user).filter(Q(provider=filtered_by) |
102
                                                                           Q(consumer=filtered_by)).order_by(
103
                    *ordered_by).select_related('consumer__name',
104
                                                'provider__name')
105
        # otherwise return nothing when user is not connected
106
        return TriggerService.objects.none()
107
108
    def get_context_data(self, **kwargs):
109
        """
110
            get the data of the view
111
112
            data are :
113
            1) number of triggers enabled
114
            2) number of triggers disabled
115
            3) number of activated services
116
            4) list of activated services by the connected user
117
        """
118
        triggers_enabled = triggers_disabled = services_activated = ()
119
120
        context = super(TriggerListView, self).get_context_data(**kwargs)
121
122
        if self.kwargs.get('trigger_filtered_by'):
123
            page_link = reverse('trigger_filter_by',
124
                                kwargs={'trigger_filtered_by':
125
                                        self.kwargs.get('trigger_filtered_by')})
126
        elif self.kwargs.get('trigger_ordered_by'):
127
            page_link = reverse('trigger_order_by',
128
                                kwargs={'trigger_ordered_by':
129
                                        self.kwargs.get('trigger_ordered_by')})
130
        else:
131
            page_link = reverse('home')
132
133
        if self.request.user.is_authenticated:
134
            # get the enabled triggers
135
            triggers_enabled = TriggerService.objects.filter(
136
                user=self.request.user, status=1).count()
137
            # get the disabled triggers
138
            triggers_disabled = TriggerService.objects.filter(
139
                user=self.request.user, status=0).count()
140
            # get the activated services
141
            user_service = UserService.objects.filter(user=self.request.user)
142 View Code Duplication
            """
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
143
                List of triggers activated by the user
144
            """
145
            context['trigger_filter_by'] = user_service
146
            """
147
                number of service activated for the current user
148
            """
149
            services_activated = user_service.count()
150
151
        """
152
            which triggers are enabled/disabled
153
        """
154
        context['nb_triggers'] = {'enabled': triggers_enabled,
155
                                  'disabled': triggers_disabled}
156
        """
157
            Number of services activated
158
        """
159
        context['nb_services'] = services_activated
160
161
        context['page_link'] = page_link
162
        context['fire'] = settings.DJANGO_TH.get('fire', False)
163
164
        return context
165
166
167
class TriggerServiceMixin(object):
168
    """
169
        Mixin for UpdateView and DeleteView
170
    """
171
    queryset = TriggerService.objects.all()
172
173
    @method_decorator(login_required)
174
    def dispatch(self, *args, **kwargs):
175
        return super(TriggerServiceMixin, self).dispatch(*args, **kwargs)
176
177
    def get_queryset(self):
178
        # get the trigger of the connected user
179
        if self.request.user.is_authenticated:
180
            return self.queryset.filter(user=self.request.user, id=self.kwargs.get('pk'))
181
        # otherwise return nothing
182
        return TriggerService.objects.none()
183
184
185
class TriggerUpdateView(TriggerServiceMixin, UpdateView):
186
    """
187
        Form to update description
188
    """
189
    form_class = TriggerServiceForm
190
    template_name = "triggers/edit_description_trigger.html"
191
    success_url = reverse_lazy("trigger_edit_thanks")
192
193
    def get_context_data(self, **kw):
194
        return super(TriggerUpdateView, self).get_context_data(**kw)
195
196
    def get(self, *args, **kwargs):
197
        # Go through keyword arguments, and either save their values to our
198
        # instance, or raise an error.
199
        self.object = self.get_object()
200
        status = can_modify_trigger(self.request, self.object.provider.name.status, self.object.consumer.name.status)
201
        if status:
202
            return HttpResponseRedirect(reverse('base'))
203
        else:
204
            return super(TriggerUpdateView, self).get(self.request, *args, **kwargs)
205
206
207
class TriggerEditedTemplateView(TemplateView):
208
    """
209
        just a simple form to say thanks :P
210
    """
211
    template_name = "triggers/edited_thanks_trigger.html"
212
213
214
class TriggerDeleteView(TriggerServiceMixin, DeleteView):
215
    """
216
        page to delete a trigger
217
    """
218
    template_name = "triggers/delete_trigger.html"
219
    success_url = reverse_lazy("trigger_delete_thanks")
220
221
222
class TriggerDeletedTemplateView(TemplateView):
223
    """
224
        just a simple form to say thanks :P
225
    """
226
    template_name = "triggers/deleted_thanks_trigger.html"
227