Revision bfe23b13 snf-astakos-app/astakos/im/views.py
b/snf-astakos-app/astakos/im/views.py | ||
---|---|---|
62 | 62 |
from django.template.loader import render_to_string |
63 | 63 |
from django.views.decorators.http import require_http_methods |
64 | 64 |
from django.db.models import Q |
65 |
from django.core.exceptions import PermissionDenied |
|
65 | 66 |
|
66 | 67 |
from astakos.im.activation_backends import get_backend, SimpleBackend |
67 | 68 |
from astakos.im.models import ( |
68 | 69 |
AstakosUser, ApprovalTerms, AstakosGroup, |
69 | 70 |
EmailChange, GroupKind, Membership, |
70 | 71 |
RESOURCE_SEPARATOR, AstakosUserAuthProvider, |
71 |
ProjectApplication |
|
72 |
ProjectApplication, ProjectMembership, Project
|
|
72 | 73 |
) |
73 | 74 |
from astakos.im.util import get_context, prepare_response, get_query, restrict_next |
74 | 75 |
from astakos.im.forms import ( |
... | ... | |
80 | 81 |
MembersSortForm, AstakosGroupSortForm, |
81 | 82 |
TimelineForm, PickResourceForm, |
82 | 83 |
AstakosGroupCreationSummaryForm, |
83 |
ProjectApplicationForm, ProjectSortForm |
|
84 |
ProjectApplicationForm, ProjectSortForm, |
|
85 |
AddProjectMembersForm, ProjectGroupSearchForm |
|
84 | 86 |
) |
85 | 87 |
from astakos.im.functions import ( |
86 | 88 |
send_feedback, SendMailError, |
... | ... | |
1458 | 1460 |
@require_http_methods(["GET", "POST"]) |
1459 | 1461 |
@signed_terms_required |
1460 | 1462 |
@login_required |
1461 |
# @transaction.commit_manually
|
|
1463 |
@transaction.commit_manually |
|
1462 | 1464 |
def project_add(request): |
1465 |
rollback = False |
|
1463 | 1466 |
result = callpoint.list_resources() |
1464 | 1467 |
resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA) |
1465 | 1468 |
resource_catalog.update_from_result(result) |
... | ... | |
1475 | 1478 |
r = create_object(request, template_name='im/projects/projectapplication_form.html', |
1476 | 1479 |
extra_context=extra_context, post_save_redirect='/im/project/list/', |
1477 | 1480 |
form_class=ProjectApplicationForm) |
1478 |
# transaction.commit() |
|
1479 | 1481 |
return r |
1480 | 1482 |
except NotificationError, e: |
1483 |
rollback = True |
|
1481 | 1484 |
messages.error(request, e.message) |
1482 |
# transaction.rollback() |
|
1483 | 1485 |
return render_response( |
1484 | 1486 |
'im/projects/projectapplication_form.html', |
1485 | 1487 |
sorting = 'definition__name', |
1486 | 1488 |
form = ProjectApplicationForm(), |
1487 | 1489 |
context_instance=get_context(request, extra_context) |
1488 | 1490 |
) |
1491 |
finally: |
|
1492 |
if rollback: |
|
1493 |
transaction.rollback() |
|
1494 |
else: |
|
1495 |
transaction.commit() |
|
1489 | 1496 |
|
1490 | 1497 |
|
1491 | 1498 |
@require_http_methods(["GET"]) |
... | ... | |
1511 | 1518 |
template_name='im/projects/project_list.html', |
1512 | 1519 |
extra_context={ |
1513 | 1520 |
'is_search':False, |
1514 |
'sorting':request.GET.get('sorting')
|
|
1521 |
'sorting':sorting
|
|
1515 | 1522 |
} |
1516 | 1523 |
) |
1517 | 1524 |
|
... | ... | |
1556 | 1563 |
resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA) |
1557 | 1564 |
resource_catalog.update_from_result(result) |
1558 | 1565 |
|
1566 |
addmembers_form = AddProjectMembersForm() |
|
1559 | 1567 |
if request.method == 'POST': |
1560 |
addmembers_form = AddGroupMembersForm(request.POST)
|
|
1568 |
addmembers_form = AddProjectMembersForm(request.POST)
|
|
1561 | 1569 |
if addmembers_form.is_valid(): |
1562 | 1570 |
try: |
1563 |
obj = Project.objects.get(id=id) |
|
1564 |
map(obj.approve_member, addmembers_form.valid_users) |
|
1565 |
except AssertionError: |
|
1566 |
msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED) |
|
1567 |
messages.error(request, msg) |
|
1568 |
except AssertionError: |
|
1569 |
msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED) |
|
1570 |
messages.error(request, msg) |
|
1571 |
addmembers_form = AddGroupMembersForm() |
|
1571 |
obj = ProjectApplication.objects.get(id=id) |
|
1572 |
map(obj.project.accept_member, addmembers_form.valid_users) |
|
1573 |
except ProjectApplication.DoesNotExist, e: |
|
1574 |
messages.error(request, _(astakos_messages.UNKNOWN_IDENTIFIER)) |
|
1575 |
except BaseException, e: |
|
1576 |
messages.error(request, e) |
|
1577 |
addmembers_form = AddProjectMembersForm() |
|
1578 |
|
|
1579 |
# validate sorting |
|
1580 |
sorting = 'person__email' |
|
1581 |
form = MembersSortForm(request.GET or request.POST) |
|
1582 |
if form.is_valid(): |
|
1583 |
sorting = form.cleaned_data.get('sorting') |
|
1572 | 1584 |
|
1573 | 1585 |
return object_detail( |
1574 | 1586 |
request, |
... | ... | |
1577 | 1589 |
template_name='im/projects/project_detail.html', |
1578 | 1590 |
extra_context={ |
1579 | 1591 |
'resource_catalog':resource_catalog, |
1580 |
'sorting':request.GET.get('sorting', request.POST.get('sorting')),
|
|
1581 |
'addmembers_form':AddGroupMembersForm()
|
|
1592 |
'sorting':sorting,
|
|
1593 |
'addmembers_form':addmembers_form
|
|
1582 | 1594 |
} |
1583 | 1595 |
) |
1584 | 1596 |
|
... | ... | |
1586 | 1598 |
@signed_terms_required |
1587 | 1599 |
@login_required |
1588 | 1600 |
def project_search(request): |
1589 |
pass |
|
1601 |
queryset = ProjectApplication.objects.none() |
|
1602 |
if request.method == 'GET': |
|
1603 |
form = AstakosGroupSearchForm() |
|
1604 |
else: |
|
1605 |
form = AstakosGroupSearchForm(request.POST.get('q')) |
|
1606 |
if form.is_valid(): |
|
1607 |
q = form.cleaned_data['q'].strip() |
|
1608 |
queryset = filter(~Q(project__last_approval_date__isnull=True)) |
|
1609 |
queryset = queryset.filter(name__contains=q) |
|
1610 |
sorting = 'definition__name' |
|
1611 |
# validate sorting |
|
1612 |
sort_form = AstakosGroupSortForm(request.GET) |
|
1613 |
if sort_form.is_valid(): |
|
1614 |
sorting = sort_form.cleaned_data.get('sorting') |
|
1615 |
queryset = queryset.order_by(sorting) |
|
1616 |
return object_list( |
|
1617 |
request, |
|
1618 |
queryset, |
|
1619 |
paginate_by=PAGINATE_BY_ALL, |
|
1620 |
page=request.GET.get('page') or 1, |
|
1621 |
template_name='im/astakosgroup_list.html', |
|
1622 |
extra_context=dict( |
|
1623 |
form=form, |
|
1624 |
is_search=True, |
|
1625 |
sorting=sorting |
|
1626 |
) |
|
1627 |
) |
|
1628 |
|
|
1590 | 1629 |
|
1591 | 1630 |
@require_http_methods(["GET"]) |
1592 | 1631 |
@signed_terms_required |
1593 | 1632 |
@login_required |
1594 | 1633 |
def project_all(request): |
1595 |
pass |
|
1634 |
q = ProjectApplication.objects.filter(~Q(project__last_approval_date__isnull=True)) |
|
1635 |
q = q.select_related() |
|
1636 |
|
|
1637 |
sorting = 'definition__name' |
|
1638 |
sort_form = ProjectSortForm(request.GET) |
|
1639 |
if sort_form.is_valid(): |
|
1640 |
sorting = sort_form.cleaned_data.get('sorting') |
|
1641 |
q = q.order_by(sorting) |
|
1642 |
|
|
1643 |
return object_list( |
|
1644 |
request, |
|
1645 |
q, |
|
1646 |
paginate_by=PAGINATE_BY_ALL, |
|
1647 |
page=request.GET.get('page') or 1, |
|
1648 |
template_name='im/projects/project_list.html', |
|
1649 |
extra_context={ |
|
1650 |
'form':ProjectGroupSearchForm(), |
|
1651 |
'is_search':True, |
|
1652 |
'sorting':sorting |
|
1653 |
} |
|
1654 |
) |
|
1596 | 1655 |
|
1597 | 1656 |
@require_http_methods(["GET", "POST"]) |
1598 | 1657 |
@signed_terms_required |
1599 | 1658 |
@login_required |
1659 |
@transaction.commit_manually |
|
1600 | 1660 |
def project_join(request, id): |
1601 |
pass |
|
1661 |
rollback = False |
|
1662 |
try: |
|
1663 |
project = Project.objects.get(application__id=id) |
|
1664 |
m = ProjectMembership( |
|
1665 |
project=project, |
|
1666 |
person=request.user, |
|
1667 |
request_date=datetime.now()) |
|
1668 |
m.save() |
|
1669 |
except Project.DoesNotExist, e: |
|
1670 |
msg = _(astakos_messages.UNKNOWN_IDENTIFIER) |
|
1671 |
messages.error(request, msg) |
|
1672 |
except IntegrityError, e: |
|
1673 |
logger.exception(e) |
|
1674 |
msg = _(astakos_messages.MEMBERSHIP_REQUEST_EXISTS) |
|
1675 |
messages.error(request, msg) |
|
1676 |
except PermissionDenied, e: |
|
1677 |
messages.error(request, e) |
|
1678 |
except NotificationError, e: |
|
1679 |
rollback = True |
|
1680 |
messages.error(request, e) |
|
1681 |
else: |
|
1682 |
return project_detail(request, id) |
|
1683 |
finally: |
|
1684 |
if rollback: |
|
1685 |
transaction.rollback() |
|
1686 |
else: |
|
1687 |
transaction.commit() |
|
1688 |
return project_search(request) |
|
1602 | 1689 |
|
1603 |
@require_http_methods(["GET", "POST"]) |
|
1690 |
|
|
1691 |
@transaction.commit_manually |
|
1692 |
def handle_project_membership(func): |
|
1693 |
@wraps(func) |
|
1694 |
def wrapper(request, id, user_id=None): |
|
1695 |
rollback = False |
|
1696 |
if not user_id: |
|
1697 |
user_id = user.id |
|
1698 |
try: |
|
1699 |
m = ProjectMembership.objects.select_related().get( |
|
1700 |
project__application__id=id, |
|
1701 |
person__id=user_id) |
|
1702 |
except AstakosUser.DoesNotExist: |
|
1703 |
return HttpResponseBadRequest(_(astakos_messages.ACCOUNT_UNKNOWN)) |
|
1704 |
except ProjectMembership.DoesNotExist: |
|
1705 |
return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER)) |
|
1706 |
else: |
|
1707 |
try: |
|
1708 |
func(request, m) |
|
1709 |
except (NotificationError, PermissionDenied), e: |
|
1710 |
messages.error(request, e) |
|
1711 |
rollback = True |
|
1712 |
finally: |
|
1713 |
if rollback: |
|
1714 |
transaction.rollback() |
|
1715 |
else: |
|
1716 |
transaction.commit() |
|
1717 |
return project_detail(request, id) |
|
1718 |
return wrapper |
|
1719 |
|
|
1720 |
|
|
1721 |
@require_http_methods(["GET"]) |
|
1604 | 1722 |
@signed_terms_required |
1605 | 1723 |
@login_required |
1606 |
def project_leave(request, id): |
|
1607 |
pass |
|
1724 |
@handle_project_membership |
|
1725 |
def project_leave(request, m): |
|
1726 |
m.leave() |
|
1608 | 1727 |
|
1609 |
@require_http_methods(["POST"]) |
|
1728 |
|
|
1729 |
@require_http_methods(["GET"]) |
|
1610 | 1730 |
@signed_terms_required |
1611 | 1731 |
@login_required |
1612 |
def project_approve_member(request, id, user_id): |
|
1613 |
pass |
|
1732 |
@handle_project_membership |
|
1733 |
def project_approve_member(request, m): |
|
1734 |
m.accept(request_user=request.user) |
|
1735 |
realname = membership.person.realname |
|
1736 |
msg = _(astakos_messages.USER_JOINED_GROUP) % locals() |
|
1737 |
messages.success(request, msg) |
|
1614 | 1738 |
|
1615 |
@require_http_methods(["POST"]) |
|
1739 |
|
|
1740 |
@require_http_methods(["GET"]) |
|
1741 |
@signed_terms_required |
|
1742 |
@login_required |
|
1743 |
@handle_project_membership |
|
1744 |
def project_remove_member(request, m): |
|
1745 |
m.remove(request_user=request.user) |
|
1746 |
realname = m.person.realname |
|
1747 |
msg = _(astakos_messages.USER_LEFT_GROUP) % locals() |
|
1748 |
messages.success(request, msg) |
|
1749 |
|
|
1750 |
|
|
1751 |
@require_http_methods(["GET"]) |
|
1616 | 1752 |
@signed_terms_required |
1617 | 1753 |
@login_required |
1618 |
def project_remove_member(request, id, user_id): |
|
1619 |
pass |
|
1620 |
|
|
1754 |
@handle_project_membership |
|
1755 |
def project_reject_member(request, m): |
|
1756 |
m.remove(request_user=request.user) |
|
1757 |
realname = membership.person.realname |
|
1758 |
msg = _(astakos_messages.USER_MEMBERSHIP_REJECTED) % locals() |
|
1759 |
messages.success(request, msg) |
Also available in: Unified diff