root / admin / views.py @ 404ccab2
History | View | Annotate | Download (12.1 kB)
1 | 1081c1a0 | Giorgos Verigakis | # Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 1081c1a0 | Giorgos Verigakis | #
|
3 | 1081c1a0 | Giorgos Verigakis | # Redistribution and use in source and binary forms, with or
|
4 | 1081c1a0 | Giorgos Verigakis | # without modification, are permitted provided that the following
|
5 | 1081c1a0 | Giorgos Verigakis | # conditions are met:
|
6 | 1081c1a0 | Giorgos Verigakis | #
|
7 | 1081c1a0 | Giorgos Verigakis | # 1. Redistributions of source code must retain the above
|
8 | 1081c1a0 | Giorgos Verigakis | # copyright notice, this list of conditions and the following
|
9 | 1081c1a0 | Giorgos Verigakis | # disclaimer.
|
10 | 1081c1a0 | Giorgos Verigakis | #
|
11 | 1081c1a0 | Giorgos Verigakis | # 2. Redistributions in binary form must reproduce the above
|
12 | 1081c1a0 | Giorgos Verigakis | # copyright notice, this list of conditions and the following
|
13 | 1081c1a0 | Giorgos Verigakis | # disclaimer in the documentation and/or other materials
|
14 | 1081c1a0 | Giorgos Verigakis | # provided with the distribution.
|
15 | 1081c1a0 | Giorgos Verigakis | #
|
16 | 1081c1a0 | Giorgos Verigakis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 1081c1a0 | Giorgos Verigakis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 1081c1a0 | Giorgos Verigakis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 1081c1a0 | Giorgos Verigakis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 1081c1a0 | Giorgos Verigakis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 1081c1a0 | Giorgos Verigakis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 1081c1a0 | Giorgos Verigakis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 1081c1a0 | Giorgos Verigakis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 1081c1a0 | Giorgos Verigakis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 1081c1a0 | Giorgos Verigakis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 1081c1a0 | Giorgos Verigakis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 1081c1a0 | Giorgos Verigakis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 1081c1a0 | Giorgos Verigakis | #
|
29 | 1081c1a0 | Giorgos Verigakis | # The views and conclusions contained in the software and
|
30 | 1081c1a0 | Giorgos Verigakis | # documentation are those of the authors and should not be
|
31 | 1081c1a0 | Giorgos Verigakis | # interpreted as representing official policies, either expressed
|
32 | 1081c1a0 | Giorgos Verigakis | # or implied, of GRNET S.A.
|
33 | 1081c1a0 | Giorgos Verigakis | |
34 | 1f06d8ff | Giorgos Verigakis | from functools import wraps |
35 | 1f06d8ff | Giorgos Verigakis | |
36 | 1f06d8ff | Giorgos Verigakis | from django.http import HttpResponse |
37 | 1f06d8ff | Giorgos Verigakis | from django.shortcuts import redirect |
38 | 1f06d8ff | Giorgos Verigakis | from django.template.loader import render_to_string |
39 | 1f06d8ff | Giorgos Verigakis | |
40 | 1f06d8ff | Giorgos Verigakis | from synnefo.db import models |
41 | 1f06d8ff | Giorgos Verigakis | from synnefo.invitations.invitations import add_invitation, send_invitation |
42 | e1f81736 | Giorgos Verigakis | from synnefo.logic import backend, log, users |
43 | e1f81736 | Giorgos Verigakis | |
44 | e1f81736 | Giorgos Verigakis | |
45 | e1f81736 | Giorgos Verigakis | _log = log.get_logger('synnefo.admin')
|
46 | 1f06d8ff | Giorgos Verigakis | |
47 | 1f06d8ff | Giorgos Verigakis | |
48 | 1f06d8ff | Giorgos Verigakis | def render(template, tab, **kwargs): |
49 | 1f06d8ff | Giorgos Verigakis | kwargs.setdefault('tab', tab)
|
50 | 1f06d8ff | Giorgos Verigakis | return render_to_string(template, kwargs)
|
51 | 1f06d8ff | Giorgos Verigakis | |
52 | 1f06d8ff | Giorgos Verigakis | |
53 | 53155501 | Giorgos Verigakis | def requires_admin(func): |
54 | 53155501 | Giorgos Verigakis | @wraps(func)
|
55 | 53155501 | Giorgos Verigakis | def wrapper(request, *args): |
56 | 53155501 | Giorgos Verigakis | if not request.user or request.user.type != 'ADMIN': |
57 | 9a6cab7a | Giorgos Verigakis | return HttpResponse('Forbidden', status=403) |
58 | 53155501 | Giorgos Verigakis | return func(request, *args)
|
59 | 53155501 | Giorgos Verigakis | return wrapper
|
60 | 53155501 | Giorgos Verigakis | |
61 | 53155501 | Giorgos Verigakis | |
62 | 89c358a3 | Giorgos Verigakis | def get_filters(request, session_key, all_filters, default=None): |
63 | 89c358a3 | Giorgos Verigakis | if default is None: |
64 | 89c358a3 | Giorgos Verigakis | default = all_filters |
65 | 89c358a3 | Giorgos Verigakis | filters = request.session.get(session_key, default) |
66 | 89c358a3 | Giorgos Verigakis | filter = request.GET.get('toggle_filter')
|
67 | 89c358a3 | Giorgos Verigakis | if filter: |
68 | 89c358a3 | Giorgos Verigakis | if filter in filters: |
69 | 89c358a3 | Giorgos Verigakis | filters.remove(filter)
|
70 | 89c358a3 | Giorgos Verigakis | elif filter in all_filters: |
71 | 89c358a3 | Giorgos Verigakis | filters.add(filter)
|
72 | 89c358a3 | Giorgos Verigakis | request.session[session_key] = filters |
73 | 89c358a3 | Giorgos Verigakis | return filters
|
74 | 89c358a3 | Giorgos Verigakis | |
75 | 89c358a3 | Giorgos Verigakis | |
76 | 53155501 | Giorgos Verigakis | @requires_admin
|
77 | 1f06d8ff | Giorgos Verigakis | def index(request): |
78 | 60f5da1a | Giorgos Verigakis | stats = {} |
79 | 60f5da1a | Giorgos Verigakis | stats['users'] = models.SynnefoUser.objects.count()
|
80 | 60f5da1a | Giorgos Verigakis | stats['images'] = models.Image.objects.exclude(state='DELETED').count() |
81 | 60f5da1a | Giorgos Verigakis | stats['flavors'] = models.Flavor.objects.count()
|
82 | 60f5da1a | Giorgos Verigakis | stats['vms'] = models.VirtualMachine.objects.filter(deleted=False).count() |
83 | 60f5da1a | Giorgos Verigakis | stats['networks'] = models.Network.objects.exclude(state='DELETED').count() |
84 | 60f5da1a | Giorgos Verigakis | stats['invitations'] = models.Invitations.objects.count()
|
85 | 60f5da1a | Giorgos Verigakis | |
86 | f5c6e3f4 | Giorgos Verigakis | stats['ganeti_instances'] = len(backend.get_ganeti_instances()) |
87 | f5c6e3f4 | Giorgos Verigakis | stats['ganeti_nodes'] = len(backend.get_ganeti_nodes()) |
88 | f5c6e3f4 | Giorgos Verigakis | stats['ganeti_jobs'] = len(backend.get_ganeti_jobs()) |
89 | 4416efc0 | Giorgos Verigakis | |
90 | 60f5da1a | Giorgos Verigakis | images = [] |
91 | 60f5da1a | Giorgos Verigakis | for image in models.Image.objects.exclude(state='DELETED'): |
92 | 60f5da1a | Giorgos Verigakis | vms = models.VirtualMachine.objects.filter(sourceimage=image) |
93 | 60f5da1a | Giorgos Verigakis | count = vms.filter(deleted=False).count()
|
94 | 60f5da1a | Giorgos Verigakis | images.append((count, image.name)) |
95 | 60f5da1a | Giorgos Verigakis | images.sort(reverse=True)
|
96 | 60f5da1a | Giorgos Verigakis | |
97 | 60f5da1a | Giorgos Verigakis | html = render('index.html', 'home', stats=stats, images=images) |
98 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
99 | 1f06d8ff | Giorgos Verigakis | |
100 | 1f06d8ff | Giorgos Verigakis | |
101 | 53155501 | Giorgos Verigakis | @requires_admin
|
102 | 1f06d8ff | Giorgos Verigakis | def flavors_list(request): |
103 | 89c358a3 | Giorgos Verigakis | all_states = set(['DELETED']) |
104 | 89c358a3 | Giorgos Verigakis | default = set()
|
105 | 89c358a3 | Giorgos Verigakis | filters = get_filters(request, 'flavors_filters', all_states, default)
|
106 | 89c358a3 | Giorgos Verigakis | |
107 | 89c358a3 | Giorgos Verigakis | flavors = models.Flavor.objects.all() |
108 | 89c358a3 | Giorgos Verigakis | if 'DELETED' not in filters: |
109 | 89c358a3 | Giorgos Verigakis | flavors = flavors.exclude(deleted=True)
|
110 | 89c358a3 | Giorgos Verigakis | |
111 | 89c358a3 | Giorgos Verigakis | html = render('flavors_list.html', 'flavors', |
112 | 89c358a3 | Giorgos Verigakis | flavors=flavors, |
113 | 89c358a3 | Giorgos Verigakis | all_states=sorted(all_states),
|
114 | 89c358a3 | Giorgos Verigakis | filters=filters) |
115 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
116 | 1f06d8ff | Giorgos Verigakis | |
117 | 53155501 | Giorgos Verigakis | |
118 | 53155501 | Giorgos Verigakis | @requires_admin
|
119 | 1f06d8ff | Giorgos Verigakis | def flavors_create(request): |
120 | 1f06d8ff | Giorgos Verigakis | if request.method == 'GET': |
121 | 1f06d8ff | Giorgos Verigakis | html = render('flavors_create.html', 'flavors') |
122 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
123 | 1f06d8ff | Giorgos Verigakis | if request.method == 'POST': |
124 | 1f06d8ff | Giorgos Verigakis | flavor = models.Flavor() |
125 | e1f81736 | Giorgos Verigakis | flavor.cpu = int(request.POST.get('cpu')) |
126 | e1f81736 | Giorgos Verigakis | flavor.ram = int(request.POST.get('ram')) |
127 | e1f81736 | Giorgos Verigakis | flavor.disk = int(request.POST.get('disk')) |
128 | 1f06d8ff | Giorgos Verigakis | flavor.save() |
129 | e1f81736 | Giorgos Verigakis | _log.info('User %s created Flavor %s', request.user.name, flavor.name)
|
130 | 1f06d8ff | Giorgos Verigakis | return redirect(flavors_info, flavor.id)
|
131 | 1f06d8ff | Giorgos Verigakis | |
132 | 53155501 | Giorgos Verigakis | |
133 | 53155501 | Giorgos Verigakis | @requires_admin
|
134 | 1f06d8ff | Giorgos Verigakis | def flavors_info(request, flavor_id): |
135 | 1f06d8ff | Giorgos Verigakis | flavor = models.Flavor.objects.get(id=flavor_id) |
136 | 1f06d8ff | Giorgos Verigakis | html = render('flavors_info.html', 'flavors', flavor=flavor) |
137 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
138 | 1f06d8ff | Giorgos Verigakis | |
139 | 53155501 | Giorgos Verigakis | |
140 | 53155501 | Giorgos Verigakis | @requires_admin
|
141 | 1f06d8ff | Giorgos Verigakis | def flavors_modify(request, flavor_id): |
142 | 1f06d8ff | Giorgos Verigakis | flavor = models.Flavor.objects.get(id=flavor_id) |
143 | e1f81736 | Giorgos Verigakis | flavor.cpu = int(request.POST.get('cpu')) |
144 | e1f81736 | Giorgos Verigakis | flavor.ram = int(request.POST.get('ram')) |
145 | e1f81736 | Giorgos Verigakis | flavor.disk = int(request.POST.get('disk')) |
146 | 870c24a0 | Giorgos Verigakis | flavor.deleted = True if request.POST.get('deleted') else False |
147 | 1f06d8ff | Giorgos Verigakis | flavor.save() |
148 | e1f81736 | Giorgos Verigakis | _log.info('User %s modified Flavor %s', request.user.name, flavor.name)
|
149 | 1f06d8ff | Giorgos Verigakis | return redirect(flavors_info, flavor.id)
|
150 | 1f06d8ff | Giorgos Verigakis | |
151 | 53155501 | Giorgos Verigakis | |
152 | 53155501 | Giorgos Verigakis | @requires_admin
|
153 | 1f06d8ff | Giorgos Verigakis | def flavors_delete(request, flavor_id): |
154 | 1f06d8ff | Giorgos Verigakis | flavor = models.Flavor.objects.get(id=flavor_id) |
155 | 1f06d8ff | Giorgos Verigakis | flavor.delete() |
156 | e1f81736 | Giorgos Verigakis | _log.info('User %s deleted Flavor %s', request.user.name, flavor.name)
|
157 | 1f06d8ff | Giorgos Verigakis | return redirect(flavors_list)
|
158 | 1f06d8ff | Giorgos Verigakis | |
159 | 1f06d8ff | Giorgos Verigakis | |
160 | 53155501 | Giorgos Verigakis | @requires_admin
|
161 | 1f06d8ff | Giorgos Verigakis | def images_list(request): |
162 | 89c358a3 | Giorgos Verigakis | all_states = set(x[0] for x in models.Image.IMAGE_STATES) |
163 | 89c358a3 | Giorgos Verigakis | default = all_states - set(['DELETED']) |
164 | 89c358a3 | Giorgos Verigakis | filters = get_filters(request, 'images_filters', all_states, default)
|
165 | 89c358a3 | Giorgos Verigakis | |
166 | 89c358a3 | Giorgos Verigakis | images = models.Image.objects.all() |
167 | 89c358a3 | Giorgos Verigakis | for state in all_states - filters: |
168 | 89c358a3 | Giorgos Verigakis | images = images.exclude(state=state) |
169 | 89c358a3 | Giorgos Verigakis | |
170 | 89c358a3 | Giorgos Verigakis | html = render('images_list.html', 'images', |
171 | 89c358a3 | Giorgos Verigakis | images=images.order_by('id'),
|
172 | 89c358a3 | Giorgos Verigakis | all_states=sorted(all_states),
|
173 | 89c358a3 | Giorgos Verigakis | filters=filters) |
174 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
175 | 1f06d8ff | Giorgos Verigakis | |
176 | 53155501 | Giorgos Verigakis | |
177 | 53155501 | Giorgos Verigakis | @requires_admin
|
178 | 1f06d8ff | Giorgos Verigakis | def images_register(request): |
179 | 1f06d8ff | Giorgos Verigakis | if request.method == 'GET': |
180 | e1f81736 | Giorgos Verigakis | formats = [x[0] for x in models.Image.FORMATS] |
181 | e1f81736 | Giorgos Verigakis | html = render('images_register.html', 'images', formats=formats) |
182 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
183 | 1f06d8ff | Giorgos Verigakis | elif request.method == 'POST': |
184 | 1f06d8ff | Giorgos Verigakis | image = models.Image() |
185 | 1f06d8ff | Giorgos Verigakis | image.state = 'ACTIVE'
|
186 | 1f06d8ff | Giorgos Verigakis | image.name = request.POST.get('name')
|
187 | 1f06d8ff | Giorgos Verigakis | owner_id = request.POST.get('owner') or None |
188 | 1f06d8ff | Giorgos Verigakis | image.owner = owner_id and models.SynnefoUser.objects.get(id=owner_id)
|
189 | 1f06d8ff | Giorgos Verigakis | image.backend_id = request.POST.get('backend')
|
190 | e1f81736 | Giorgos Verigakis | image.format = request.POST.get('format')
|
191 | 1f06d8ff | Giorgos Verigakis | image.public = True if request.POST.get('public') else False |
192 | 1f06d8ff | Giorgos Verigakis | image.save() |
193 | e1f81736 | Giorgos Verigakis | _log.info('User %s registered Image %s', request.user.name, image.name)
|
194 | 1f06d8ff | Giorgos Verigakis | return redirect(images_info, image.id)
|
195 | 1f06d8ff | Giorgos Verigakis | |
196 | 53155501 | Giorgos Verigakis | |
197 | 53155501 | Giorgos Verigakis | @requires_admin
|
198 | 1f06d8ff | Giorgos Verigakis | def images_info(request, image_id): |
199 | 1f06d8ff | Giorgos Verigakis | image = models.Image.objects.get(id=image_id) |
200 | 1f06d8ff | Giorgos Verigakis | states = [x[0] for x in models.Image.IMAGE_STATES] |
201 | 1f06d8ff | Giorgos Verigakis | if not image.state: |
202 | 1f06d8ff | Giorgos Verigakis | states = [''] + states
|
203 | 1f06d8ff | Giorgos Verigakis | formats = [x[0] for x in models.Image.FORMATS] |
204 | 1f06d8ff | Giorgos Verigakis | if not image.format: |
205 | 1f06d8ff | Giorgos Verigakis | formats = [''] + formats
|
206 | 4416efc0 | Giorgos Verigakis | |
207 | 4416efc0 | Giorgos Verigakis | metadata = image.imagemetadata_set.order_by('meta_key')
|
208 | 1f06d8ff | Giorgos Verigakis | html = render('images_info.html', 'images', |
209 | 4416efc0 | Giorgos Verigakis | image=image, |
210 | 4416efc0 | Giorgos Verigakis | states=states, |
211 | 4416efc0 | Giorgos Verigakis | formats=formats, |
212 | 4416efc0 | Giorgos Verigakis | metadata=metadata) |
213 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
214 | 1f06d8ff | Giorgos Verigakis | |
215 | 53155501 | Giorgos Verigakis | |
216 | 53155501 | Giorgos Verigakis | @requires_admin
|
217 | 1f06d8ff | Giorgos Verigakis | def images_modify(request, image_id): |
218 | 1f06d8ff | Giorgos Verigakis | image = models.Image.objects.get(id=image_id) |
219 | 1f06d8ff | Giorgos Verigakis | image.name = request.POST.get('name')
|
220 | 1f06d8ff | Giorgos Verigakis | image.state = request.POST.get('state')
|
221 | 1f06d8ff | Giorgos Verigakis | owner_id = request.POST.get('owner') or None |
222 | 1f06d8ff | Giorgos Verigakis | image.owner = owner_id and models.SynnefoUser.objects.get(id=owner_id)
|
223 | 1f06d8ff | Giorgos Verigakis | vm_id = request.POST.get('sourcevm') or None |
224 | 1f06d8ff | Giorgos Verigakis | image.sourcevm = vm_id and models.VirtualMachine.objects.get(id=vm_id)
|
225 | 1f06d8ff | Giorgos Verigakis | image.backend_id = request.POST.get('backend')
|
226 | 1f06d8ff | Giorgos Verigakis | image.format = request.POST.get('format')
|
227 | 1f06d8ff | Giorgos Verigakis | image.public = True if request.POST.get('public') else False |
228 | 1f06d8ff | Giorgos Verigakis | image.save() |
229 | 4416efc0 | Giorgos Verigakis | |
230 | 4416efc0 | Giorgos Verigakis | keys = request.POST.getlist('key')
|
231 | 4416efc0 | Giorgos Verigakis | vals = request.POST.getlist('value')
|
232 | 4416efc0 | Giorgos Verigakis | meta = dict(zip(keys, vals)) |
233 | 4416efc0 | Giorgos Verigakis | image.imagemetadata_set.all().delete() |
234 | 4416efc0 | Giorgos Verigakis | for key, val in meta.items(): |
235 | 4416efc0 | Giorgos Verigakis | if key:
|
236 | 4416efc0 | Giorgos Verigakis | image.imagemetadata_set.create(meta_key=key, meta_value=val) |
237 | 4416efc0 | Giorgos Verigakis | |
238 | e1f81736 | Giorgos Verigakis | _log.info('User %s modified Image %s', request.user.name, image.name)
|
239 | e1f81736 | Giorgos Verigakis | |
240 | 1f06d8ff | Giorgos Verigakis | return redirect(images_info, image.id)
|
241 | 1f06d8ff | Giorgos Verigakis | |
242 | 53155501 | Giorgos Verigakis | |
243 | 53155501 | Giorgos Verigakis | @requires_admin
|
244 | 1f06d8ff | Giorgos Verigakis | def servers_list(request): |
245 | 89c358a3 | Giorgos Verigakis | all_states = set(x[0] for x in models.VirtualMachine.OPER_STATES) |
246 | 89c358a3 | Giorgos Verigakis | default = all_states - set(['DESTROYED']) |
247 | 89c358a3 | Giorgos Verigakis | filters = get_filters(request, 'servers_filters', all_states, default)
|
248 | 89c358a3 | Giorgos Verigakis | |
249 | 89c358a3 | Giorgos Verigakis | servers = models.VirtualMachine.objects.all() |
250 | 89c358a3 | Giorgos Verigakis | for state in all_states - filters: |
251 | 89c358a3 | Giorgos Verigakis | servers = servers.exclude(operstate=state) |
252 | 89c358a3 | Giorgos Verigakis | |
253 | 89c358a3 | Giorgos Verigakis | html = render('servers_list.html', 'servers', |
254 | 89c358a3 | Giorgos Verigakis | servers=servers.order_by('id'),
|
255 | 89c358a3 | Giorgos Verigakis | all_states=sorted(all_states),
|
256 | 89c358a3 | Giorgos Verigakis | filters=filters) |
257 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
258 | 1f06d8ff | Giorgos Verigakis | |
259 | 1f06d8ff | Giorgos Verigakis | |
260 | 53155501 | Giorgos Verigakis | @requires_admin
|
261 | 1f06d8ff | Giorgos Verigakis | def users_list(request): |
262 | 89c358a3 | Giorgos Verigakis | all_states = set(x[0] for x in models.SynnefoUser.ACCOUNT_STATE) |
263 | 89c358a3 | Giorgos Verigakis | default = all_states - set(['DELETED']) |
264 | 89c358a3 | Giorgos Verigakis | filters = get_filters(request, 'users_filters', all_states, default)
|
265 | 89c358a3 | Giorgos Verigakis | |
266 | 89c358a3 | Giorgos Verigakis | users = models.SynnefoUser.objects.all() |
267 | 89c358a3 | Giorgos Verigakis | for state in all_states - filters: |
268 | 89c358a3 | Giorgos Verigakis | users = users.exclude(state=state) |
269 | 89c358a3 | Giorgos Verigakis | |
270 | 89c358a3 | Giorgos Verigakis | html = render('users_list.html', 'users', |
271 | 89c358a3 | Giorgos Verigakis | users=users.order_by('id'),
|
272 | 89c358a3 | Giorgos Verigakis | all_states=sorted(all_states),
|
273 | 89c358a3 | Giorgos Verigakis | filters=filters) |
274 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
275 | 1f06d8ff | Giorgos Verigakis | |
276 | 53155501 | Giorgos Verigakis | |
277 | 53155501 | Giorgos Verigakis | @requires_admin
|
278 | 1f06d8ff | Giorgos Verigakis | def users_invite(request): |
279 | 1f06d8ff | Giorgos Verigakis | if request.method == 'GET': |
280 | 1f06d8ff | Giorgos Verigakis | html = render('users_invite.html', 'users') |
281 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
282 | 1f06d8ff | Giorgos Verigakis | elif request.method == 'POST': |
283 | 1f06d8ff | Giorgos Verigakis | inviter_id = request.POST.get('inviter')
|
284 | 1f06d8ff | Giorgos Verigakis | realname = request.POST.get('realname')
|
285 | 1f06d8ff | Giorgos Verigakis | uniq = request.POST.get('uniq')
|
286 | 1f06d8ff | Giorgos Verigakis | inviter = models.SynnefoUser.objects.get(id=inviter_id) |
287 | 1f06d8ff | Giorgos Verigakis | inv = add_invitation(inviter, realname, uniq) |
288 | 1f06d8ff | Giorgos Verigakis | send_invitation(inv) |
289 | e1f81736 | Giorgos Verigakis | _log.info('User %s sent Invitation to %s as %s', request.user.name,
|
290 | e1f81736 | Giorgos Verigakis | uniq, inviter.name) |
291 | 1f06d8ff | Giorgos Verigakis | return redirect(users_list)
|
292 | 1f06d8ff | Giorgos Verigakis | |
293 | 53155501 | Giorgos Verigakis | |
294 | 53155501 | Giorgos Verigakis | @requires_admin
|
295 | 1f06d8ff | Giorgos Verigakis | def users_info(request, user_id): |
296 | 1f06d8ff | Giorgos Verigakis | user = models.SynnefoUser.objects.get(id=user_id) |
297 | 1f06d8ff | Giorgos Verigakis | types = [x[0] for x in models.SynnefoUser.ACCOUNT_TYPE] |
298 | 1f06d8ff | Giorgos Verigakis | if not user.type: |
299 | 1f06d8ff | Giorgos Verigakis | types = [''] + types
|
300 | 870c24a0 | Giorgos Verigakis | states = [x[0] for x in models.SynnefoUser.ACCOUNT_STATE] |
301 | 870c24a0 | Giorgos Verigakis | html = render('users_info.html', 'users', |
302 | 870c24a0 | Giorgos Verigakis | user=user, types=types, states=states) |
303 | 1f06d8ff | Giorgos Verigakis | return HttpResponse(html)
|
304 | 1f06d8ff | Giorgos Verigakis | |
305 | 53155501 | Giorgos Verigakis | |
306 | 53155501 | Giorgos Verigakis | @requires_admin
|
307 | 1f06d8ff | Giorgos Verigakis | def users_modify(request, user_id): |
308 | 1f06d8ff | Giorgos Verigakis | user = models.SynnefoUser.objects.get(id=user_id) |
309 | 1f06d8ff | Giorgos Verigakis | user.name = request.POST.get('name')
|
310 | 1f06d8ff | Giorgos Verigakis | user.realname = request.POST.get('realname')
|
311 | 1f06d8ff | Giorgos Verigakis | user.uniq = request.POST.get('uniq')
|
312 | 1f06d8ff | Giorgos Verigakis | user.credit = int(request.POST.get('credit')) |
313 | 1f06d8ff | Giorgos Verigakis | user.type = request.POST.get('type')
|
314 | 870c24a0 | Giorgos Verigakis | user.state = request.POST.get('state')
|
315 | 1f06d8ff | Giorgos Verigakis | invitations = request.POST.get('invitations')
|
316 | 1f06d8ff | Giorgos Verigakis | user.max_invitations = int(invitations) if invitations else None |
317 | 1f06d8ff | Giorgos Verigakis | user.save() |
318 | e1f81736 | Giorgos Verigakis | _log.info('User %s modified User %s', request.user.name, user.name)
|
319 | 1f06d8ff | Giorgos Verigakis | return redirect(users_info, user.id)
|
320 | 89ea9dbc | Giorgos Verigakis | |
321 | 53155501 | Giorgos Verigakis | |
322 | 53155501 | Giorgos Verigakis | @requires_admin
|
323 | 89ea9dbc | Giorgos Verigakis | def users_delete(request, user_id): |
324 | 89ea9dbc | Giorgos Verigakis | user = models.SynnefoUser.objects.get(id=user_id) |
325 | 89ea9dbc | Giorgos Verigakis | users.delete_user(user) |
326 | e1f81736 | Giorgos Verigakis | _log.info('User %s deleted User %s', request.user.name, user.name)
|
327 | 89ea9dbc | Giorgos Verigakis | return redirect(users_list)
|
328 | 8816f1ad | Giorgos Verigakis | |
329 | 8816f1ad | Giorgos Verigakis | |
330 | 53155501 | Giorgos Verigakis | @requires_admin
|
331 | 8816f1ad | Giorgos Verigakis | def invitations_list(request): |
332 | 8816f1ad | Giorgos Verigakis | invitations = models.Invitations.objects.order_by('id')
|
333 | 8816f1ad | Giorgos Verigakis | html = render('invitations_list.html', 'invitations', |
334 | 8816f1ad | Giorgos Verigakis | invitations=invitations) |
335 | 8816f1ad | Giorgos Verigakis | return HttpResponse(html)
|
336 | 8816f1ad | Giorgos Verigakis | |
337 | 53155501 | Giorgos Verigakis | |
338 | 53155501 | Giorgos Verigakis | @requires_admin
|
339 | 8816f1ad | Giorgos Verigakis | def invitations_resend(request, invitation_id): |
340 | 8816f1ad | Giorgos Verigakis | invitation = models.Invitations.objects.get(id=invitation_id) |
341 | 8816f1ad | Giorgos Verigakis | send_invitation(invitation) |
342 | e1f81736 | Giorgos Verigakis | _log.info('User %s resent Invitations from %s to %s', request.user.name,
|
343 | e1f81736 | Giorgos Verigakis | invitation.source.name, invitation.target.name) |
344 | 8816f1ad | Giorgos Verigakis | return redirect(invitations_list) |