Statistics
| Branch: | Tag: | Revision:

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)