Revision a083b9a4 pithos/im/views.py

b/pithos/im/views.py
44 44

  
45 45
from django.conf import settings
46 46
from django.core.mail import send_mail
47
from django.http import HttpResponse, HttpResponseRedirect
47
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseBadRequest
48 48
from django.shortcuts import redirect
49 49
from django.template.loader import render_to_string
50 50
from django.utils.http import urlencode
51 51
from django.utils.translation import ugettext as _
52 52
from django.core.urlresolvers import reverse
53
from django import forms
54

  
55
from django_authopenid.forms import *
53 56

  
54 57
from urllib import quote
55 58

  
......
91 94

  
92 95

  
93 96
def index(request):
94
    kwargs = {'standard_modules':settings.IM_STANDARD_MODULES,
95
              'other_modules':settings.IM_OTHER_MODULES}
97
    kwargs = {'im_modules':settings.IM_MODULES,
98
              'other_modules':settings.IM_MODULES[1:]}
96 99
    return render_response('index.html',
97 100
                           next=request.GET.get('next', ''),
98 101
                           **kwargs)
......
102 105
def admin(request):
103 106
    stats = {}
104 107
    stats['users'] = User.objects.count()
108
    stats['pending'] = User.objects.filter(state = 'PENDING').count()
105 109
    
106 110
    invitations = Invitation.objects.all()
107 111
    stats['invitations'] = invitations.count()
108
    stats['invitations_accepted'] = invitations.filter(is_accepted=True).count()
112
    stats['invitations_consumed'] = invitations.filter(is_consumed=True).count()
109 113
    
110 114
    return render_response('admin.html', tab='home', stats=stats)
111 115

  
......
168 172
    user.save()
169 173
    return redirect(users_info, user.id)
170 174

  
171

  
172 175
@requires_admin
173 176
def users_delete(request, user_id):
174 177
    user = User.objects.get(id=user_id)
175 178
    user.delete()
176 179
    return redirect(users_list)
177 180

  
181
@requires_admin
182
def pending_users(request):
183
    users = User.objects.order_by('id')
184
    
185
    users = users.filter(state = 'PENDING')
186
    
187
    try:
188
        page = int(request.GET.get('page', 1))
189
    except ValueError:
190
        page = 1
191
    offset = max(0, page - 1) * settings.ADMIN_PAGE_LIMIT
192
    limit = offset + settings.ADMIN_PAGE_LIMIT
193
    
194
    npages = int(ceil(1.0 * users.count() / settings.ADMIN_PAGE_LIMIT))
195
    prev = page - 1 if page > 1 else None
196
    next = page + 1 if page < npages else None
197
    return render_response('pending_users.html',
198
                            users=users[offset:limit],
199
                            filter=filter,
200
                            pages=range(1, npages + 1),
201
                            page=page,
202
                            prev=prev,
203
                            next=next)
204

  
205
def send_greeting(baseurl, user):
206
    url = baseurl
207
    subject = _('Welcome to Pithos')
208
    message = render_to_string('welcome.txt', {
209
                'user': user,
210
                'url': url,
211
                'baseurl': baseurl,
212
                'service': settings.SERVICE_NAME,
213
                'support': settings.DEFAULT_CONTACT_EMAIL})
214
    sender = settings.DEFAULT_FROM_EMAIL
215
    send_mail(subject, message, sender, [user.email])
216
    logging.info('Sent greeting %s', user)
217

  
218
@requires_admin
219
def users_activate(request, user_id):
220
    user = User.objects.get(id=user_id)
221
    user.state = 'ACTIVE'
222
    status = 'success'
223
    try:
224
        send_greeting(request.build_absolute_uri('/').rstrip('/'), user)
225
        message = _('Greeting sent to %s' % user.email)
226
        user.save()
227
    except (SMTPException, socket.error) as e:
228
        status = 'error'
229
        name = 'strerror'
230
        message = getattr(e, name) if hasattr(e, name) else e
231
    
232
    users = User.objects.order_by('id')
233
    users = users.filter(state = 'PENDING')
234
    
235
    try:
236
        page = int(request.POST.get('page', 1))
237
    except ValueError:
238
        page = 1
239
    offset = max(0, page - 1) * settings.ADMIN_PAGE_LIMIT
240
    limit = offset + settings.ADMIN_PAGE_LIMIT
241
    
242
    npages = int(ceil(1.0 * users.count() / settings.ADMIN_PAGE_LIMIT))
243
    prev = page - 1 if page > 1 else None
244
    next = page + 1 if page < npages else None
245
    return render_response('pending_users.html',
246
                            users=users[offset:limit],
247
                            filter=filter,
248
                            pages=range(1, npages + 1),
249
                            page=page,
250
                            prev=prev,
251
                            next=next,
252
                            message=message)
178 253

  
179 254
def generate_invitation_code():
180 255
    while True:
......
187 262

  
188 263

  
189 264
def send_invitation(baseurl, inv):
190
    url = settings.INVITATION_LOGIN_TARGET % (baseurl, inv.code, quote(baseurl))
265
    url = settings.SIGNUP_TARGET % (baseurl, inv.code, quote(baseurl))
191 266
    subject = _('Invitation to Pithos')
192 267
    message = render_to_string('invitation.txt', {
193 268
                'invitation': inv,
......
261 336

  
262 337
def local_create(request):
263 338
    if request.method == 'GET':
264
        return render_response('local_create.html')
339
        provider = request.GET.get('provider', None)
340
        if not provider:
341
            return HttpResponseBadRequest('No provider')
342
        code = request.GET.get('code', None)
343
        kwargs = {'provider':provider}
344
        if code:
345
            try:
346
                invitation = Invitation.objects.get(code = code)
347
                kwargs['inv']=invitation
348
            except Invitation.DoesNotExist:
349
                return HttpResponseBadRequest('Wrong invitation code')
350
        return render_response('local_create.html', **kwargs)
265 351
    elif request.method == 'POST':
266 352
        username = request.POST.get('uniq')
267 353
        realname = request.POST.get('realname')
268 354
        email = request.POST.get('email')
269 355
        password = request.POST.get('password')
356
        retype_password = request.POST.get('retype_passwords')
270 357
        status = 'success'
271 358
        cookie_value = None
272 359
        if not username:
......
275 362
        elif not password:
276 363
            status = 'error'
277 364
            message = 'No password provided'
365
        elif not retype_password:
366
            status = 'error'
367
            message = 'Need to enter password twice'
368
        elif password != retype_password:
369
            status = 'error'
370
            message = 'Passwords do not match'
278 371
        elif not email:
279 372
            status = 'error'
280 373
            message = 'No email provided'
281 374
        
282 375
        if status == 'success':
283
            username = '%s@local' % username
284 376
            try:
285 377
                user = User.objects.get(uniq=username)
286 378
                status = 'error'
......
293 385
                user.password = request.POST.get('password')
294 386
                user.is_admin = False
295 387
                user.quota = 0
296
                user.state = 'UNVERIFIED'
388
                user.state = 'ACTIVE' if is_preaccepted(user) else 'PENDING'
389
                if user.invitation:
390
                    user.invitation.is_consumed = True
297 391
                user.level = 1
298 392
                user.renew_token()
299 393
                try:
......
301 395
                    message = _('Verification sent to %s' % user.email)
302 396
                    user.save()
303 397
                except (SMTPException, socket.error) as e:
398
                    print e
304 399
                    status = 'error'
305 400
                    name = 'strerror'
306 401
                    message = getattr(e, name) if hasattr(e, name) else e
......
443 538
@requires_admin
444 539
def users_create(request):
445 540
    if request.method == 'GET':
446
        return render_response('users_create.html')
541
        return render_response('users_local_create.html')
447 542
    if request.method == 'POST':
448 543
        user = User()
449 544
        user.uniq = request.POST.get('uniq')
......
452 547
        user.affiliation = request.POST.get('affiliation')
453 548
        user.quota = int(request.POST.get('quota') or 0) * (1024 ** 3)  # In GiB
454 549
        user.renew_token()
550
        user.provider = 'local'
455 551
        user.save()
456 552
        return redirect(users_info, user.id)
457 553

  
......
483 579
            'status': status,
484 580
            'message': message})
485 581
    return HttpResponse(html)
486
    
582

  
583
def is_preaccepted(user):
584
    return True if settings.INVITATIONS_ENABLED and user.invitation else False
585

  
586
def signup(request):
587
    if request.method == 'GET':
588
        kwargs = {'im_modules':settings.IM_MODULES}
589
        if settings.INVITATIONS_ENABLED:
590
            code = request.GET.get('code')
591
            if not code:
592
                return HttpResponseBadRequest('No code')
593
            try:
594
                invitation = Invitation.objects.get(code=code)
595
                if invitation.is_consumed:
596
                    return HttpResponseBadRequest('Invitation has beeen used')
597
            except Invitation.DoesNotExist:
598
                return HttpResponseBadRequest('Wrong invitation code')
599
            kwargs['inv'] = invitation
600
        return render_response('signup.html', **kwargs)    
601
    elif request.method == 'POST':
602
        choice = request.POST.get('choice')
603
        if not choice:
604
            return HttpResponseBadRequest('No provider selected')
605
        
606
        provider = choice
607
        
608
        code = request.POST.get('code')
609
        
610
        if provider == 'local':
611
            url = reverse('pithos.im.views.local.create')
612
            if settings.INVITATIONS_ENABLED and code:
613
                url = '%s?code=%s&provider=%s' % (url, code, provider)
614
            return redirect(url)
615
        elif provider == 'twitter':
616
            url = reverse('pithos.im.views.openid_create')
617
            return redirect(url)
618

  
619
def openid_create(request):
620
    form1 = OpenidSigninForm()
621
    kwargs = {'form1':form1}  
622
    return render_response('openid_create.html') 

Also available in: Unified diff