Completed
Push — master ( ee6984...d48528 )
by Fox
36s
created

UserServiceUpdateView.get_context_data()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 4
rs 10
1
from django.conf import settings
2
from django.contrib.auth.decorators import login_required
3
from django.core.urlresolvers import reverse_lazy, reverse
4
from django.http import HttpResponseRedirect
5
from django.shortcuts import redirect, get_object_or_404
6
from django.views.generic import CreateView, DeleteView, UpdateView
7
from django.views.generic import ListView
8
from django.utils.translation import ugettext_lazy as _
9
from django.utils.decorators import method_decorator
10
11
from django_th.models import UserService, ServicesActivated
12
from django_th.forms.base import UserServiceForm, activated_services
13
from django_th.services import default_provider
14
15
"""
16
   Part II : User Service
17
"""
18
19
20
def renew_service(request, pk):
21
    """
22
        renew an existing service
23
        :param request object
24
        :param pk: the primary key of the service to renew
25
        :type pk: int
26
    """
27
    default_provider.load_services()
28
    service = get_object_or_404(ServicesActivated, pk=pk)
29
    service_name = str(service.name)
30
    service_object = default_provider.get_service(service_name)
31
    lets_auth = getattr(service_object, 'auth')
32
    getattr(service_object, 'reset_failed')(pk=pk)
33
    return redirect(lets_auth(request))
34
35
36
class UserServiceListView(ListView):
37
    """
38
        List of the services activated by the user
39
    """
40
    context_object_name = "services_list"
41
    queryset = UserService.objects.all()
42
    template_name = "services/services.html"
43
44
    def get_queryset(self):
45
        # get the Service of the connected user
46
        if self.request.user.is_authenticated():
47
            return self.queryset.filter(user=self.request.user)
48
        # otherwise return nothing
49
        return UserService.objects.none()
50
51
    def get_context_data(self, **kw):
52
        context = super(UserServiceListView, self).get_context_data(**kw)
53
        if self.request.user.is_authenticated():
54
            activated_qs = ServicesActivated.objects.all()
55
            service_list_available = UserService.objects.filter(
56
                id__exact=None, name__in=activated_qs)
57
            nb_user_service = UserService.objects.filter(
58
                user=self.request.user).count()
59
            nb_service = ServicesActivated.objects.all().count()
60
            if nb_user_service == nb_service:
61
                context['action'] = 'hide'
62
            else:
63
                context['action'] = 'display'
64
65
            context['service_list_available'] = service_list_available
66
67
            # get the activated services
68
            """
69
                Number of services activated
70
            """
71
            context['nb_services'] = nb_user_service
72
73
            if self.kwargs:
74
                context['sentence'] = _('Your service has been successfully ')
75
                if self.kwargs.get('action') in ('renewed', 'deleted',
76
                                                 'edited', 'added'):
77
                    context['sentence'] += self.kwargs.get('action')
78
79
        return context
80
81
82
class UserServiceCreateView(CreateView):
83
    """
84
        Form to add a service
85
    """
86
    form_class = UserServiceForm
87
    template_name = "services/add_service.html"
88
89
    def get_context_data(self, **kwargs):
90
        context = super(UserServiceCreateView, self).get_context_data(**kwargs)
91
        context['services'] = len(activated_services(self.request.user))
92
        context['digester'] = settings.DJANGO_TH.get('digest_event')
93
        return context
94
95
    @method_decorator(login_required)
96
    def dispatch(self, *args, **kwargs):
97
        return super(UserServiceCreateView, self).dispatch(*args, **kwargs)
98
99
    def form_valid(self, form):
100
        name = form.cleaned_data.get('name').name
101
        user = self.request.user
102
        if UserService.objects.filter(name=name, user=user).exists():
103
            from django.contrib import messages
104
            messages.warning(self.request, 'Service %s already activated' %
105
                             name.split('Service')[1])
106
            return HttpResponseRedirect(reverse('user_services'))
107
        else:
108
            form.save(user=user)
109
110
            sa = ServicesActivated.objects.get(
111
                name=form.cleaned_data.get('name').name)
112
            # let's build the 'call' of the auth method
113
            # which own to a Service Class
114
            if sa.auth_required:
115
                # use the default_provider to get the object from the ServiceXXX
116
                default_provider.load_services()
117
                service_object = default_provider.get_service(
118
                    str(form.cleaned_data.get('name').name))
119
                # get the class object
120
                lets_auth = getattr(service_object, 'auth')
121
                # call the auth func from this class
122
                # and redirect to the external service page
123
                # to auth the application django-th to access to the user
124
                # account details
125
                return redirect(lets_auth(self.request))
126
127
            return HttpResponseRedirect(reverse('user_services',
128
                                                args=['added']))
129
130
    def get_form_kwargs(self):
131
        kwargs = super(UserServiceCreateView, self).get_form_kwargs()
132
        kwargs['initial']['user'] = self.request.user
133
        return kwargs
134
135
136
class UserServiceMixin(object):
137 View Code Duplication
    """
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
138
        Mixin for UpdateView and DeleteView
139
    """
140
    queryset = UserService.objects.all()
141
142
    @method_decorator(login_required)
143
    def dispatch(self, *args, **kwargs):
144
        return super(UserServiceMixin, self).dispatch(*args, **kwargs)
145
146
    def get_queryset(self):
147
        # get the Service of the connected user
148
        if self.request.user.is_authenticated():
149
            return self.queryset.filter(user=self.request.user,
150
                                        id=self.kwargs.get('pk'))
151
        # otherwise return nothing
152
        return UserService.objects.none()
153
154
155
class UserServiceUpdateView(UserServiceMixin, UpdateView):
156
    """
157
        Form to edit a service
158
    """
159
    fields = ['username', 'password',
160
              'client_secret', 'client_id', 'host',
161
              'token', 'duration']
162
    template_name = "services/edit_service.html"
163
164
    def get_success_url(self):
165
        return reverse("user_services", args=["edited"])
166
167
    def get_context_data(self, **kwargs):
168
        context = super(UserServiceUpdateView, self).get_context_data(**kwargs)
169
        context['digester'] = settings.DJANGO_TH.get('digest_event')
170
        return context
171
172
173
class UserServiceDeleteView(UserServiceMixin, DeleteView):
174
    """
175
        page to delete a service
176
    """
177
    template_name = "services/delete_service.html"
178
    success_url = reverse_lazy("service_delete_thanks")
179
180
    def get_success_url(self):
181
        return reverse("user_services", args=["deleted"])
182