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
![]() |
|||
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 |