Completed
Push — master ( 08e703...054cd3 )
by Fox
01:39
created

UserServiceCreateView.get_context_data()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 1
c 1
b 1
f 0
dl 0
loc 5
rs 9.4285
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, activated_services
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
    def get_context_data(self, **kwargs):
91
        context = super(UserServiceCreateView, self).get_context_data(**kwargs)
92
        context['services'] = len(activated_services(self.request.user))
93
        print(context)
94
        return context
95
96
    @method_decorator(login_required)
97
    def dispatch(self, *args, **kwargs):
98
        return super(UserServiceCreateView, self).dispatch(*args, **kwargs)
99
100
    def form_valid(self, form):
101
        name = form.cleaned_data.get('name').name
102
        user = self.request.user
103
        if UserService.objects.filter(name=name, user=user).exists():
104
            from django.contrib import messages
105
            messages.warning(self.request, 'Service %s already activated' %
106
                             name.split('Service')[1])
107
            return HttpResponseRedirect(reverse('user_services'))
108
        else:
109
            form.save(user=user)
110
111
            sa = ServicesActivated.objects.get(
112
                name=form.cleaned_data.get('name').name)
113
            # let's build the 'call' of the auth method
114
            # which own to a Service Class
115
            if sa.auth_required:
116
                # use the default_provider to get the object from the ServiceXXX
117
                default_provider.load_services()
118
                service_object = default_provider.get_service(
119
                    str(form.cleaned_data.get('name').name))
120
                # get the class object
121
                lets_auth = getattr(service_object, 'auth')
122
                # call the auth func from this class
123
                # and redirect to the external service page
124
                # to auth the application django-th to access to the user
125
                # account details
126
                return redirect(lets_auth(self.request))
127
128
            return HttpResponseRedirect(reverse('user_services',
129
                                                args=['added']))
130
131
    def get_form_kwargs(self):
132
        kwargs = super(UserServiceCreateView, self).get_form_kwargs()
133
        kwargs['initial']['user'] = self.request.user
134
        return kwargs
135
136
137 View Code Duplication
class UserServiceMixin(object):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
138
    """
139
        Mixin for UpdateView and DeleteView
140
    """
141
    queryset = UserService.objects.all()
142
143
    @method_decorator(login_required)
144
    def dispatch(self, *args, **kwargs):
145
        return super(UserServiceMixin, self).dispatch(*args, **kwargs)
146
147
    def get_queryset(self):
148
        # get the Service of the connected user
149
        if self.request.user.is_authenticated():
150
            return self.queryset.filter(user=self.request.user,
151
                                        id=self.kwargs.get('pk'))
152
        # otherwise return nothing
153
        return UserService.objects.none()
154
155
156
class UserServiceUpdateView(UserServiceMixin, UpdateView):
157
    """
158
        Form to edit a service
159
    """
160
    fields = ['username', 'password',
161
              'client_secret', 'client_id', 'host',
162
              'token']
163
    template_name = "services/edit_service.html"
164
165
    def get_success_url(self):
166
        return reverse("user_services", args=["edited"])
167
168
169
class UserServiceDeleteView(UserServiceMixin, DeleteView):
170
    """
171
        page to delete a service
172
    """
173
    template_name = "services/delete_service.html"
174
    success_url = reverse_lazy("service_delete_thanks")
175
176
    def get_success_url(self):
177
        return reverse("user_services", args=["deleted"])
178