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