Smarter sorting, use auth.py in templates.

This commit is contained in:
Ricky Zhou (周家杰) 2007-08-28 16:11:06 -07:00
parent 18217d3d76
commit a68f64ec7f
9 changed files with 55 additions and 54 deletions

View file

@ -42,6 +42,17 @@ def canSponsorGroup(userName, groupName, g=None):
except: except:
return False return False
def isApproved(userName, groupName, g=None):
if not g:
g = Groups.byUserName(userName)
try:
if (g[groupName].fedoraRoleStatus.lower() == 'approved'):
return True
else:
return False
except:
return False
def canEditUser(userName, editUserName): def canEditUser(userName, editUserName):
if userName == editUserName: if userName == editUserName:
return True return True

View file

@ -15,6 +15,8 @@ from operator import itemgetter
from fas.user import User from fas.user import User
from fas.group import Group from fas.group import Group
from fas.auth import isAdmin, canAdminGroup, canSponsorGroup, canEditUser
import sys import sys
reload(sys) reload(sys)
sys.setdefaultencoding('utf-8') sys.setdefaultencoding('utf-8')

View file

@ -12,8 +12,6 @@ from fas.fasLDAP import UserGroup
from fas.auth import isAdmin, canAdminGroup, canSponsorGroup, canEditUser from fas.auth import isAdmin, canAdminGroup, canSponsorGroup, canEditUser
from operator import itemgetter
from fas.user import knownUser, userNameExists from fas.user import knownUser, userNameExists
class knownGroup(validators.FancyValidator): class knownGroup(validators.FancyValidator):
@ -97,7 +95,6 @@ class Group(controllers.Controller):
#searchUserForm.groupName.display('group') #searchUserForm.groupName.display('group')
#findUser.groupName.display(value='fff') #findUser.groupName.display(value='fff')
value = {'groupName': groupName} value = {'groupName': groupName}
groups = sorted(groups.items(), key=itemgetter(0))
return dict(userName=userName, groups=groups, group=group, me=me, value=value) return dict(userName=userName, groups=groups, group=group, me=me, value=value)
@expose(template="fas.templates.group.new") @expose(template="fas.templates.group.new")
@ -202,7 +199,6 @@ class Group(controllers.Controller):
except: except:
turbogears.flash(_("No Groups found matching '%s'") % search) turbogears.flash(_("No Groups found matching '%s'") % search)
groups = {} groups = {}
groups = sorted(groups.items(), key=itemgetter(0))
return dict(groups=groups, search=search, myGroups=myGroups) return dict(groups=groups, search=search, myGroups=myGroups)
@validate(validators=userNameGroupNameExists()) @validate(validators=userNameGroupNameExists())
@ -325,6 +321,5 @@ class Group(controllers.Controller):
@identity.require(turbogears.identity.not_anonymous()) @identity.require(turbogears.identity.not_anonymous())
def dump(self, groupName=None): def dump(self, groupName=None):
groups = Groups.byGroupName(groupName) groups = Groups.byGroupName(groupName)
groups = sorted(groups.items(), key=itemgetter(0))
return dict(groups=groups, Person=Person) return dict(groups=groups, Person=Person)

View file

@ -1,3 +1,3 @@
#for user in groups #for user in sorted(groups.keys())
${user[0]},${Person.byUserName(user[0]).mail},${Person.byUserName(user[0]).givenName},${user[1].fedoraRoleType} ${user},${Person.byUserName(user).mail},${Person.byUserName(user).givenName},${groups[user].fedoraRoleType}
#end #end

View file

@ -27,15 +27,15 @@
<tr><th>Group</th><th>Description</th><th>Status</th></tr> <tr><th>Group</th><th>Description</th><th>Status</th></tr>
</thead> </thead>
<tbody> <tbody>
<tr py:for="group in groups"> <tr py:for="group in sorted(groups.keys())">
<td><a href="${tg.url('/group/view/%s' % group[1].cn)}">${group[1].cn}</a></td> <td><a href="${tg.url('/group/view/%s' % groups[group].cn)}">${groups[group].cn}</a></td>
<td>${group[1].fedoraGroupDesc}</td> <td>${groups[group].fedoraGroupDesc}</td>
<td> <td>
<a py:if="group[1].cn in myGroups" href="${tg.url('/group/view/%s' % group[1].cn)}"> <a py:if="groups[group].cn in myGroups" href="${tg.url('/group/view/%s' % groups[group].cn)}">
<span class="approved" py:if="myGroups[group[1].cn].fedoraRoleStatus.lower() == 'approved'">Approved</span> <span class="approved" py:if="myGroups[groups[group].cn].fedoraRoleStatus.lower() == 'approved'">Approved</span>
<span class="unapproved" py:if="myGroups[group[1].cn].fedoraRoleStatus.lower() == 'unapproved'">Unapproved</span> <span class="unapproved" py:if="myGroups[groups[group].cn].fedoraRoleStatus.lower() == 'unapproved'">Unapproved</span>
</a> </a>
<a py:if="group[1].cn not in myGroups" href="${tg.url('/group/view/%s' % group[1].cn)}"><span>Not a Member</span></a> <a py:if="groups[group].cn not in myGroups" href="${tg.url('/group/view/%s' % groups[group].cn)}"><span>Not a Member</span></a>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View file

@ -7,11 +7,12 @@
<title>Edit Group</title> <title>Edit Group</title>
</head> </head>
<body> <body>
<?python from fas import auth ?>
<h2>${group.fedoraGroupDesc} (${group.cn})</h2> <h2>${group.fedoraGroupDesc} (${group.cn})</h2>
<h3> <h3>
My Status: My Status:
<span py:if="me.fedoraRoleStatus.lower() == 'approved'" class="approved">Approved</span> <span py:if="auth.isApproved(userName, group.cn)" class="approved">Approved</span>
<span py:if="me.fedoraRoleStatus.lower() == 'unapproved'" class="unapproved">Unapproved</span> <span py:if="not auth.isApproved(userName, group.cn)" class="unapproved">Unapproved</span>
<span py:if="'Not a Member' in me.fedoraRoleStatus">Not a Member</span> <span py:if="'Not a Member' in me.fedoraRoleStatus">Not a Member</span>
</h3> </h3>
<form py:if="'Not a Member' in me.fedoraRoleStatus" action="${tg.url('/group/apply/%s/%s' % (group.cn, userName))}"> <form py:if="'Not a Member' in me.fedoraRoleStatus" action="${tg.url('/group/apply/%s/%s' % (group.cn, userName))}">
@ -54,32 +55,29 @@
<th>Date Approved</th> <th>Date Approved</th>
<th>Approval</th> <th>Approval</th>
<th>Role Type</th> <th>Role Type</th>
<th py:if='me.fedoraRoleType == "administrator" or me.fedoraRoleType == "sponsor"'>Action</th> <th py:if="auth.canSponsorGroup(userName, group.cn)">Action</th>
</tr> </tr>
</thead> </thead>
<tr py:for="user in groups"> <tr py:for="user in sorted(groups.keys())">
<td><a href="${tg.url('/user/view/%s' % user[0])}">${user[0]}</a></td> <td><a href="${tg.url('/user/view/%s' % user)}">${user}</a></td>
<td py:if='not(user[1].fedoraRoleSponsor == "None")'><a href="${tg.url('/user/view/%s' % user[1].fedoraRoleSponsor)}">${user[1].fedoraRoleSponsor}</a></td> <td py:if='not(groups[user].fedoraRoleSponsor == "None")'><a href="${tg.url('/user/view/%s' % groups[user].fedoraRoleSponsor)}">${groups[user].fedoraRoleSponsor}</a></td>
<td py:if='user[1].fedoraRoleSponsor == "None"'>${user[1].fedoraRoleSponsor}</td> <td py:if='groups[user].fedoraRoleSponsor == "None"'>None</td>
<td>${user[1].fedoraRoleCreationDate}</td> <td>${groups[user].fedoraRoleCreationDate}</td>
<td>${user[1].fedoraRoleApprovalDate}</td> <td>${groups[user].fedoraRoleApprovalDate}</td>
<td>${user[1].fedoraRoleStatus}</td> <td>${groups[user].fedoraRoleStatus}</td>
<td>${user[1].fedoraRoleType}</td> <td>${groups[user].fedoraRoleType}</td>
<!--<td>${user[1].fedoraRoleDomain}</td>--> <!--<td>${groups[user].fedoraRoleDomain}</td>-->
<!-- This section includes all action items --> <!-- This section includes all action items -->
<td py:if='me.fedoraRoleType == "administrator"'> <td py:if="auth.canSponsorGroup(userName, group.cn)">
<a py:if="group.fedoraGroupNeedsSponsor.upper() == 'TRUE'" href="${tg.url('/group/sponsor/%s/%s' % (user[1].cn, user[0]))}">Sponsor</a> <ul>
<a py:if="not group.fedoraGroupNeedsSponsor.upper() == 'TRUE' and user[1].fedoraRoleStatus.lower() != 'approved'" href="${tg.url('/group/sponsor/%s/%s' % (user[1].cn, user[0]))}">Approve</a> <li>
<a href="${tg.url('/group/remove/%s/%s' % (user[1].cn, user[0]))}">Delete</a> <a py:if="group.fedoraGroupNeedsSponsor.upper() == 'TRUE'" href="${tg.url('/group/sponsor/%s/%s' % (groups[user].cn, user))}">Sponsor</a>
<a href="${tg.url('/group/upgrade/%s/%s' % (user[1].cn, user[0]))}">Upgrade</a> <a py:if="not group.fedoraGroupNeedsSponsor.upper() == 'TRUE' and groups[user].fedoraRoleStatus.lower() != 'approved'" href="${tg.url('/group/sponsor/%s/%s' % (groups[user].cn, user))}">Approve</a>
<a href="${tg.url('/group/downgrade/%s/%s' % (user[1].cn, user[0]))}">Downgrade</a> Suspend </li>
</td> <li><a href="${tg.url('/group/remove/%s/%s' % (groups[user].cn, user))}">Delete</a></li>
<td py:if='me.fedoraRoleType == "sponsor" and not user[1].fedoraRoleType == "administrator"'> <li><a href="${tg.url('/group/upgrade/%s/%s' % (groups[user].cn, user))}">Upgrade</a></li>
<a href="${tg.url('/group/sponsor/%s/%s' % (user[1].cn, user[0]))}" py:if="group.fedoraGroupNeedsSponsor.upper() == 'TRUE'">Sponsor</a> <li><a href="${tg.url('/group/downgrade/%s/%s' % (groups[user].cn, user))}">Downgrade</a></li>
<a href="${tg.url('/group/sponsor/%s/%s' % (user[1].cn, user[0]))}" py:if="not group.fedoraGroupNeedsSponsor.upper() == 'TRUE'">Approve</a> </ul>
<a href="${tg.url('/group/remove/%s/%s' % (user[1].cn, user[0]))}">Delete</a>
<a py:if='user[1].fedoraRoleType' href="${tg.url('/group/upgrade/%s/%s' % (user[1].cn, user[0]))}">Upgrade</a>
<a href="${tg.url('/group/downgrade/%s/%s' % (user[1].cn, user[0]))}">Downgrade</a> Suspend
</td> </td>
</tr> </tr>
</table> </table>

View file

@ -28,7 +28,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr py:for="user in users"> <tr py:for="user in sorted(users)">
<td><a href="${tg.url('/user/view/%s' % user)}">${user}</a></td> <td><a href="${tg.url('/user/view/%s' % user)}">${user}</a></td>
<td> <td>
<span py:if="claDone[user]" class="approved"> Done</span> <span py:if="claDone[user]" class="approved"> Done</span>

View file

@ -7,6 +7,7 @@
<title>View Account</title> <title>View Account</title>
</head> </head>
<body> <body>
<?python from fas import auth ?>
<h2 class="account" py:if="personal">Your Fedora Account</h2> <h2 class="account" py:if="personal">Your Fedora Account</h2>
<h2 class="account" py:if="not personal">${user.givenName}'s Fedora Account</h2> <h2 class="account" py:if="not personal">${user.givenName}'s Fedora Account</h2>
<h3>Account Details <a href="${tg.url('/user/edit/%s' % user.cn)}" py:if="personal or admin">(edit)</a></h3> <h3>Account Details <a href="${tg.url('/user/edit/%s' % user.cn)}" py:if="personal or admin">(edit)</a></h3>
@ -29,16 +30,16 @@
<h3 py:if="personal">Your Roles</h3> <h3 py:if="personal">Your Roles</h3>
<h3 py:if="not personal">${user.givenName}'s Roles</h3> <h3 py:if="not personal">${user.givenName}'s Roles</h3>
<ul class="roleslist"> <ul class="roleslist">
<li py:for="group in groups"><span class="team approved">${groupdata[group[0]].fedoraGroupDesc} (${group[0]})</span></li> <li py:for="group in sorted(groups.keys())"><span class="team approved">${groupdata[group].fedoraGroupDesc} (${group})</span></li>
<li py:for="group in groupsPending"><span class="team unapproved">${groupdata[group[0]].fedoraGroupDesc} (${group[0]})</span></li> <li py:for="group in sorted(groupsPending.keys())"><span class="team unapproved">${groupdata[group].fedoraGroupDesc} (${group})</span></li>
</ul> </ul>
<ul class="actions" py:if="personal"> <ul class="actions" py:if="personal">
<li><a href="/">(Join another project)</a></li> <li><a href="/">(Join another project)</a></li>
<li><a href="/">(Create a new project)</a></li> <li><a href="/">(Create a new project)</a></li>
</ul> </ul>
<ul id="rolespanel" py:if="personal"> <ul id="rolespanel" py:if="personal">
<li py:for="group in groups" class="role"> <li py:for="group in sorted(groups.keys())" class="role">
<h4>${groupdata[group[0]].fedoraGroupDesc}</h4>, ${group[1].fedoraRoleType} <h4>${groupdata[group].fedoraGroupDesc}</h4>, ${groups[group].fedoraRoleType}
<dl> <dl>
<dt>Status:</dt> <dt>Status:</dt>
<dd> <dd>
@ -48,13 +49,12 @@
<dd> <dd>
<ul class="tools"> <ul class="tools">
<li><a href="/">Invite a New Member...</a></li> <li><a href="/">Invite a New Member...</a></li>
<li py:if="group[1].fedoraRoleType.lower() in ('administrator', 'sponsor')"><a href="${tg.url('/group/view/%s' % group[0])}">View All Pending Group Membership Requests...</a></li> <li py:if="auth.canSponsorGroup(user.cn, group)"><a href="${tg.url('/group/view/%s' % group)}">View All Pending Group Membership Requests...</a></li>
<li><a href="${tg.url('/group/view/%s' % group[0])}">Manage Group Membership...</a></li> <li><a href="${tg.url('/group/view/%s' % group)}">Manage Group Membership...</a></li>
<!-- Replace with canAdminGroup, etc. --> <li py:if="auth.canAdminGroup(user.cn, group)"><a href="${tg.url('/group/edit/%s' % group)}">Manage Group Details...</a></li>
<li py:if="group[1].fedoraRoleType.lower() == 'administrator'"><a href="${tg.url('/group/edit/%s' % group[0])}">Manage Group Details...</a></li>
</ul> </ul>
</dd> </dd>
<div py:if="group[1].fedoraRoleType.lower() in ('administrator', 'sponsor')" py:strip=""> <div py:if="auth.canSponsorGroup(user.cn, group)" py:strip="">
<dt>Queue:</dt> <dt>Queue:</dt>
<dd> <dd>
<ul class="queue"> <ul class="queue">

View file

@ -12,8 +12,6 @@ from fas.fasLDAP import UserGroup
from fas.auth import isAdmin, canAdminGroup, canSponsorGroup, canEditUser from fas.auth import isAdmin, canAdminGroup, canSponsorGroup, canEditUser
from operator import itemgetter
class knownUser(validators.FancyValidator): class knownUser(validators.FancyValidator):
'''Make sure that a user already exists''' '''Make sure that a user already exists'''
def _to_python(self, value, state): def _to_python(self, value, state):
@ -122,8 +120,6 @@ class User(controllers.Controller):
claDone=True claDone=True
except KeyError: except KeyError:
claDone=None claDone=None
groups = sorted(groups.items(), key=itemgetter(0))
groupsPending = sorted(groupsPending.items(), key=itemgetter(0))
return dict(user=user, groups=groups, groupsPending=groupsPending, groupdata=groupdata, claDone=claDone, personal=personal, admin=admin) return dict(user=user, groups=groups, groupsPending=groupsPending, groupdata=groupdata, claDone=claDone, personal=personal, admin=admin)
@expose(template="fas.templates.user.edit") @expose(template="fas.templates.user.edit")
@ -186,7 +182,6 @@ class User(controllers.Controller):
users = [] users = []
cla_done = Groups.byGroupName('cla_done') cla_done = Groups.byGroupName('cla_done')
claDone = {} claDone = {}
users.sort()
for u in users: for u in users:
try: try:
cla_done[u] cla_done[u]