Revision dc946891
b/snf-astakos-app/astakos/im/functions.py | ||
---|---|---|
288 | 288 |
raise IOError(m) |
289 | 289 |
|
290 | 290 |
|
291 |
def get_chain_of_membership_for_update(memb_id): |
|
292 |
m = get_membership_by_id(memb_id) |
|
293 |
return get_chain_for_update(m.project_id) |
|
294 |
|
|
295 |
|
|
291 | 296 |
def get_user_by_id(user_id): |
292 | 297 |
try: |
293 | 298 |
return AstakosUser.objects.get(id=user_id) |
... | ... | |
361 | 366 |
raise PermissionDenied(m) |
362 | 367 |
|
363 | 368 |
|
364 |
def accept_membership(project_id, memb_id, request_user=None): |
|
365 |
get_chain_for_update(project_id) |
|
366 |
|
|
367 |
membership = get_membership_by_id(project_id, memb_id) |
|
369 |
def accept_membership(memb_id, request_user=None): |
|
370 |
get_chain_of_membership_for_update(memb_id) |
|
371 |
membership = get_membership_by_id(memb_id) |
|
368 | 372 |
if not membership.can_accept(): |
369 | 373 |
m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST) |
370 | 374 |
raise PermissionDenied(m) |
... | ... | |
386 | 390 |
checkAlive(project) |
387 | 391 |
|
388 | 392 |
|
389 |
def reject_membership(project_id, memb_id, request_user=None): |
|
390 |
get_chain_for_update(project_id) |
|
391 |
|
|
392 |
membership = get_membership_by_id(project_id, memb_id) |
|
393 |
def reject_membership(memb_id, request_user=None): |
|
394 |
get_chain_of_membership_for_update(memb_id) |
|
395 |
membership = get_membership_by_id(memb_id) |
|
393 | 396 |
if not membership.can_reject(): |
394 | 397 |
m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST) |
395 | 398 |
raise PermissionDenied(m) |
... | ... | |
409 | 412 |
checkAlive(project) |
410 | 413 |
|
411 | 414 |
|
412 |
def cancel_membership(project_id, request_user):
|
|
413 |
get_chain_for_update(project_id)
|
|
415 |
def cancel_membership(memb_id, request_user):
|
|
416 |
get_chain_of_membership_for_update(memb_id)
|
|
414 | 417 |
|
415 |
membership = get_membership(project_id, request_user.id)
|
|
418 |
membership = get_membership_by_id(memb_id)
|
|
416 | 419 |
if not membership.can_cancel(): |
417 | 420 |
m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST) |
418 | 421 |
raise PermissionDenied(m) |
419 | 422 |
|
423 |
if membership.person != request_user: |
|
424 |
raise PermissionDenied() |
|
425 |
|
|
420 | 426 |
project = membership.project |
421 | 427 |
cancel_membership_checks(project) |
422 | 428 |
membership.cancel() |
... | ... | |
434 | 440 |
raise PermissionDenied(m) |
435 | 441 |
|
436 | 442 |
|
437 |
def remove_membership(project_id, memb_id, request_user=None): |
|
438 |
get_chain_for_update(project_id) |
|
439 |
|
|
440 |
membership = get_membership_by_id(project_id, memb_id) |
|
443 |
def remove_membership(memb_id, request_user=None): |
|
444 |
get_chain_of_membership_for_update(memb_id) |
|
445 |
membership = get_membership_by_id(memb_id) |
|
441 | 446 |
if not membership.can_remove(): |
442 | 447 |
m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP) |
443 | 448 |
raise PermissionDenied(m) |
... | ... | |
497 | 502 |
return m.can_leave() |
498 | 503 |
|
499 | 504 |
|
500 |
def leave_project(project_id, request_user):
|
|
501 |
get_chain_for_update(project_id)
|
|
505 |
def leave_project(memb_id, request_user):
|
|
506 |
get_chain_of_membership_for_update(memb_id)
|
|
502 | 507 |
|
503 |
membership = get_membership(project_id, request_user.id)
|
|
508 |
membership = get_membership_by_id(memb_id)
|
|
504 | 509 |
if not membership.can_leave(): |
505 | 510 |
m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP) |
506 | 511 |
raise PermissionDenied(m) |
507 | 512 |
|
513 |
if membership.person != request_user: |
|
514 |
raise PermissionDenied() |
|
515 |
|
|
508 | 516 |
project = membership.project |
509 | 517 |
leave_project_checks(project) |
510 | 518 |
|
b/snf-astakos-app/astakos/im/tables.py | ||
---|---|---|
207 | 207 |
membership = user.get_membership(project) |
208 | 208 |
if membership is not None: |
209 | 209 |
if can_leave and membership.can_leave(): |
210 |
url = 'astakos.im.views.project_leave' |
|
210 |
url = reverse('astakos.im.views.project_leave', |
|
211 |
args=(membership.id,)) |
|
211 | 212 |
action = _('Leave') |
212 | 213 |
confirm = True |
213 | 214 |
prompt = _('Are you sure you want to leave from the project?') |
214 | 215 |
elif can_cancel and membership.can_cancel(): |
215 |
url = 'astakos.im.views.project_cancel' |
|
216 |
url = reverse('astakos.im.views.project_cancel_member', |
|
217 |
args=(membership.id,)) |
|
216 | 218 |
action = _('Cancel') |
217 | 219 |
confirm = True |
218 | 220 |
prompt = _('Are you sure you want to cancel the join request?') |
219 | 221 |
|
220 | 222 |
elif can_join: |
221 |
url = 'astakos.im.views.project_join'
|
|
223 |
url = reverse('astakos.im.views.project_join', args=(project.id,))
|
|
222 | 224 |
action = _('Join') |
223 | 225 |
confirm = True |
224 | 226 |
prompt = _('Are you sure you want to join this project?') |
... | ... | |
227 | 229 |
confirm = False |
228 | 230 |
url = None |
229 | 231 |
|
230 |
url = reverse(url, args=(project.id, )) + append_url if url else '' |
|
231 |
|
|
232 | 232 |
return {'action': action, |
233 | 233 |
'confirm': confirm, |
234 | 234 |
'url': url, |
... | ... | |
351 | 351 |
confirms = [True, True] |
352 | 352 |
|
353 | 353 |
for i, url in enumerate(urls): |
354 |
context.append(dict(url=reverse(url, args=(table.project.pk, |
|
355 |
membership.pk)), |
|
354 |
context.append(dict(url=reverse(url, args=(membership.pk,)), |
|
356 | 355 |
action=actions[i], prompt=prompts[i], |
357 | 356 |
confirm=confirms[i])) |
358 | 357 |
return context |
b/snf-astakos-app/astakos/im/templates/im/projects/_project_detail_actions.html | ||
---|---|---|
45 | 45 |
{% endif %} |
46 | 46 |
|
47 | 47 |
{% if can_leave_request %} |
48 |
{% confirm_link "LEAVE" "project_leave" "project_leave" project.pk %}
|
|
48 |
{% confirm_link "LEAVE" "project_leave" "project_leave" membership_id %}
|
|
49 | 49 |
{% endif %} |
50 | 50 |
</div> |
b/snf-astakos-app/astakos/im/urls.py | ||
---|---|---|
75 | 75 |
name='project_detail'), |
76 | 76 |
url(r'^projects/(?P<chain_id>\d+)/join/?$', 'project_join', {}, |
77 | 77 |
name='project_join'), |
78 |
url(r'^projects/(?P<chain_id>\d+)/leave/?$', 'project_leave', {}, |
|
79 |
name='project_leave'), |
|
80 |
url(r'^projects/(?P<chain_id>\d+)/cancel/?$', 'project_cancel', {}, |
|
81 |
name='project_cancel'), |
|
82 | 78 |
url(r'^projects/(?P<chain_id>\d+)/members/?$', 'project_members', {}, |
83 | 79 |
name='project_members'), |
84 | 80 |
url(r'^projects/(?P<chain_id>\d+)/members/approved/?$', 'project_members', |
... | ... | |
94 | 90 |
name='project_members_reject'), |
95 | 91 |
url(r'^projects/(?P<chain_id>\d+)/members/pending/?$', 'project_members', |
96 | 92 |
{'members_status_filter': 0}, name='project_pending_members'), |
97 |
url(r'^projects/(?P<chain_id>\d+)/(?P<memb_id>\d+)/accept/?$', |
|
93 |
url(r'^projects/memberships/(?P<memb_id>\d+)/leave/?$', |
|
94 |
'project_leave', {}, name='project_leave'), |
|
95 |
url(r'^projects/memberships/(?P<memb_id>\d+)/cancel/?$', |
|
96 |
'project_cancel_member', {}, name='project_cancel_member'), |
|
97 |
url(r'^projects/memberships/(?P<memb_id>\d+)/accept/?$', |
|
98 | 98 |
'project_accept_member', {}, name='project_accept_member'), |
99 |
url(r'^projects/(?P<chain_id>\d+)/(?P<memb_id>\d+)/reject/?$',
|
|
99 |
url(r'^projects/memberships/(?P<memb_id>\d+)/reject/?$',
|
|
100 | 100 |
'project_reject_member', {}, name='project_reject_member'), |
101 |
url(r'^projects/(?P<chain_id>\d+)/(?P<memb_id>\d+)/remove/?$',
|
|
101 |
url(r'^projects/memberships/(?P<memb_id>\d+)/remove/?$',
|
|
102 | 102 |
'project_remove_member', {}, name='project_remove_member'), |
103 | 103 |
url(r'^projects/app/(?P<application_id>\d+)/?$', 'project_app', {}, |
104 | 104 |
name='project_app'), |
b/snf-astakos-app/astakos/im/views/projects.py | ||
---|---|---|
354 | 354 |
m = _(astakos_messages.NOT_ALLOWED) |
355 | 355 |
raise PermissionDenied(m) |
356 | 356 |
|
357 |
membership = user.get_membership(project) if project else None |
|
358 |
membership_id = membership.id if membership else None |
|
357 | 359 |
mem_display = user.membership_display(project) if project else None |
358 | 360 |
can_join_req = can_join_request(project, user) if project else False |
359 | 361 |
can_leave_req = can_leave_request(project, user) if project else False |
... | ... | |
374 | 376 |
'owner_mode': is_owner, |
375 | 377 |
'admin_mode': is_project_admin, |
376 | 378 |
'mem_display': mem_display, |
379 |
'membership_id': membership_id, |
|
377 | 380 |
'can_join_request': can_join_req, |
378 | 381 |
'can_leave_request': can_leave_req, |
379 | 382 |
'members_status_filter': members_status_filter, |
... | ... | |
462 | 465 |
@require_http_methods(["POST"]) |
463 | 466 |
@cookie_fix |
464 | 467 |
@valid_astakos_user_required |
465 |
def project_leave(request, chain_id):
|
|
468 |
def project_leave(request, memb_id):
|
|
466 | 469 |
next = request.GET.get('next') |
467 | 470 |
if not next: |
468 | 471 |
next = reverse('astakos.im.views.project_list') |
469 | 472 |
|
470 | 473 |
with ExceptionHandler(request): |
471 |
_project_leave(request, chain_id)
|
|
474 |
_project_leave(request, memb_id)
|
|
472 | 475 |
|
473 | 476 |
next = restrict_next(next, domain=settings.COOKIE_DOMAIN) |
474 | 477 |
return redirect(next) |
475 | 478 |
|
476 | 479 |
|
477 | 480 |
@commit_on_success_strict() |
478 |
def _project_leave(request, chain_id):
|
|
481 |
def _project_leave(request, memb_id):
|
|
479 | 482 |
try: |
480 |
chain_id = int(chain_id)
|
|
481 |
auto_accepted = leave_project(chain_id, request.user)
|
|
483 |
memb_id = int(memb_id)
|
|
484 |
auto_accepted = leave_project(memb_id, request.user)
|
|
482 | 485 |
if auto_accepted: |
483 | 486 |
m = _(astakos_messages.USER_LEFT_PROJECT) |
484 | 487 |
else: |
... | ... | |
491 | 494 |
@require_http_methods(["POST"]) |
492 | 495 |
@cookie_fix |
493 | 496 |
@valid_astakos_user_required |
494 |
def project_cancel(request, chain_id):
|
|
497 |
def project_cancel_member(request, memb_id):
|
|
495 | 498 |
next = request.GET.get('next') |
496 | 499 |
if not next: |
497 | 500 |
next = reverse('astakos.im.views.project_list') |
498 | 501 |
|
499 | 502 |
with ExceptionHandler(request): |
500 |
_project_cancel(request, chain_id)
|
|
503 |
_project_cancel_member(request, memb_id)
|
|
501 | 504 |
|
502 | 505 |
next = restrict_next(next, domain=settings.COOKIE_DOMAIN) |
503 | 506 |
return redirect(next) |
504 | 507 |
|
505 | 508 |
|
506 | 509 |
@commit_on_success_strict() |
507 |
def _project_cancel(request, chain_id):
|
|
510 |
def _project_cancel_member(request, memb_id):
|
|
508 | 511 |
try: |
509 |
chain_id = int(chain_id) |
|
510 |
cancel_membership(chain_id, request.user) |
|
512 |
cancel_membership(memb_id, request.user) |
|
511 | 513 |
m = _(astakos_messages.USER_REQUEST_CANCELLED) |
512 | 514 |
messages.success(request, m) |
513 | 515 |
except (IOError, PermissionDenied), e: |
... | ... | |
517 | 519 |
@require_http_methods(["POST"]) |
518 | 520 |
@cookie_fix |
519 | 521 |
@valid_astakos_user_required |
520 |
def project_accept_member(request, chain_id, memb_id):
|
|
522 |
def project_accept_member(request, memb_id): |
|
521 | 523 |
|
522 | 524 |
with ExceptionHandler(request): |
523 |
_project_accept_member(request, chain_id, memb_id)
|
|
525 |
_project_accept_member(request, memb_id) |
|
524 | 526 |
|
525 | 527 |
return redirect_back(request, 'project_list') |
526 | 528 |
|
527 | 529 |
|
528 | 530 |
@commit_on_success_strict() |
529 |
def _project_accept_member(request, chain_id, memb_id):
|
|
531 |
def _project_accept_member(request, memb_id): |
|
530 | 532 |
try: |
531 |
chain_id = int(chain_id) |
|
532 | 533 |
memb_id = int(memb_id) |
533 |
m = accept_membership(chain_id, memb_id, request.user)
|
|
534 |
m = accept_membership(memb_id, request.user) |
|
534 | 535 |
except (IOError, PermissionDenied), e: |
535 | 536 |
messages.error(request, e) |
536 | 537 |
|
... | ... | |
543 | 544 |
@require_http_methods(["POST"]) |
544 | 545 |
@cookie_fix |
545 | 546 |
@valid_astakos_user_required |
546 |
def project_remove_member(request, chain_id, memb_id):
|
|
547 |
def project_remove_member(request, memb_id): |
|
547 | 548 |
|
548 | 549 |
with ExceptionHandler(request): |
549 |
_project_remove_member(request, chain_id, memb_id)
|
|
550 |
_project_remove_member(request, memb_id) |
|
550 | 551 |
|
551 | 552 |
return redirect_back(request, 'project_list') |
552 | 553 |
|
553 | 554 |
|
554 | 555 |
@commit_on_success_strict() |
555 |
def _project_remove_member(request, chain_id, memb_id):
|
|
556 |
def _project_remove_member(request, memb_id): |
|
556 | 557 |
try: |
557 |
chain_id = int(chain_id) |
|
558 | 558 |
memb_id = int(memb_id) |
559 |
m = remove_membership(chain_id, memb_id, request.user)
|
|
559 |
m = remove_membership(memb_id, request.user) |
|
560 | 560 |
except (IOError, PermissionDenied), e: |
561 | 561 |
messages.error(request, e) |
562 | 562 |
else: |
... | ... | |
568 | 568 |
@require_http_methods(["POST"]) |
569 | 569 |
@cookie_fix |
570 | 570 |
@valid_astakos_user_required |
571 |
def project_reject_member(request, chain_id, memb_id):
|
|
571 |
def project_reject_member(request, memb_id): |
|
572 | 572 |
|
573 | 573 |
with ExceptionHandler(request): |
574 |
_project_reject_member(request, chain_id, memb_id)
|
|
574 |
_project_reject_member(request, memb_id) |
|
575 | 575 |
|
576 | 576 |
return redirect_back(request, 'project_list') |
577 | 577 |
|
578 | 578 |
|
579 | 579 |
@commit_on_success_strict() |
580 |
def _project_reject_member(request, chain_id, memb_id):
|
|
580 |
def _project_reject_member(request, memb_id): |
|
581 | 581 |
try: |
582 |
chain_id = int(chain_id) |
|
583 | 582 |
memb_id = int(memb_id) |
584 |
m = reject_membership(chain_id, memb_id, request.user)
|
|
583 |
m = reject_membership(memb_id, request.user) |
|
585 | 584 |
except (IOError, PermissionDenied), e: |
586 | 585 |
messages.error(request, e) |
587 | 586 |
else: |
... | ... | |
722 | 721 |
for member_id in member_ids: |
723 | 722 |
member_id = int(member_id) |
724 | 723 |
with ExceptionHandler(request): |
725 |
action_func(request, chain_id, member_id)
|
|
724 |
action_func(request, member_id) |
|
726 | 725 |
|
727 | 726 |
return redirect_back(request, 'project_list') |
Also available in: Unified diff