Add error messages, "add group" functionality, and updated POT file/pybabel mapping file.

This commit is contained in:
Ricky Zhou (周家杰) 2007-08-20 22:00:58 -07:00
parent 64dc4c93ad
commit 61126769fa
13 changed files with 929 additions and 717 deletions

View file

@ -19,8 +19,14 @@ tg.defaultview = "genshi"
# One of (html|html-strict|xhtml|xhtml-strict|xml|json)
# kid.outputformat="html"
genshi.outputformat = "html"
# When @#%*( TG supports this....
#genshi.default_doctype = "html-strict"
# kid.encoding="utf-8"
#genshi.encoding="utf-8"
genshi.encoding="iso-8859-1"
# The sitetemplate is used for overall styling of a site that
# includes multiple TurboGears applications

View file

@ -19,6 +19,8 @@ from fas.group import Group
# import logging
# log = logging.getLogger("fas.controllers")
#TODO: Appropriate flash icons for errors, etc.
class Root(controllers.RootController):
user = User()

View file

@ -458,7 +458,7 @@ def delete(base, ldapServer=None):
ldapServer = s.ldapConn
ldapServer.simple_bind_s('cn=directory manager', 'test')
print "Deleteing %s " % base
print "Deleting %s " % base
ldapServer.delete_s(base)
def add(base, attributes, ldapServer=None):

View file

@ -3,6 +3,8 @@ from turbogears import controllers, expose, paginate, identity, redirect, widget
import ldap
import fas.fasLDAP
from fas.fasLDAP import UserAccount
from fas.fasLDAP import Person
from fas.fasLDAP import Groups
@ -21,7 +23,7 @@ class knownGroup(validators.FancyValidator):
def validate_python(self, value, state):
g = Groups.groups(value)
if not g:
raise validators.Invalid(_("The group '%s' does not exist") % value, value, state)
raise validators.Invalid(_("The group '%s' does not exist.") % value, value, state)
class unknownGroup(validators.FancyValidator):
'''Make sure that a group doesn't already exist'''
@ -30,12 +32,12 @@ class unknownGroup(validators.FancyValidator):
def validate_python(self, value, state):
g = Groups.groups(value)
if g:
raise validators.Invalid(_("The group '%s' already exists") % value, value, state)
raise validators.Invalid(_("The group '%s' already exists.") % value, value, state)
class createGroup(validators.Schema):
groupName = validators.All(unknownGroup(not_empty=True, max=10), validators.String(max=32, min=3))
fedoraGroupDesc = validators.NotEmpty
fedoraGroupOwner = validator=validators.All(knownUser(not_empty=True, max=10), validators.String(max=32, min=3))
fedoraGroupOwner = validators.All(knownUser(not_empty=True, max=10), validators.String(max=32, min=3))
class editGroup(validators.Schema):
groupName = validators.All(knownGroup(not_empty=True, max=10), validators.String(max=32, min=3))
@ -65,7 +67,15 @@ class Group(controllers.Controller):
'''Perhaps show a nice explanatory message about groups here?'''
return dict()
@expose(template="fas.templates.error")
def error(self, tg_errors=None):
'''Show a friendly error message'''
if not tg_errors:
turbogears.redirect('/')
return dict(tg_errors=tg_errors)
@validate(validators=groupNameExists())
@error_handler(error)
@expose(template="fas.templates.group.view")
@identity.require(turbogears.identity.not_anonymous())
def view(self, groupName):
@ -92,53 +102,80 @@ class Group(controllers.Controller):
@expose(template="fas.templates.group.new")
@identity.require(turbogears.identity.not_anonymous())
def new(self, groupName):
'''Create a group'''
return dict()
@validate(validators=createGroup())
@expose(template="fas.templates.group.new")
@identity.require(turbogears.identity.not_anonymous())
def create(self, groupName, fedoraGroupDesc, fedoraGroupOwner, fedoraGroupNeedsSponsor=True, fedoraGroupUserCanRemove=True, fedoraGroupJoinMsg=""):
def new(self):
'''Display create group form'''
userName = turbogears.identity.current.user_name
if not isAdmin(userName):
turbogears.flash(_('Only FAS adminstrators can create groups.'))
turbogears.redirect('/')
return dict()
@validate(validators=createGroup())
@error_handler(error)
@expose(template="fas.templates.group.new")
@identity.require(turbogears.identity.not_anonymous())
def create(self, groupName, fedoraGroupDesc, fedoraGroupOwner, fedoraGroupNeedsSponsor="FALSE", fedoraGroupUserCanRemove="FALSE", fedoraGroupJoinMsg=""):
'''Create a group'''
userName = turbogears.identity.current.user_name
if not isAdmin(userName):
turbogears.flash(_('Only FAS adminstrators can create groups.'))
# TODO: Create a general access denied/error page.
turbogears.redirect('/')
try:
Groups.newGroup(groupName, fedoraGroupDesc, fedoraGroupOwner, fedoraGroupNeedsSponsor, fedoraGroupUserCanRemove, fedoraGroupJoinMsg)
turbogears.flash(_("The group: '%s' has been created.") % groupName)
turbogears.redirect('/group/view/%s', groupName)
fas.fasLDAP.Group.newGroup(groupName.encode('utf8'),
fedoraGroupDesc.encode('utf8'),
fedoraGroupOwner.encode('utf8'),
fedoraGroupNeedsSponsor.encode('utf8'),
fedoraGroupUserCanRemove.encode('utf8'),
fedoraGroupJoinMsg.encode('utf8'),)
except:
turbogears.flash(_("The group: '%s' could not be created.") % groupName)
return dict()
return dict()
else:
try:
p = Person.byUserName(fedoraGroupOwner)
Groups.apply(groupName, fedoraGroupOwner) # Apply...
p.sponsor(groupName, userName) # Approve...
p.upgrade(groupName) # Sponsor...
p.upgrade(groupName) # Admin!
except:
turbogears.flash(_("The group: '%(group)s' has been created, but '%(user)' could not be added as a group administrator.") % {'group': groupName, 'user': fedoraGroupOwner})
else:
turbogears.flash(_("The group: '%s' has been created.") % groupName)
turbogears.redirect('/group/view/%s' % groupName)
return dict()
@expose(template="fas.templates.group.edit")
@identity.require(turbogears.identity.not_anonymous())
def edit(self, groupName):
'''Edit a group'''
#TODO: Handle the "no such group" case (or maybe create
#a generic function to check user/group existence.
'''Display edit group form'''
userName = turbogears.identity.current.user_name
if not canAdminGroup(userName, groupName):
turbogears.flash(_('You cannot edit %s') % groupName)
turbogears.flash(_("You cannot edit '%s'.") % groupName)
turbogears.redirect('/group/view/%s' % groupName)
group = Groups.groups(groupName)[groupName]
value = {'groupName': groupName,
'fedoraGroupOwner': group.fedoraGroupOwner,
'fedoraGroupType': group.fedoraGroupType,
'fedoraGroupNeedsSponsor': (group.fedoraGroupNeedsSponsor.upper() == 'TRUE'),
'fedoraGroupUserCanRemove': (group.fedoraGroupUserCanRemove.upper() == 'TRUE'),
'fedoraGroupJoinMsg': group.fedoraGroupJoinMsg,
'fedoraGroupDesc': group.fedoraGroupDesc, }
#'fedoraGroupRequires': group.fedoraGroupRequires, }
'fedoraGroupDesc': group.fedoraGroupDesc,
'fedoraGroupOwner': group.fedoraGroupOwner,
'fedoraGroupType': group.fedoraGroupType,
'fedoraGroupNeedsSponsor': (group.fedoraGroupNeedsSponsor.upper() == 'TRUE'),
'fedoraGroupUserCanRemove': (group.fedoraGroupUserCanRemove.upper() == 'TRUE'),
#'fedoraGroupRequires': group.fedoraGroupRequires,
'fedoraGroupJoinMsg': group.fedoraGroupJoinMsg, }
return dict(value=value)
@validate(validators=editGroup())
@expose(template="fas.templates.group.edit")
@error_handler(error)
@expose()
@identity.require(turbogears.identity.not_anonymous())
def save(self, stuff):
def save(self, groupName, fedoraGroupDesc, fedoraGroupOwner, fedoraGroupType=1, fedoraGroupNeedsSponsor="FALSE", fedoraGroupUserCanRemove="FALSE", fedoraGroupJoinMsg=""):
'''Edit a group'''
userName = turbogears.identity.current.user_name
if not canAdminGroup(userName, groupName):
turbogears.flash(_("You cannot edit '%s'.") % groupName)
turbogears.redirect('/group/view/%s' % groupName)
#TODO: Implement this :)
turbogears.redirect('/group/view/%s' % groupName)
return dict()
@expose(template="fas.templates.group.list")
@ -157,9 +194,11 @@ class Group(controllers.Controller):
# TODO: Validate
@validate(validators=userNameGroupNameExists())
@error_handler(error)
@expose(template='fas.templates.group.view')
@identity.require(turbogears.identity.not_anonymous())
def apply(self, groupName, userName):
'''Apply to a group'''
try:
Groups.apply(groupName, userName)
except ldap.ALREADY_EXISTS:
@ -167,9 +206,10 @@ class Group(controllers.Controller):
turbogears.redirect('/group/view/%s' % groupName)
else:
turbogears.flash(_('%(user)s has applied to %(group)s!') % {'user': userName, 'group': groupName})
turbogears.redirect('/group/view/%s' % group.cn)
turbogears.redirect('/group/view/%s' % groupName)
@validate(validators=userNameGroupNameExists())
@error_handler(error)
@expose(template='fas.templates.group.view')
@identity.require(turbogears.identity.not_anonymous())
def sponsor(self, groupName, userName):
@ -192,6 +232,7 @@ class Group(controllers.Controller):
turbogears.redirect('/group/view/%s' % groupName)
@validate(validators=userNameGroupNameExists())
@error_handler(error)
@expose(template='fas.templates.group.view')
@identity.require(turbogears.identity.not_anonymous())
def remove(self, groupName, userName):
@ -217,6 +258,7 @@ class Group(controllers.Controller):
return dict()
@validate(validators=userNameGroupNameExists())
@error_handler(error)
@expose(template='fas.templates.group.view')
@identity.require(turbogears.identity.not_anonymous())
def upgrade(self, groupName, userName):
@ -243,6 +285,7 @@ class Group(controllers.Controller):
turbogears.redirect('/group/view/%s' % groupName)
@validate(validators=userNameGroupNameExists())
@error_handler(error)
@expose(template='fas.templates.group.view')
@identity.require(turbogears.identity.not_anonymous())
def downgrade(self, groupName, userName):
@ -265,7 +308,8 @@ class Group(controllers.Controller):
turbogears.redirect('/group/view/%s' % groupName)
@validate(validators=groupNameExists())
@expose(template="genshi-text:fas.templates.group.dump", content_type='text/plain; charset=utf-8')
@error_handler(error)
@expose(template="genshi-text:fas.templates.group.dump", format="text", content_type='text/plain; charset=utf-8')
@identity.require(turbogears.identity.not_anonymous())
def dump(self, groupName=None):
groups = Groups.byGroupName(groupName)

View file

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

View file

@ -19,13 +19,13 @@
</div>
<div class="field">
<label for="fedoraGroupNeedsSponsor">Needs Sponsor:</label>
<input py:if="value['fedoraGroupNeedsSponsor']" type="checkbox" id="fedoraGroupNeedsSponsor" name="fedoraGroupNeedsSponsor" checked="checked" />
<input py:if="not value['fedoraGroupNeedsSponsor']" type="checkbox" id="fedoraGroupNeedsSponsor" name="fedoraGroupNeedsSponsor" />
<input py:if="value['fedoraGroupNeedsSponsor']" type="checkbox" id="fedoraGroupNeedsSponsor" name="fedoraGroupNeedsSponsor" value="TRUE" checked="checked" />
<input py:if="not value['fedoraGroupNeedsSponsor']" type="checkbox" id="fedoraGroupNeedsSponsor" name="fedoraGroupNeedsSponsor" value="TRUE" />
</div>
<div class="field">
<label for="fedoraGroupUserCanRemove">Self Removal:</label>
<input py:if="value['fedoraGroupUserCanRemove']" type="checkbox" id="fedoraGroupUserCanRemove" name="fedoraGroupUserCanRemove" checked="checked" />
<input py:if="not value['fedoraGroupUserCanRemove']" type="checkbox" id="fedoraGroupUserCanRemove" name="fedoraGroupUserCanRemove" />
<input py:if="value['fedoraGroupUserCanRemove']" type="checkbox" id="fedoraGroupUserCanRemove" name="fedoraGroupUserCanRemove" value="TRUE" checked="checked" />
<input py:if="not value['fedoraGroupUserCanRemove']" type="checkbox" id="fedoraGroupUserCanRemove" name="fedoraGroupUserCanRemove" value="TRUE" />
</div>
<div class="field">
<label for="fedoraGroupJoinMsg">Group Join Message:</label>

View file

@ -23,15 +23,15 @@
</div>
<div class="field">
<label for="fedoraGroupNeedsSponsor">Needs Sponsor:</label>
<input type="checkbox" id="fedoraGroupNeedsSponsor" name="fedoraGroupNeedsSponsor" />
<input type="checkbox" id="fedoraGroupNeedsSponsor" name="fedoraGroupNeedsSponsor" value="TRUE" checked="checked" />
</div>
<div class="field">
<label for="fedoraGroupUserCanRemove">Self Removal:</label>
<input type="checkbox" id="fedoraGroupUserCanRemove" name="fedoraGroupUserCanRemove" />
<input type="checkbox" id="fedoraGroupUserCanRemove" name="fedoraGroupUserCanRemove" value="TRUE" checked="checked" />
</div>
<div class="field">
<label for="fedoraGroupJoinMsg">Group Join Message:</label>
<input type="text" id="fedoraGroupJoinMsg" name="fedoraGroupJoinMsg" value="${value['fedoraGroupJoinMsg']}" />
<label for="fedoraGroupJoinMsg">Join Message:</label>
<input type="text" id="fedoraGroupJoinMsg" name="fedoraGroupJoinMsg" />
</div>
<div class="field">
<input type="submit" value="Create!" />

View file

@ -59,7 +59,7 @@
</thead>
<tr py:for="user in groups">
<td><a href="${tg.url('/user/view/%s' % user[0])}">${user[0]}</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(user[1].fedoraRoleSponsor == "None")'><a href="${tg.url('/user/view/%s' % user[1].fedoraRoleSponsor)}">${user[1].fedoraRoleSponsor}</a></td>
<td py:if='user[1].fedoraRoleSponsor == "None"'>${user[1].fedoraRoleSponsor}</td>
<td>${user[1].fedoraRoleCreationDate}</td>
<td>${user[1].fedoraRoleApprovalDate}</td>

View file

@ -67,7 +67,7 @@
<li><a href="${tg.url('/logout')}">Log Out</a></li>
</ul>
<p class="copy">
Copyright © 2007 Red Hat, Inc. and others. All Rights Reserved.
Copyright &copy; 2007 Red Hat, Inc. and others. All Rights Reserved.
Please send any comments or corrections to the <a href="mailto:webmaster@fedoraproject.org">websites team</a>.
</p>
<p class="disclaimer">

View file

@ -11,7 +11,7 @@
<form action="${tg.url('/user/sendpass')}" method="post">
<ul>
<div class="field"><label for="userName">Username:</label> <input type="text" id="userName" name="userName" /></div>
<div class="field"><label for="mail">Primary Email:</label> <input type="password" id="mail" name="mail" /></div>
<div class="field"><label for="mail">Primary Email:</label> <input type="text" id="mail" name="mail" /></div>
<div class="field"><input type="submit" value="Reset Password" /></div>
</ul>
</form>

View file

@ -3,6 +3,8 @@ from turbogears import controllers, expose, paginate, identity, redirect, widget
import ldap
import fas.fasLDAP
from fas.fasLDAP import UserAccount
from fas.fasLDAP import Person
from fas.fasLDAP import Groups
@ -250,7 +252,7 @@ class User(controllers.Controller):
p.__setattr__('userPassword', newpass['hash'])
turbogears.flash(_('Your new password has been emailed to you.'))
turbogears.redirect('/login')
except:
except: #TODO: This may be too strong and show up even if it worked.
turbogears.flash(_('Your password could not be reset.'))
return dict()

File diff suppressed because it is too large Load diff

14
fas/pybabel.conf Normal file
View file

@ -0,0 +1,14 @@
# Extraction from Python source files
[python: **.py]
# Extraction from Genshi HTML and text templates
[genshi: **/templates/**.html]
ignore_tags = script,style
include_attrs = alt title summary
[genshi: **/templates/**.txt]
template_class = genshi.template:TextTemplate
encoding = UTF-8