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