Completed
Push — master ( 0f0f78...29b212 )
by Fox
01:23
created

UserServiceListView.get_context_data()   B

Complexity

Conditions 5

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

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