pysvnmanager-svn Mailing List for pySvnManager (Page 2)
Status: Alpha
Brought to you by:
jiangx
You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(32) |
Aug
(15) |
Sep
(4) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <ji...@us...> - 2008-07-30 17:41:29
|
Revision: 36 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=36&view=rev Author: jiangx Date: 2008-07-30 17:41:30 +0000 (Wed, 30 Jul 2008) Log Message: ----------- admin can rollback to history revision from log page Modified Paths: -------------- trunk/pysvnmanager/controllers/logs.py trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/i18n/pysvnmanager.pot trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/model/rcsbackup.py trunk/pysvnmanager/tests/functional/test_authz.py trunk/pysvnmanager/tests/functional/test_check.py trunk/pysvnmanager/tests/functional/test_role.py trunk/pysvnmanager/tests/test_rcs_backup.py Added Paths: ----------- trunk/pysvnmanager/templates/logs/view.mako Modified: trunk/pysvnmanager/controllers/logs.py =================================================================== --- trunk/pysvnmanager/controllers/logs.py 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/controllers/logs.py 2008-07-30 17:41:30 UTC (rev 36) @@ -68,7 +68,7 @@ </tr>''' % {'rev' : logs[i].get('revision',''), 'who' : logs[i].get('author',''), 'when': logs[i].get('date',''), - 'why' : logs[i].get('log',''), + 'why' : h.link_to(logs[i].get('log',''), h.url(action='view', id=logs[i].get('revision',''))), } buff += ''' @@ -133,3 +133,21 @@ buff += "<pre>%s</pre>" % self.rcslog.differ(left, right) return buff + + + def view(self, id): + assert id and isinstance(id, basestring) + c.contents = unicode(self.rcslog.cat(id), 'utf-8') + c.log = self.rcslog.get_logs(id, id)[0] + return render('/logs/view.mako') + + def rollback(self, id): + msg = _("Rollback to revision: %s" % id) + try: + assert id and isinstance(id, basestring) + self.rcslog.restore(id) + self.rcslog.backup(comment=msg, user=self.login_as) + except Exception, e: + return e + else: + return msg \ No newline at end of file Modified: trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-30 17:41:30 UTC (rev 36) @@ -9,7 +9,7 @@ "Project-Id-Version: pysvnmanager 0.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-31 00:22+0800\n" +"PO-Revision-Date: 2008-07-31 01:18+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: en <LL...@li...>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -124,6 +124,11 @@ msgid "Compares between" msgstr "" +#: pysvnmanager/controllers/logs.py:145 +#, python-format +msgid "Rollback to revision: %s" +msgstr "" + #: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" @@ -469,6 +474,7 @@ #: pysvnmanager/templates/logs/index.mako:5 #: pysvnmanager/templates/logs/index.mako:60 +#: pysvnmanager/templates/logs/view.mako:5 msgid "Administration logs" msgstr "" @@ -476,6 +482,14 @@ msgid "Compare revisions" msgstr "" +#: pysvnmanager/templates/logs/view.mako:16 +msgid "View history, revision" +msgstr "" + +#: pysvnmanager/templates/logs/view.mako:23 +msgid "Rollback to this revision" +msgstr "" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" Modified: trunk/pysvnmanager/i18n/pysvnmanager.pot =================================================================== --- trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-30 17:41:30 UTC (rev 36) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pySvnManager 0.1.2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2008-07-31 00:22+0800\n" +"POT-Creation-Date: 2008-07-31 01:18+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL...@li...>\n" @@ -117,6 +117,11 @@ msgid "Compares between" msgstr "" +#: pysvnmanager/controllers/logs.py:145 +#, python-format +msgid "Rollback to revision: %s" +msgstr "" + #: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" @@ -461,6 +466,7 @@ #: pysvnmanager/templates/logs/index.mako:5 #: pysvnmanager/templates/logs/index.mako:60 +#: pysvnmanager/templates/logs/view.mako:5 msgid "Administration logs" msgstr "" @@ -468,6 +474,14 @@ msgid "Compare revisions" msgstr "" +#: pysvnmanager/templates/logs/view.mako:16 +msgid "View history, revision" +msgstr "" + +#: pysvnmanager/templates/logs/view.mako:23 +msgid "Rollback to this revision" +msgstr "" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" Modified: trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-30 17:41:30 UTC (rev 36) @@ -11,7 +11,7 @@ "Project-Id-Version: pysvnmanager\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-31 00:24+0800\n" +"PO-Revision-Date: 2008-07-31 01:20+0800\n" "Last-Translator: Jiang Xin <wor...@gm...>\n" "Language-Team: <zh...@li...>\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\n" @@ -127,6 +127,11 @@ msgid "Compares between" msgstr "版本间比较" +#: pysvnmanager/controllers/logs.py:145 +#, python-format +msgid "Rollback to revision: %s" +msgstr "回滚至版本: %s" + #: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" @@ -492,6 +497,7 @@ #: pysvnmanager/templates/logs/index.mako:5 #: pysvnmanager/templates/logs/index.mako:60 +#: pysvnmanager/templates/logs/view.mako:5 msgid "Administration logs" msgstr "修改记录" @@ -499,6 +505,14 @@ msgid "Compare revisions" msgstr "版本比较" +#: pysvnmanager/templates/logs/view.mako:16 +msgid "View history, revision" +msgstr "查看历史, 版本" + +#: pysvnmanager/templates/logs/view.mako:23 +msgid "Rollback to this revision" +msgstr "回滚至此版本" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 17:41:30 UTC (rev 36) @@ -304,4 +304,9 @@ def differ(self, rev1="", rev2=""): return differ(self.__file, rev1, rev2) - \ No newline at end of file + + def restore(self, revision): + return restore(self.__file, revision) + + def backup(self, comment='', user=''): + return backup(self.__file, comment, user) \ No newline at end of file Added: trunk/pysvnmanager/templates/logs/view.mako =================================================================== --- trunk/pysvnmanager/templates/logs/view.mako (rev 0) +++ trunk/pysvnmanager/templates/logs/view.mako 2008-07-30 17:41:30 UTC (rev 36) @@ -0,0 +1,24 @@ +## -*- coding: utf-8 -*- +<%inherit file="/base.mako" /> + +<%def name="head_tags()"> + <title>${_("Administration logs")}</title> +</%def> + +<SCRIPT LANGUAGE="JavaScript"> +function rollback() +{ + +} + +</SCRIPT> + +<h2>${_("View history, revision")} ${c.log.get('revision')}</h2> + +<textarea cols="80" rows="24"> +${c.contents} +</textarea> + +<form name="main_form" action="${h.url_for(action='rollback')}"> +<input type="submit" name="submit" value='${_("Rollback to this revision")}'> +</form> \ No newline at end of file Property changes on: trunk/pysvnmanager/templates/logs/view.mako ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/pysvnmanager/tests/functional/test_authz.py =================================================================== --- trunk/pysvnmanager/tests/functional/test_authz.py 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/tests/functional/test_authz.py 2008-07-30 17:41:30 UTC (rev 36) @@ -13,8 +13,8 @@ # Login as common user self.login('nobody') res = self.app.get(url_for(controller='authz')) - assert res.status == 200 - assert 'Permission denied.' in res.body, res.body + assert res.status == 302 + self.assertEqual(res.header('location'), '/security/failed', res.header('location')) # Login as repos admin self.login('admin2') @@ -39,8 +39,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='authz', action='init_repos_list')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Login as superuser self.login('root') @@ -65,8 +65,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='authz', action='repos_changed')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Login as superuser self.login('root') @@ -106,8 +106,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='authz', action='path_changed')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') self.login('root') params = {'reposname':'/', 'path':u'/tags//'} @@ -152,8 +152,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='authz', action='save_authz')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Login as superuser self.login('root') @@ -315,13 +315,13 @@ # authn test res = self.app.get(url_for(controller='authz', action='delete_authz')) assert res.status == 302 - self.assertEqual(res.header('location'), '/security') + assert res.header('location')== '/security', res.header('location') # authz test self.login('nobody') res = self.app.get(url_for(controller='authz', action='delete_authz')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') authz = self.load_authz() module1 = authz.get_module('document', u'/trunk/行政部') Modified: trunk/pysvnmanager/tests/functional/test_check.py =================================================================== --- trunk/pysvnmanager/tests/functional/test_check.py 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/tests/functional/test_check.py 2008-07-30 17:41:30 UTC (rev 36) @@ -14,8 +14,8 @@ # Login as common user self.login('nobody') res = self.app.get(url_for(controller='check')) - assert res.status == 200 - assert 'Permission denied.' in res.body, res.body + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Login as repos admin self.login('admin1') @@ -44,8 +44,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='check', action='access_map')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Login as superuser self.login('root') @@ -205,20 +205,20 @@ 'abbr':'True', } res = self.app.get(url_for(controller='check', action='access_map'), params) - assert res.status == 200 - assert 'Permission denied.' in res.body, res.body + assert res.status == 200, res.status + assert res.body== 'Permission denied.', res.header('location') def test_authz_path(self): # authn test res = self.app.get(url_for(controller='check', action='get_auth_path')) assert res.status == 302 - self.assertEqual(res.header('location'), '/security') + assert res.header('location')== '/security', res.header('location') # authz test self.login('nobody') res = self.app.get(url_for(controller='check', action='get_auth_path')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') self.login('root') params = {} Modified: trunk/pysvnmanager/tests/functional/test_role.py =================================================================== --- trunk/pysvnmanager/tests/functional/test_role.py 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/tests/functional/test_role.py 2008-07-30 17:41:30 UTC (rev 36) @@ -14,14 +14,14 @@ # Login as common user self.login('nobody') res = self.app.get(url_for(controller='role')) - assert res.status == 200 - assert 'Permission denied.' in res.body, res.body + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Permission denied for repos admin(not root admin) self.login('admin2') res = self.app.get(url_for(controller='role')) - assert res.status == 200 - assert "Permission denied." in res.body, res.body + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Login as superuser self.login('root') @@ -38,8 +38,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='role', action='get_role_info')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Login as superuser self.login('root') @@ -113,8 +113,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='role', action='save_group')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Change group members, autodrop=no try: @@ -197,8 +197,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='role', action='delete_group')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Delete group failed, ref by other group. try: @@ -259,8 +259,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='role', action='save_alias')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Change alias successfully try: @@ -336,8 +336,8 @@ # authz test self.login('nobody') res = self.app.get(url_for(controller='role', action='delete_alias')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + assert res.status == 302, res.status + assert res.header('location')== '/security/failed', res.header('location') # Delete alias successfully try: Modified: trunk/pysvnmanager/tests/test_rcs_backup.py =================================================================== --- trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-30 16:27:12 UTC (rev 35) +++ trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-30 17:41:30 UTC (rev 36) @@ -175,7 +175,7 @@ assert rcslog.total_page == 2, rcslog.total_page rcslog.log_per_page=0 - assert rcslog.log_per_page==10, rcslog.log_per_page + assert rcslog.log_per_page>1, rcslog.log_per_page rcslog.log_per_page=5 assert rcslog.log_per_page==5, rcslog.log_per_page assert rcslog.total_page == 3, rcslog.total_page @@ -188,14 +188,14 @@ logs = rcslog.get_page_logs(2) assert [x['revision'] for x in logs] == \ - ['1.4', '1.5', '1.6', '1.7', '1.8', '1.14'], \ + ['1.5', '1.6', '1.7', '1.8', '1.9', '1.14'], \ [x['revision'] for x in logs] logs = rcslog.get_page_logs(3) logs2= rcslog.get_page_logs(30) assert logs == logs2 assert [x['revision'] for x in logs] == \ - ['1.1', '1.2', '1.3', '1.14'], \ + ['1.1', '1.2', '1.3', '1.4', '1.5', '1.14'], \ [x['revision'] for x in logs] buff = rcslog.differ('1.2','1.5') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 16:27:08
|
Revision: 35 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=35&view=rev Author: jiangx Date: 2008-07-30 16:27:12 +0000 (Wed, 30 Jul 2008) Log Message: ----------- compare revisions in logs page Modified Paths: -------------- trunk/pysvnmanager/controllers/logs.py trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/i18n/pysvnmanager.pot trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/templates/logs/index.mako Modified: trunk/pysvnmanager/controllers/logs.py =================================================================== --- trunk/pysvnmanager/controllers/logs.py 2008-07-30 15:44:12 UTC (rev 34) +++ trunk/pysvnmanager/controllers/logs.py 2008-07-30 16:27:12 UTC (rev 35) @@ -46,10 +46,13 @@ <th>%(who)s</th> <th>%(when)s</th> <th>%(why)s</th> + <th>%(comp)s</th> </tr>''' % {'rev': _("Rev"), 'who': _("Who"), 'when': _("When"), - 'why': _("Why"),} + 'why': _("Why"), + 'comp': _("Compare"), + } for i in range(len(logs)-1, -1, -1): buff += ''' @@ -58,10 +61,15 @@ <td>%(who)s</td> <td>%(when)s</td> <td>%(why)s</td> + <td> + <input type="radio" name="left" value="%(rev)s"> + <input type="radio" name="right" value="%(rev)s"> + </td> </tr>''' % {'rev' : logs[i].get('revision',''), 'who' : logs[i].get('author',''), 'when': logs[i].get('date',''), - 'why' : logs[i].get('log',''), } + 'why' : logs[i].get('log',''), + } buff += ''' </table></div> @@ -104,4 +112,24 @@ else: i+=1 - return buff \ No newline at end of file + return buff + + def compare(self): + d = request.params + left = d.get('left', '') + right = d.get('right', '') + if not left or not right: + return "" + if left == right: + return "" + + buff = '''<h2>%(title)s +<input type="radio" name="left" value="%(left)s">%(left)s +<input type="radio" name="right" value="%(right)s">%(right)s +</h2> +''' % {'title': _("Compares between"), + 'left' : left, + 'right': right} + + buff += "<pre>%s</pre>" % self.rcslog.differ(left, right) + return buff Modified: trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-30 15:44:12 UTC (rev 34) +++ trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-30 16:27:12 UTC (rev 35) @@ -9,7 +9,7 @@ "Project-Id-Version: pysvnmanager 0.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-30 23:27+0800\n" +"PO-Revision-Date: 2008-07-31 00:22+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: en <LL...@li...>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -96,26 +96,34 @@ msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/logs.py:49 +#: pysvnmanager/controllers/logs.py:50 msgid "Rev" msgstr "" -#: pysvnmanager/controllers/logs.py:50 +#: pysvnmanager/controllers/logs.py:51 msgid "Who" msgstr "" -#: pysvnmanager/controllers/logs.py:51 +#: pysvnmanager/controllers/logs.py:52 msgid "When" msgstr "" -#: pysvnmanager/controllers/logs.py:52 +#: pysvnmanager/controllers/logs.py:53 msgid "Why" msgstr "" -#: pysvnmanager/controllers/logs.py:86 +#: pysvnmanager/controllers/logs.py:54 +msgid "Compare" +msgstr "" + +#: pysvnmanager/controllers/logs.py:94 msgid "Page: " msgstr "" +#: pysvnmanager/controllers/logs.py:130 +msgid "Compares between" +msgstr "" + #: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" @@ -460,10 +468,14 @@ msgstr "" #: pysvnmanager/templates/logs/index.mako:5 -#: pysvnmanager/templates/logs/index.mako:26 +#: pysvnmanager/templates/logs/index.mako:60 msgid "Administration logs" msgstr "" +#: pysvnmanager/templates/logs/index.mako:66 +msgid "Compare revisions" +msgstr "" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" Modified: trunk/pysvnmanager/i18n/pysvnmanager.pot =================================================================== --- trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-30 15:44:12 UTC (rev 34) +++ trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-30 16:27:12 UTC (rev 35) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pySvnManager 0.1.2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2008-07-30 23:27+0800\n" +"POT-Creation-Date: 2008-07-31 00:22+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL...@li...>\n" @@ -89,26 +89,34 @@ msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/logs.py:49 +#: pysvnmanager/controllers/logs.py:50 msgid "Rev" msgstr "" -#: pysvnmanager/controllers/logs.py:50 +#: pysvnmanager/controllers/logs.py:51 msgid "Who" msgstr "" -#: pysvnmanager/controllers/logs.py:51 +#: pysvnmanager/controllers/logs.py:52 msgid "When" msgstr "" -#: pysvnmanager/controllers/logs.py:52 +#: pysvnmanager/controllers/logs.py:53 msgid "Why" msgstr "" -#: pysvnmanager/controllers/logs.py:86 +#: pysvnmanager/controllers/logs.py:54 +msgid "Compare" +msgstr "" + +#: pysvnmanager/controllers/logs.py:94 msgid "Page: " msgstr "" +#: pysvnmanager/controllers/logs.py:130 +msgid "Compares between" +msgstr "" + #: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" @@ -452,10 +460,14 @@ msgstr "" #: pysvnmanager/templates/logs/index.mako:5 -#: pysvnmanager/templates/logs/index.mako:26 +#: pysvnmanager/templates/logs/index.mako:60 msgid "Administration logs" msgstr "" +#: pysvnmanager/templates/logs/index.mako:66 +msgid "Compare revisions" +msgstr "" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" Modified: trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-30 15:44:12 UTC (rev 34) +++ trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-30 16:27:12 UTC (rev 35) @@ -11,7 +11,7 @@ "Project-Id-Version: pysvnmanager\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-30 23:29+0800\n" +"PO-Revision-Date: 2008-07-31 00:24+0800\n" "Last-Translator: Jiang Xin <wor...@gm...>\n" "Language-Team: <zh...@li...>\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\n" @@ -99,26 +99,34 @@ msgid "Permission denied." msgstr "没有权限。" -#: pysvnmanager/controllers/logs.py:49 +#: pysvnmanager/controllers/logs.py:50 msgid "Rev" msgstr "版本" -#: pysvnmanager/controllers/logs.py:50 +#: pysvnmanager/controllers/logs.py:51 msgid "Who" msgstr "管理员" -#: pysvnmanager/controllers/logs.py:51 +#: pysvnmanager/controllers/logs.py:52 msgid "When" msgstr "时间" -#: pysvnmanager/controllers/logs.py:52 +#: pysvnmanager/controllers/logs.py:53 msgid "Why" msgstr "说明" -#: pysvnmanager/controllers/logs.py:86 +#: pysvnmanager/controllers/logs.py:54 +msgid "Compare" +msgstr "比较" + +#: pysvnmanager/controllers/logs.py:94 msgid "Page: " msgstr "页面: " +#: pysvnmanager/controllers/logs.py:130 +msgid "Compares between" +msgstr "版本间比较" + #: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" @@ -483,11 +491,14 @@ msgstr "口令:" #: pysvnmanager/templates/logs/index.mako:5 -#: pysvnmanager/templates/logs/index.mako:26 -#| msgid "Administrators:" +#: pysvnmanager/templates/logs/index.mako:60 msgid "Administration logs" msgstr "修改记录" +#: pysvnmanager/templates/logs/index.mako:66 +msgid "Compare revisions" +msgstr "版本比较" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" Modified: trunk/pysvnmanager/templates/logs/index.mako =================================================================== --- trunk/pysvnmanager/templates/logs/index.mako 2008-07-30 15:44:12 UTC (rev 34) +++ trunk/pysvnmanager/templates/logs/index.mako 2008-07-30 16:27:12 UTC (rev 35) @@ -21,11 +21,50 @@ parameters:params}); } +function get_selected_radio(radio) +{ + for (var i = 0; i<radio.length; i++) + { + if (radio[i].checked) + { + return i; + } + } +} + +function get_selected_radio_value(radio) +{ + i = get_selected_radio(radio) + return radio[i].value +} + +function compare(form) +{ + left = get_selected_radio_value(document.main_form.left) + right = get_selected_radio_value(document.main_form.right) + showNoticesPopup(); + var params = {left:left, right:right}; + new Ajax.Updater( + {success:'compare',failure:'compare'}, + '${h.url_for(action="compare")}', + {asynchronous:true, evalScripts:true, method:'post', + onComplete: + function(request) + {hideNoticesPopup(); + new Effect.Highlight("compare",{duration:1});}, + parameters:params}); + +} </SCRIPT> <h2>${_("Administration logs")}</h2> +<form name="main_form" onSubmit="compare(); return false;"> <div id="logs"> ${c.display} </div> +<input type="submit" name="submit" value='${_("Compare revisions")}'> +<div id="compare"></div> + +</form> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 15:44:05
|
Revision: 34 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=34&view=rev Author: jiangx Date: 2008-07-30 15:44:12 +0000 (Wed, 30 Jul 2008) Log Message: ----------- New paginate strategy; add log_per_page to config file Modified Paths: -------------- trunk/pysvnmanager/config/DefaultConfig.py trunk/pysvnmanager/controllers/logs.py trunk/pysvnmanager/model/rcsbackup.py Modified: trunk/pysvnmanager/config/DefaultConfig.py =================================================================== --- trunk/pysvnmanager/config/DefaultConfig.py 2008-07-30 15:42:52 UTC (rev 33) +++ trunk/pysvnmanager/config/DefaultConfig.py 2008-07-30 15:44:12 UTC (rev 34) @@ -16,6 +16,9 @@ # You can change authz_file in <deploy>.ini file. authz_file = config.get('authz_file', "") % {'here': config.get('here')} + # Numbers of logs in each page. + log_per_page = 10 + # pysvnmanager authentication method. # You can use htpasswd_login, or ldap_login, or both. # You can also implement your own auth module. Modified: trunk/pysvnmanager/controllers/logs.py =================================================================== --- trunk/pysvnmanager/controllers/logs.py 2008-07-30 15:42:52 UTC (rev 33) +++ trunk/pysvnmanager/controllers/logs.py 2008-07-30 15:44:12 UTC (rev 34) @@ -14,7 +14,7 @@ self.login_as = session.get('user') self.rcslog = _rcs.RcsLog(cfg.authz_file) # Default logs per page is 10 - self.rcslog.log_per_page = 1 + self.rcslog.log_per_page = cfg.log_per_page def __before__(self, action): super(LogsController, self).__before__(action) Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 15:42:52 UTC (rev 33) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 15:44:12 UTC (rev 34) @@ -144,7 +144,8 @@ count = 1 else: # show last record on every page. - count = int( math.ceil( (self.__total -1 ) / self.__log_per_page ) ) + #count = int( math.ceil( (self.__total -1 ) / self.__log_per_page ) ) + count = int( math.ceil( (self.__total -2 ) / (self.__log_per_page - 1) ) ) return count @@ -170,8 +171,8 @@ def __set_log_per_page(self, count): count = int(count) - if count <=0: - count = 10 + if count < 2: + count = 2 self.__log_per_page = count log_per_page = property(__get_log_per_page, __set_log_per_page) @@ -215,7 +216,7 @@ heads = self.__head.rsplit('.',1) rev0=int(heads[1]) - rev2 = rev0 - ((pagenum-1) * self.__log_per_page) -1 + rev2 = rev0 - ((pagenum-1) * (self.__log_per_page-1)) -1 if rev2<1: rev2=1 rev1 = rev2 - self.__log_per_page + 1 if rev1<1: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 15:42:46
|
Revision: 33 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=33&view=rev Author: jiangx Date: 2008-07-30 15:42:52 +0000 (Wed, 30 Jul 2008) Log Message: ----------- chinese i18n for logs Modified Paths: -------------- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/i18n/pysvnmanager.pot trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po Modified: trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-30 15:05:05 UTC (rev 32) +++ trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-30 15:42:52 UTC (rev 33) @@ -9,7 +9,7 @@ "Project-Id-Version: pysvnmanager 0.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-29 17:27+0800\n" +"PO-Revision-Date: 2008-07-30 23:27+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: en <LL...@li...>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -18,26 +18,26 @@ "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.2\n" -#: pysvnmanager/controllers/authz.py:31 +#: pysvnmanager/controllers/authz.py:29 #: pysvnmanager/templates/authz/index.mako:159 #: pysvnmanager/templates/check/index.mako:10 msgid "All users(with anon)" msgstr "" -#: pysvnmanager/controllers/authz.py:32 +#: pysvnmanager/controllers/authz.py:30 #: pysvnmanager/templates/authz/index.mako:161 #: pysvnmanager/templates/check/index.mako:11 msgid "Known users" msgstr "" -#: pysvnmanager/controllers/authz.py:33 +#: pysvnmanager/controllers/authz.py:31 #: pysvnmanager/templates/authz/index.mako:163 #: pysvnmanager/templates/check/index.mako:12 msgid "Anonymous" msgstr "" -#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:57 -#: pysvnmanager/controllers/role.py:77 +#: pysvnmanager/controllers/authz.py:36 pysvnmanager/controllers/role.py:50 +#: pysvnmanager/controllers/role.py:70 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 @@ -47,8 +47,8 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 -#: pysvnmanager/controllers/role.py:79 +#: pysvnmanager/controllers/authz.py:39 pysvnmanager/controllers/role.py:55 +#: pysvnmanager/controllers/role.py:72 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 @@ -58,8 +58,8 @@ msgid "Alias:" msgstr "" -#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 -#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:50 +#: pysvnmanager/controllers/authz.py:54 pysvnmanager/controllers/authz.py:74 +#: pysvnmanager/controllers/check.py:83 pysvnmanager/controllers/role.py:43 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -67,51 +67,71 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:149 +#: pysvnmanager/controllers/authz.py:135 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:158 +#: pysvnmanager/controllers/authz.py:144 #, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:166 +#: pysvnmanager/controllers/authz.py:152 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:172 +#: pysvnmanager/controllers/authz.py:158 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:200 +#: pysvnmanager/controllers/authz.py:183 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/check.py:68 +#: pysvnmanager/controllers/check.py:63 #: pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/role.py:113 +#: pysvnmanager/controllers/logs.py:49 +msgid "Rev" +msgstr "" + +#: pysvnmanager/controllers/logs.py:50 +msgid "Who" +msgstr "" + +#: pysvnmanager/controllers/logs.py:51 +msgid "When" +msgstr "" + +#: pysvnmanager/controllers/logs.py:52 +msgid "Why" +msgstr "" + +#: pysvnmanager/controllers/logs.py:86 +msgid "Page: " +msgstr "" + +#: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:136 +#: pysvnmanager/controllers/role.py:123 #, python-format msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:161 +#: pysvnmanager/controllers/role.py:145 #, python-format msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:184 +#: pysvnmanager/controllers/role.py:165 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -247,7 +267,11 @@ msgid "ACL management" msgstr "" -#: pysvnmanager/templates/base.mako:92 +#: pysvnmanager/templates/base.mako:91 +msgid "Logs" +msgstr "" + +#: pysvnmanager/templates/base.mako:93 msgid "Logout" msgstr "" @@ -435,6 +459,11 @@ msgid "Password:" msgstr "" +#: pysvnmanager/templates/logs/index.mako:5 +#: pysvnmanager/templates/logs/index.mako:26 +msgid "Administration logs" +msgstr "" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" @@ -516,18 +545,3 @@ msgid "User name:" msgstr "" -#~ msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" -#~ msgstr "" - -#~ msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" -#~ msgstr "" - -#~ msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" -#~ msgstr "" - -#~ msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" -#~ msgstr "" - -#~ msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" -#~ msgstr "" - Modified: trunk/pysvnmanager/i18n/pysvnmanager.pot =================================================================== --- trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-30 15:05:05 UTC (rev 32) +++ trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-30 15:42:52 UTC (rev 33) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pySvnManager 0.1.2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2008-07-29 17:27+0800\n" +"POT-Creation-Date: 2008-07-30 23:27+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL...@li...>\n" @@ -17,23 +17,23 @@ "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.2\n" -#: pysvnmanager/controllers/authz.py:31 pysvnmanager/templates/authz/index.mako:159 +#: pysvnmanager/controllers/authz.py:29 pysvnmanager/templates/authz/index.mako:159 #: pysvnmanager/templates/check/index.mako:10 msgid "All users(with anon)" msgstr "" -#: pysvnmanager/controllers/authz.py:32 pysvnmanager/templates/authz/index.mako:161 +#: pysvnmanager/controllers/authz.py:30 pysvnmanager/templates/authz/index.mako:161 #: pysvnmanager/templates/check/index.mako:11 msgid "Known users" msgstr "" -#: pysvnmanager/controllers/authz.py:33 pysvnmanager/templates/authz/index.mako:163 +#: pysvnmanager/controllers/authz.py:31 pysvnmanager/templates/authz/index.mako:163 #: pysvnmanager/templates/check/index.mako:12 msgid "Anonymous" msgstr "" -#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:57 -#: pysvnmanager/controllers/role.py:77 pysvnmanager/templates/authz/index.mako:155 +#: pysvnmanager/controllers/authz.py:36 pysvnmanager/controllers/role.py:50 +#: pysvnmanager/controllers/role.py:70 pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 #: pysvnmanager/templates/role/index.mako:37 @@ -42,8 +42,8 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 -#: pysvnmanager/controllers/role.py:79 pysvnmanager/templates/authz/index.mako:157 +#: pysvnmanager/controllers/authz.py:39 pysvnmanager/controllers/role.py:55 +#: pysvnmanager/controllers/role.py:72 pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 #: pysvnmanager/templates/role/index.mako:42 @@ -52,8 +52,8 @@ msgid "Alias:" msgstr "" -#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 -#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:50 +#: pysvnmanager/controllers/authz.py:54 pysvnmanager/controllers/authz.py:74 +#: pysvnmanager/controllers/check.py:83 pysvnmanager/controllers/role.py:43 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -61,50 +61,70 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:149 +#: pysvnmanager/controllers/authz.py:135 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:158 +#: pysvnmanager/controllers/authz.py:144 #, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:166 +#: pysvnmanager/controllers/authz.py:152 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:172 +#: pysvnmanager/controllers/authz.py:158 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:200 +#: pysvnmanager/controllers/authz.py:183 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/check.py:68 pysvnmanager/templates/auth_failed.mako:3 +#: pysvnmanager/controllers/check.py:63 pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/role.py:113 +#: pysvnmanager/controllers/logs.py:49 +msgid "Rev" +msgstr "" + +#: pysvnmanager/controllers/logs.py:50 +msgid "Who" +msgstr "" + +#: pysvnmanager/controllers/logs.py:51 +msgid "When" +msgstr "" + +#: pysvnmanager/controllers/logs.py:52 +msgid "Why" +msgstr "" + +#: pysvnmanager/controllers/logs.py:86 +msgid "Page: " +msgstr "" + +#: pysvnmanager/controllers/role.py:103 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:136 +#: pysvnmanager/controllers/role.py:123 #, python-format msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:161 +#: pysvnmanager/controllers/role.py:145 #, python-format msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:184 +#: pysvnmanager/controllers/role.py:165 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -239,7 +259,11 @@ msgid "ACL management" msgstr "" -#: pysvnmanager/templates/base.mako:92 +#: pysvnmanager/templates/base.mako:91 +msgid "Logs" +msgstr "" + +#: pysvnmanager/templates/base.mako:93 msgid "Logout" msgstr "" @@ -427,6 +451,11 @@ msgid "Password:" msgstr "" +#: pysvnmanager/templates/logs/index.mako:5 +#: pysvnmanager/templates/logs/index.mako:26 +msgid "Administration logs" +msgstr "" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" Modified: trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-30 15:05:05 UTC (rev 32) +++ trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-30 15:42:52 UTC (rev 33) @@ -11,7 +11,7 @@ "Project-Id-Version: pysvnmanager\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-29 17:29+0800\n" +"PO-Revision-Date: 2008-07-30 23:29+0800\n" "Last-Translator: Jiang Xin <wor...@gm...>\n" "Language-Team: <zh...@li...>\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\n" @@ -21,26 +21,26 @@ "Generated-By: Babel 0.9.2\n" "X-Generator: KBabel 1.11.4\n" -#: pysvnmanager/controllers/authz.py:31 +#: pysvnmanager/controllers/authz.py:29 #: pysvnmanager/templates/authz/index.mako:159 #: pysvnmanager/templates/check/index.mako:10 msgid "All users(with anon)" msgstr "所有用户(含匿名)" -#: pysvnmanager/controllers/authz.py:32 +#: pysvnmanager/controllers/authz.py:30 #: pysvnmanager/templates/authz/index.mako:161 #: pysvnmanager/templates/check/index.mako:11 msgid "Known users" msgstr "注册用户" -#: pysvnmanager/controllers/authz.py:33 +#: pysvnmanager/controllers/authz.py:31 #: pysvnmanager/templates/authz/index.mako:163 #: pysvnmanager/templates/check/index.mako:12 msgid "Anonymous" msgstr "匿名用户" -#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:57 -#: pysvnmanager/controllers/role.py:77 +#: pysvnmanager/controllers/authz.py:36 pysvnmanager/controllers/role.py:50 +#: pysvnmanager/controllers/role.py:70 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 @@ -50,8 +50,8 @@ msgid "Group:" msgstr "团队:" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 -#: pysvnmanager/controllers/role.py:79 +#: pysvnmanager/controllers/authz.py:39 pysvnmanager/controllers/role.py:55 +#: pysvnmanager/controllers/role.py:72 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 @@ -61,8 +61,8 @@ msgid "Alias:" msgstr "别名:" -#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 -#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:50 +#: pysvnmanager/controllers/authz.py:54 pysvnmanager/controllers/authz.py:74 +#: pysvnmanager/controllers/check.py:83 pysvnmanager/controllers/role.py:43 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -70,56 +70,71 @@ msgid "Please choose..." msgstr "请选择..." -#: pysvnmanager/controllers/authz.py:149 +#: pysvnmanager/controllers/authz.py:135 #, python-format -#| msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgid "User %(user)s changed authz rules. (rev:%(rev)s)" msgstr "用户 %(user)s 修改了授权策略。(rev:%(rev)s)" -#: pysvnmanager/controllers/authz.py:158 +#: pysvnmanager/controllers/authz.py:144 #, python-format msgid "Repository %s not exist." msgstr "版本库 %s 不存在。" -#: pysvnmanager/controllers/authz.py:166 +#: pysvnmanager/controllers/authz.py:152 #, python-format msgid "Module %s not exist." msgstr "模组 %s 不存在。" -#: pysvnmanager/controllers/authz.py:172 +#: pysvnmanager/controllers/authz.py:158 msgid "You can not delete yourself from admin list." msgstr "您不能将自己从管理员列表中删除。" -#: pysvnmanager/controllers/authz.py:200 +#: pysvnmanager/controllers/authz.py:183 #, python-format -#| msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgid "User %(user)s delete authz rules. (rev:%(rev)s)" msgstr "用户 %(user)s 删除了授权策略。(rev:%(rev)s)" -#: pysvnmanager/controllers/check.py:68 +#: pysvnmanager/controllers/check.py:63 #: pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "没有权限。" -#: pysvnmanager/controllers/role.py:113 +#: pysvnmanager/controllers/logs.py:49 +msgid "Rev" +msgstr "版本" + +#: pysvnmanager/controllers/logs.py:50 +msgid "Who" +msgstr "管理员" + +#: pysvnmanager/controllers/logs.py:51 +msgid "When" +msgstr "时间" + +#: pysvnmanager/controllers/logs.py:52 +msgid "Why" +msgstr "说明" + +#: pysvnmanager/controllers/logs.py:86 +msgid "Page: " +msgstr "页面: " + +#: pysvnmanager/controllers/role.py:103 #, python-format -#| msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" msgstr "用户 %(user)s 修改用户组: %(grp)s。(rev:%(rev)s)" -#: pysvnmanager/controllers/role.py:136 +#: pysvnmanager/controllers/role.py:123 #, python-format -#| msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s)" msgstr "用户 %(user)s 删除用户组: %(grp)s。(rev:%(rev)s)" -#: pysvnmanager/controllers/role.py:161 +#: pysvnmanager/controllers/role.py:145 #, python-format -#| msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s)" msgstr "用户 %(user)s 修改别名: %(alias)s。(rev:%(rev)s)" -#: pysvnmanager/controllers/role.py:184 +#: pysvnmanager/controllers/role.py:165 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 删除别名: %(alias)s。(rev:%(rev)s,%(msg)s)" @@ -275,7 +290,11 @@ msgid "ACL management" msgstr "权限控制" -#: pysvnmanager/templates/base.mako:92 +#: pysvnmanager/templates/base.mako:91 +msgid "Logs" +msgstr "日志" + +#: pysvnmanager/templates/base.mako:93 msgid "Logout" msgstr "登出" @@ -463,6 +482,12 @@ msgid "Password:" msgstr "口令:" +#: pysvnmanager/templates/logs/index.mako:5 +#: pysvnmanager/templates/logs/index.mako:26 +#| msgid "Administrators:" +msgid "Administration logs" +msgstr "修改记录" + #: pysvnmanager/templates/role/index.mako:5 #: pysvnmanager/templates/role/index.mako:638 msgid "Role Management" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 15:05:01
|
Revision: 32 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=32&view=rev Author: jiangx Date: 2008-07-30 15:05:05 +0000 (Wed, 30 Jul 2008) Log Message: ----------- Use Controller's __before__ method to check authz. Controller's __before__ call BaseClass's __before__ at the begining. Modified Paths: -------------- trunk/pysvnmanager/controllers/authz.py trunk/pysvnmanager/controllers/check.py trunk/pysvnmanager/controllers/logs.py trunk/pysvnmanager/controllers/role.py trunk/pysvnmanager/controllers/security.py trunk/pysvnmanager/templates/logs/index.mako Modified: trunk/pysvnmanager/controllers/authz.py =================================================================== --- trunk/pysvnmanager/controllers/authz.py 2008-07-30 11:04:34 UTC (rev 31) +++ trunk/pysvnmanager/controllers/authz.py 2008-07-30 15:05:05 UTC (rev 32) @@ -16,16 +16,12 @@ self.authz.login_as = self.login_as self.reposlist = self.authz.get_manageable_repos_list(self.login_as) - def __auth_failed(self): + def __before__(self, action): + super(AuthzController, self).__before__(action) if not self.reposlist: - return True - else: - return False + return redirect_to(h.url_for(controller='security', action='failed')) def index(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - c.revision = self.authz.version c.reposlist = self.reposlist @@ -50,9 +46,6 @@ return render('/authz/index.mako') def init_repos_list(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - total = 0; msg = '' @@ -69,9 +62,6 @@ return msg def repos_changed(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - total = 0; msg = '' d = request.params @@ -94,9 +84,6 @@ return msg def path_changed(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - total = 0; msg = '' @@ -120,9 +107,6 @@ return msg def save_authz(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - d = request.params member_list = [] @@ -187,9 +171,6 @@ return msg def delete_authz(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - d = request.params member_list = [] Modified: trunk/pysvnmanager/controllers/check.py =================================================================== --- trunk/pysvnmanager/controllers/check.py 2008-07-30 11:04:34 UTC (rev 31) +++ trunk/pysvnmanager/controllers/check.py 2008-07-30 15:05:05 UTC (rev 32) @@ -16,16 +16,12 @@ self.authz.login_as = self.login_as self.reposlist = self.authz.get_manageable_repos_list(self.login_as) - def __authz_failed(self): + def __before__(self, action): + super(CheckController, self).__before__(action) if not self.reposlist: - return True - else: - return False - + return redirect_to(h.url_for(controller='security', action='failed')) + def index(self): - if self.__authz_failed(): - return render('/auth_failed.mako') - c.reposlist = self.reposlist c.userlist = map(lambda x:x.uname, self.authz.grouplist) c.userlist.extend(map(lambda x:x.uname, self.authz.aliaslist)) @@ -34,9 +30,6 @@ return render('/check/index.mako') def access_map(self): - if self.__authz_failed(): - return render('/auth_failed.mako') - msg = "" d = request.params @@ -77,9 +70,6 @@ return msg def get_auth_path(self, repos=None, type=None, path=None): - if self.__authz_failed(): - return render('/auth_failed.mako') - total = 0; msg = '' d = request.params Modified: trunk/pysvnmanager/controllers/logs.py =================================================================== --- trunk/pysvnmanager/controllers/logs.py 2008-07-30 11:04:34 UTC (rev 31) +++ trunk/pysvnmanager/controllers/logs.py 2008-07-30 15:05:05 UTC (rev 32) @@ -14,25 +14,18 @@ self.login_as = session.get('user') self.rcslog = _rcs.RcsLog(cfg.authz_file) # Default logs per page is 10 - #self.rcslog.log_per_page = 10 - - def __auth_failed(self): - if self.authz.is_super_user(self.login_as): - return False - else: - return True + self.rcslog.log_per_page = 1 + def __before__(self, action): + super(LogsController, self).__before__(action) + if not self.authz.is_super_user(self.login_as): + return redirect_to(h.url_for(controller='security', action='failed')) + def index(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - c.display = self.__get_log_display(1) return render('/logs/index.mako') def paginate(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - d = request.params page = int(d.get('page', '1')) return self.__get_log_display(page) @@ -44,8 +37,9 @@ return "" paginate = self.__get_paginate(current) - buff = '<span>%s</span>' % paginate + buff = '<div>%s</div>' % paginate buff +=''' +<div> <table> <tr> <th>%(rev)s</th> @@ -70,8 +64,8 @@ 'why' : logs[i].get('log',''), } buff += ''' -<span>%s</span> -</table>''' % paginate +</table></div> +<div>%s</div>''' % paginate return buff @@ -90,16 +84,24 @@ sep = " " buff = _("Page: ") - for i in range(1, total_page+1): + + i=1 + while True: + if i > total_page: + break if i == current: buff += '%d%s' % (i, sep) + i+=1 elif i == 1 or i == total_page or i == current-1 or i == current+1: buff += '%s%s' % (link(i), sep) + i+=1 elif i < current-1: - buff += '...' + buff += '...%s' % sep i = current-1 elif i > current+1: - buff += '...' + buff += '...%s' % sep i = total_page + else: + i+=1 return buff \ No newline at end of file Modified: trunk/pysvnmanager/controllers/role.py =================================================================== --- trunk/pysvnmanager/controllers/role.py 2008-07-30 11:04:34 UTC (rev 31) +++ trunk/pysvnmanager/controllers/role.py 2008-07-30 15:05:05 UTC (rev 32) @@ -18,16 +18,12 @@ self.userlist = map(lambda x:x.uname, self.authz.userlist) self.grouplist = map(lambda x:x.uname, self.authz.grouplist) - def __auth_failed(self): - if self.authz.is_super_user(self.login_as): - return False - else: - return True + def __before__(self, action): + super(RoleController, self).__before__(action) + if not self.authz.is_super_user(self.login_as): + return redirect_to(h.url_for(controller='security', action='failed')) def index(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - c.revision = self.authz.version c.aliaslist = self.aliaslist c.userlist = self.userlist @@ -35,9 +31,6 @@ return render('/role/index.mako') def get_role_info(self, role=None): - if self.__auth_failed(): - return render('/auth_failed.mako') - members_count = 0; msg = '' if not role: @@ -91,9 +84,6 @@ return msg def save_group(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - d = request.params member_list = [] msg = "" @@ -125,9 +115,6 @@ return msg def delete_group(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - d = request.params rolename = d.get('role') revision = d.get('revision', self.authz.version) @@ -149,9 +136,6 @@ return msg def save_alias(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - d = request.params aliasname = d.get('aliasname') username = d.get('username') @@ -173,9 +157,6 @@ return msg def delete_alias(self): - if self.__auth_failed(): - return render('/auth_failed.mako') - d = request.params aliasname = d.get('aliasname') revision = d.get('revision', self.authz.version) Modified: trunk/pysvnmanager/controllers/security.py =================================================================== --- trunk/pysvnmanager/controllers/security.py 2008-07-30 11:04:34 UTC (rev 31) +++ trunk/pysvnmanager/controllers/security.py 2008-07-30 15:05:05 UTC (rev 32) @@ -54,3 +54,6 @@ del session['user'] session.save() redirect_to(h.url_for(controller="security")) + + def failed(self): + return render('/auth_failed.mako') \ No newline at end of file Modified: trunk/pysvnmanager/templates/logs/index.mako =================================================================== --- trunk/pysvnmanager/templates/logs/index.mako 2008-07-30 11:04:34 UTC (rev 31) +++ trunk/pysvnmanager/templates/logs/index.mako 2008-07-30 15:05:05 UTC (rev 32) @@ -16,7 +16,8 @@ {asynchronous:true, evalScripts:true, method:'post', onComplete: function(request) - {hideNoticesPopup();}, + {hideNoticesPopup(); + new Effect.Highlight("logs",{duration:1});}, parameters:params}); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 11:04:27
|
Revision: 31 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=31&view=rev Author: jiangx Date: 2008-07-30 11:04:34 +0000 (Wed, 30 Jul 2008) Log Message: ----------- add logs controller to display logs Modified Paths: -------------- trunk/pysvnmanager/model/rcsbackup.py trunk/pysvnmanager/templates/base.mako Added Paths: ----------- trunk/pysvnmanager/controllers/logs.py trunk/pysvnmanager/templates/logs/ trunk/pysvnmanager/templates/logs/index.mako trunk/pysvnmanager/tests/functional/test_logs.py Added: trunk/pysvnmanager/controllers/logs.py =================================================================== --- trunk/pysvnmanager/controllers/logs.py (rev 0) +++ trunk/pysvnmanager/controllers/logs.py 2008-07-30 11:04:34 UTC (rev 31) @@ -0,0 +1,105 @@ +import logging + +from pysvnmanager.lib.base import * +from pysvnmanager.model import rcsbackup as _rcs +from pysvnmanager.model.svnauthz import * + +log = logging.getLogger(__name__) + +class LogsController(BaseController): + requires_auth = True + + def __init__(self): + self.authz = SvnAuthz(cfg.authz_file) + self.login_as = session.get('user') + self.rcslog = _rcs.RcsLog(cfg.authz_file) + # Default logs per page is 10 + #self.rcslog.log_per_page = 10 + + def __auth_failed(self): + if self.authz.is_super_user(self.login_as): + return False + else: + return True + + def index(self): + if self.__auth_failed(): + return render('/auth_failed.mako') + + c.display = self.__get_log_display(1) + return render('/logs/index.mako') + + def paginate(self): + if self.__auth_failed(): + return render('/auth_failed.mako') + + d = request.params + page = int(d.get('page', '1')) + return self.__get_log_display(page) + + + def __get_log_display(self, current=1): + logs = self.rcslog.get_page_logs(current) + if not logs: + return "" + paginate = self.__get_paginate(current) + + buff = '<span>%s</span>' % paginate + buff +=''' +<table> +<tr> + <th>%(rev)s</th> + <th>%(who)s</th> + <th>%(when)s</th> + <th>%(why)s</th> +</tr>''' % {'rev': _("Rev"), + 'who': _("Who"), + 'when': _("When"), + 'why': _("Why"),} + + for i in range(len(logs)-1, -1, -1): + buff += ''' +<tr> + <td>%(rev)s</t> + <td>%(who)s</td> + <td>%(when)s</td> + <td>%(why)s</td> +</tr>''' % {'rev' : logs[i].get('revision',''), + 'who' : logs[i].get('author',''), + 'when': logs[i].get('date',''), + 'why' : logs[i].get('log',''), } + + buff += ''' +<span>%s</span> +</table>''' % paginate + + return buff + + def __get_paginate(self, current=1): + def link(i): + return '<a href="#" onclick="paginate(%d)">%d</a>' % (i,i) + + total_page = self.rcslog.total_page + if total_page < 2: + return "" + + if current < 1: + current = 1 + if current > total_page: + current = total_page + + sep = " " + buff = _("Page: ") + for i in range(1, total_page+1): + if i == current: + buff += '%d%s' % (i, sep) + elif i == 1 or i == total_page or i == current-1 or i == current+1: + buff += '%s%s' % (link(i), sep) + elif i < current-1: + buff += '...' + i = current-1 + elif i > current+1: + buff += '...' + i = total_page + + return buff \ No newline at end of file Property changes on: trunk/pysvnmanager/controllers/logs.py ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 09:11:05 UTC (rev 30) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 11:04:34 UTC (rev 31) @@ -138,7 +138,15 @@ self.reload() def __get_page_count(self): - return int(math.ceil(self.__total/self.__log_per_page)) + if self.__total == 0: + count = 0 + elif self.__total == 1: + count = 1 + else: + # show last record on every page. + count = int( math.ceil( (self.__total -1 ) / self.__log_per_page ) ) + + return count total_page = property(__get_page_count) Modified: trunk/pysvnmanager/templates/base.mako =================================================================== --- trunk/pysvnmanager/templates/base.mako 2008-07-30 09:11:05 UTC (rev 30) +++ trunk/pysvnmanager/templates/base.mako 2008-07-30 11:04:34 UTC (rev 31) @@ -88,6 +88,7 @@ <td>${h.link_to(_("Check permissions"), h.url(controller="check"))}</td> <td>${h.link_to(_("Role management"), h.url(controller="role"))}</td> <td>${h.link_to(_("ACL management"), h.url(controller="authz"))}</td> + <td>${h.link_to(_("Logs"), h.url(controller="logs"))}</td> <td>welcome ${session.get('user')}</td> <td>${h.link_to(_("Logout"), h.url(controller="logout"))}</td> </tr> Added: trunk/pysvnmanager/templates/logs/index.mako =================================================================== --- trunk/pysvnmanager/templates/logs/index.mako (rev 0) +++ trunk/pysvnmanager/templates/logs/index.mako 2008-07-30 11:04:34 UTC (rev 31) @@ -0,0 +1,30 @@ +## -*- coding: utf-8 -*- +<%inherit file="/base.mako" /> + +<%def name="head_tags()"> + <title>${_("Administration logs")}</title> +</%def> + +<SCRIPT LANGUAGE="JavaScript"> +function paginate(num) +{ + showNoticesPopup(); + var params = {page:num}; + new Ajax.Updater( + {success:'logs',failure:'logs'}, + '${h.url_for(action="paginate")}', + {asynchronous:true, evalScripts:true, method:'post', + onComplete: + function(request) + {hideNoticesPopup();}, + parameters:params}); +} + +</SCRIPT> + +<h2>${_("Administration logs")}</h2> + +<div id="logs"> +${c.display} +</div> + Property changes on: trunk/pysvnmanager/templates/logs/index.mako ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/pysvnmanager/tests/functional/test_logs.py =================================================================== --- trunk/pysvnmanager/tests/functional/test_logs.py (rev 0) +++ trunk/pysvnmanager/tests/functional/test_logs.py 2008-07-30 11:04:34 UTC (rev 31) @@ -0,0 +1,7 @@ +from pysvnmanager.tests import * + +class TestLogsController(TestController): + + def test_index(self): + response = self.app.get(url_for(controller='logs')) + # Test response... Property changes on: trunk/pysvnmanager/tests/functional/test_logs.py ___________________________________________________________________ Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 09:10:56
|
Revision: 30 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=30&view=rev Author: jiangx Date: 2008-07-30 09:11:05 +0000 (Wed, 30 Jul 2008) Log Message: ----------- add cat, differ function Modified Paths: -------------- trunk/pysvnmanager/model/rcsbackup.py trunk/pysvnmanager/tests/test_rcs_backup.py Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 08:18:37 UTC (rev 29) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 09:11:05 UTC (rev 30) @@ -61,15 +61,15 @@ cmd = [] if not is_rcs_exist(wcfile): # -l : lock mode, make wcfile writable - cmd.append('%(cmd)s -i -q -l -t-"%(msg)s" -w"%(user)s" %(file)s 2>&1' % \ + cmd.append('%(cmd)s -i -q -l -t-"%(msg)s" -w"%(user)s" "%(file)s" 2>&1' % \ {'cmd':CMD_CI, "file":wcfile, "msg":comment, "user":user}) # -U : set locking to no-strict. - cmd.append('%(cmd)s -U -q %(file)s' % {'cmd':CMD_RCS, "file":wcfile}) + cmd.append('%(cmd)s -U -q "%(file)s"' % {'cmd':CMD_RCS, "file":wcfile}) else: # Warning: w/o -l or -u option, wcfile will be removed after checkin. # -l makes wcfile writable; # -u : wcfile is not writable unless rcsfile is set to no-strict locking. - cmd.append('%(cmd)s -q -l -m"%(msg)s" -w"%(user)s" %(file)s 2>&1' % \ + cmd.append('%(cmd)s -q -l -m"%(msg)s" -w"%(user)s" "%(file)s" 2>&1' % \ {'cmd':CMD_CI, "file":wcfile, "msg":comment, "user":user}) for i in cmd: @@ -91,12 +91,37 @@ # unlock wcfile is readonly, unless no-strict mode is set. opts = "-u%s" % revision - cmd = "%(cmd)s %(opts)s -q -f %(file)s 2>&1" % {'cmd':CMD_CO, "opts":opts, "file":wcfile } + cmd = '%(cmd)s %(opts)s -q -f "%(file)s" 2>&1' % {'cmd':CMD_CO, "opts":opts, "file":wcfile } buff = os.popen(cmd).read().strip() if buff: raise Exception, "Command: %s\nError Message: %s\n" % (cmd, buff) - + +def cat(wcfile, revision=""): + if not wcfile or not is_rcs_exist(wcfile): + return "" + opts = "-p" + if revision: + # -pRev : cat rather then checkout + opts = "-p%s" % revision + + cmd = '%(cmd)s %(opts)s -q "%(file)s"' % {'cmd':CMD_CO, "opts":opts, "file":wcfile } + buff = os.popen(cmd).read().strip() + return buff + +def differ(filename, rev1="", rev2=""): + filename=get_utf8(filename) + opts="" + if rev1 and rev2: + opts="-r%s -r%s" % (rev1, rev2) + elif rev1 or rev2: + opts="-r%s%s" % (rev1, rev2) + + cmd = '%(cmd)s %(opts)s -u -q "%(file)s"' % {'cmd':CMD_RCSDIFF, 'opts':opts, 'file':filename} + log.debug('Command: '+cmd) + buff = os.popen(cmd).read() + return buff + class RcsLog(object): def __init__(self, filename): @@ -144,7 +169,7 @@ log_per_page = property(__get_log_per_page, __set_log_per_page) def reload(self): - cmd = '%(cmd)s -L -h -N %(file)s' % {'cmd':CMD_RLOG, 'file':self.__file} + cmd = '%(cmd)s -L -h -N "%(file)s"' % {'cmd':CMD_RLOG, 'file':self.__file} buff = os.popen(cmd).read().strip() # RCS file: 1,v @@ -212,7 +237,7 @@ if rev3: opts="%s,%s" % (opts, rev3) - cmd = '%(cmd)s %(opts)s -L -N %(file)s' % {'cmd':CMD_RLOG, 'opts':opts, 'file':self.__file} + cmd = '%(cmd)s %(opts)s -L -N "%(file)s"' % {'cmd':CMD_RLOG, 'opts':opts, 'file':self.__file} log.debug('Command: '+cmd) buff = os.popen(cmd).read().strip().rstrip('=').rstrip() @@ -263,4 +288,11 @@ 'author':commit_author, 'log':commit_log}) - return self.revs \ No newline at end of file + return self.revs + + def cat(self, revision=""): + return cat(self.__file, revision) + + def differ(self, rev1="", rev2=""): + return differ(self.__file, rev1, rev2) + \ No newline at end of file Modified: trunk/pysvnmanager/tests/test_rcs_backup.py =================================================================== --- trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-30 08:18:37 UTC (rev 29) +++ trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-30 09:11:05 UTC (rev 30) @@ -44,7 +44,7 @@ f.write('RCS working copy file\n') f.write('='*20 + '\n') f.write('Revision: %d\n' % rev) - f.write('Date: %s\n' % time.strftime('%F %T')) + f.write('Date: %s\n' % time.strftime('%F')) f.close() def get_revision(self): @@ -198,12 +198,23 @@ ['1.1', '1.2', '1.3', '1.14'], \ [x['revision'] for x in logs] + buff = rcslog.differ('1.2','1.5') + assert "-Revision: 2\n+Revision: 5" in buff, buff + buff = rcslog.differ('1.13') + assert "-Revision: 13\n+Revision: 14" in buff, buff + buff = rcslog.cat() + assert "Revision: 14\n" in buff, buff + + buff = rcslog.cat('1.8') + assert "Revision: 8\n" in buff, buff + def testLogsNone(self): rcslog = rcs.RcsLog(self.wcfile) assert rcslog.rcsfile == "", rcslog.rcsfile assert rcslog.total == 0, rcslog.total assert rcslog.get_page_logs(1) == [], rcslog.get_page_logs(1) + assert rcslog.cat()=="" if __name__ == '__main__': import unittest This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 08:18:28
|
Revision: 29 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=29&view=rev Author: jiangx Date: 2008-07-30 08:18:37 +0000 (Wed, 30 Jul 2008) Log Message: ----------- add get_logs, get_page_logs method to RcsLog class Modified Paths: -------------- trunk/pysvnmanager/model/rcsbackup.py trunk/pysvnmanager/tests/test_rcs_backup.py Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 01:59:56 UTC (rev 28) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 08:18:37 UTC (rev 29) @@ -1,12 +1,16 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +from __future__ import division + import os +import sys +import re +import math import logging log = logging.getLogger(__name__) -import sys #reload(sys) # in Python2.5, method sys.setdefaultencoding #will be delete after initialize. we need reload it. #sys.setdefaultencoding('utf-8') @@ -14,6 +18,8 @@ CMD_CI="RCSINIT= ci" CMD_CO="RCSINIT= co" CMD_RCS="RCSINIT= rcs" +CMD_RLOG="RCSINIT= rlog" +CMD_RCSDIFF="RCSINIT= rcsdiff" def is_rcs_exist(wcfile): @@ -90,3 +96,171 @@ if buff: raise Exception, "Command: %s\nError Message: %s\n" % (cmd, buff) + +class RcsLog(object): + + def __init__(self, filename): + assert filename and isinstance(filename, basestring) + self.__file = filename + self.__log_per_page = 10 + self.p = {} + self.p['rcs'] = re.compile(r'^RCS file:\s*(.*)$', re.M) + self.p['head'] = re.compile(r'^head:\s*(.*)$', re.M) + self.p['total'] = re.compile(r'^total revisions:\s*(.*)$', re.M) + self.p['revision'] = re.compile(r'^revision\s+([^\s]*)', re.M) + self.p['date'] = re.compile(r'^date:\s+(.*);\s+author:', re.M) + self.p['author'] = re.compile(r'^date:.*;\s+author:\s*(.*?);', re.M) + self.reload() + + def __get_page_count(self): + return int(math.ceil(self.__total/self.__log_per_page)) + + total_page = property(__get_page_count) + + def __get_log_count(self): + return self.__total + + total = property(__get_log_count) + + def __get_rcsfile(self): + return self.__rcsfile + + rcsfile = property(__get_rcsfile) + + def __get_head(self): + return self.__head + + head = property(__get_head) + + def __get_log_per_page(self): + return self.__log_per_page + + def __set_log_per_page(self, count): + count = int(count) + if count <=0: + count = 10 + self.__log_per_page = count + + log_per_page = property(__get_log_per_page, __set_log_per_page) + + def reload(self): + cmd = '%(cmd)s -L -h -N %(file)s' % {'cmd':CMD_RLOG, 'file':self.__file} + buff = os.popen(cmd).read().strip() + + # RCS file: 1,v + m = self.p['rcs'].search(buff) + if m: + self.__rcsfile = m.group(1) + else: + self.__rcsfile = "" + + # head: 1.XX + m = self.p['head'].search(buff) + if m: + self.__head = m.group(1) + else: + self.__head = "" + + # total revisions: XX + m = self.p['total'].search(buff) + if m: + self.__total = int(m.group(1)) + else: + self.__total = 0 + + def get_page_logs(self, pagenum): + total_page = self.total_page + + if total_page ==0: + return [] + + if pagenum<=0: + pagenum=1 + elif pagenum>total_page: + pagenum=total_page + + heads = self.__head.rsplit('.',1) + rev0=int(heads[1]) + + rev2 = rev0 - ((pagenum-1) * self.__log_per_page) -1 + if rev2<1: rev2=1 + rev1 = rev2 - self.__log_per_page + 1 + if rev1<1: + rev1=1 + + rev0 = self.__head + rev1 = "%s.%d" % (heads[0], rev1) + rev2 = "%s.%d" % (heads[0], rev2) + + self.get_logs(rev1, rev2, rev0) + return self.revs + + def get_logs(self, rev1="", rev2="", rev3=""): + self.revs=[] + opts="" + if not rev1: + if not rev2: + opts="" + else: + opts="-r:%s" % rev2 + else: + if not rev2: + opts="-r%s:" % rev1 + else: + opts="-r%s:%s" % (rev1, rev2) + + if rev3: + opts="%s,%s" % (opts, rev3) + + cmd = '%(cmd)s %(opts)s -L -N %(file)s' % {'cmd':CMD_RLOG, 'opts':opts, 'file':self.__file} + log.debug('Command: '+cmd) + buff = os.popen(cmd).read().strip().rstrip('=').rstrip() + + while True: + pos = buff.rfind('\n'+'-'*28+'\n') + if pos==-1: + break + match = buff[pos+30:] + buff=buff[:pos] + + lines=match.split('\n') + if len(lines)<3: + log.error("wrong rcs format: %s" % match) + continue + + # revision 1.XX locked by: XXX; + m = self.p['revision'].search(lines[0]) + commit_revision = "" + if m: + commit_revision = m.group(1) + else: + log.error("not find revision in line: %s" % lines[1]) + continue + + # date: YYYY/MM/DD hh:mm:ss; author: XX; ... + m = self.p['date'].search(lines[1]) + commit_time = "" + if m: + commit_time = get_unicode(m.group(1)) + else: + log.error("not find date in line: %s" % lines[1]) + continue + + # date: YYYY/MM/DD hh:mm:ss; author: XX; ... + m = self.p['author'].search(lines[1]) + commit_author = "" + if m: + commit_author = get_unicode(eval("'%s'" % m.group(1))) + else: + log.error("not find author in line: %s" % lines[1]) + continue + + # logs... + commit_log = get_unicode('\n'.join(lines[2:])) + + self.revs.append({'revision':commit_revision, + 'date':commit_time, + 'author':commit_author, + 'log':commit_log}) + + return self.revs \ No newline at end of file Modified: trunk/pysvnmanager/tests/test_rcs_backup.py =================================================================== --- trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-30 01:59:56 UTC (rev 28) +++ trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-30 08:18:37 UTC (rev 29) @@ -121,11 +121,90 @@ pass def testLogs(self): - self.writefile() - assert os.access(self.wcfile, os.R_OK) - print "testLogs" - pass + for i in range(1,11): + # new file, backup to r1.1 + self.writefile(i) + rcs.backup(self.wcfile, comment="Test no. %d" % i, user="User1") + + rcslog = rcs.RcsLog(self.wcfile) + assert "rcstest.txt,v" in rcslog.rcsfile, rcslog.rcsfile + assert rcslog.head=='1.10', rcslog.head + assert rcslog.total==10, rcslog.total + for i in range(11,15): + # new file, backup to r1.1 + self.writefile(i) + rcs.backup(self.wcfile, comment="第 %d 次提交测试。" % i, user="蒋鑫") + + assert rcslog.head=='1.10', rcslog.head + rcslog.reload() + assert rcslog.head=='1.14', rcslog.head + assert rcslog.total==14, rcslog.total + + logs = rcslog.get_logs() + assert len(logs)==14, logs + assert logs[3]['revision'] == u'1.4', logs[3]['revision'] + assert logs[3]['author'] == u'User1', logs[3]['author'] + assert logs[3]['log'] == u'Test no. 4', logs[3]['log'] + assert logs[13]['revision'] == u'1.14', logs[13]['revision'] + assert logs[13]['author'] == u'蒋鑫', logs[13]['author'].encode('utf-8') + assert logs[13]['log'] == u'第 14 次提交测试。', logs[13]['log'].encode('utf-8') + + logs = rcslog.get_logs('1.9','1.12') + assert len(logs)==4, logs + assert logs[1]['revision'] == u'1.10', logs[1]['revision'] + assert logs[1]['author'] == u'User1', logs[1]['author'] + assert logs[1]['log'] == u'Test no. 10', logs[1]['log'] + assert logs[2]['revision'] == u'1.11', logs[2]['revision'] + assert logs[2]['author'] == u'蒋鑫', logs[2]['author'].encode('utf-8') + assert logs[2]['log'] == u'第 11 次提交测试。', logs[2]['log'].encode('utf-8') + + + logs = rcslog.get_logs('','1.12') + assert len(logs)==12, logs + assert logs[10]['revision'] == u'1.11', logs[10]['revision'] + + logs = rcslog.get_logs('1.12','') + assert len(logs)==3, len(logs) + assert logs[1]['revision'] == u'1.13', logs[1]['revision'] + + logs = rcslog.get_logs('1.7','1.11', '1.14') + assert len(logs)==6, len(logs) + assert logs[4]['revision'] == u'1.11', logs[1]['revision'] + assert logs[5]['revision'] == u'1.14', logs[1]['revision'] + + assert rcslog.total_page == 2, rcslog.total_page + rcslog.log_per_page=0 + assert rcslog.log_per_page==10, rcslog.log_per_page + rcslog.log_per_page=5 + assert rcslog.log_per_page==5, rcslog.log_per_page + assert rcslog.total_page == 3, rcslog.total_page + logs = rcslog.get_page_logs(1) + logs2= rcslog.get_page_logs(0) + assert logs == logs2 + assert [x['revision'] for x in logs] == \ + ['1.9', '1.10', '1.11', '1.12', '1.13', '1.14'], \ + [x['revision'] for x in logs] + + logs = rcslog.get_page_logs(2) + assert [x['revision'] for x in logs] == \ + ['1.4', '1.5', '1.6', '1.7', '1.8', '1.14'], \ + [x['revision'] for x in logs] + + logs = rcslog.get_page_logs(3) + logs2= rcslog.get_page_logs(30) + assert logs == logs2 + assert [x['revision'] for x in logs] == \ + ['1.1', '1.2', '1.3', '1.14'], \ + [x['revision'] for x in logs] + + + def testLogsNone(self): + rcslog = rcs.RcsLog(self.wcfile) + assert rcslog.rcsfile == "", rcslog.rcsfile + assert rcslog.total == 0, rcslog.total + assert rcslog.get_page_logs(1) == [], rcslog.get_page_logs(1) + if __name__ == '__main__': import unittest unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-30 01:59:46
|
Revision: 28 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=28&view=rev Author: jiangx Date: 2008-07-30 01:59:56 +0000 (Wed, 30 Jul 2008) Log Message: ----------- reset RCSINIT environment, or it may make something strange. Modified Paths: -------------- trunk/pysvnmanager/model/rcsbackup.py Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 16:34:38 UTC (rev 27) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-30 01:59:56 UTC (rev 28) @@ -11,6 +11,11 @@ #will be delete after initialize. we need reload it. #sys.setdefaultencoding('utf-8') +CMD_CI="RCSINIT= ci" +CMD_CO="RCSINIT= co" +CMD_RCS="RCSINIT= rcs" + + def is_rcs_exist(wcfile): wcpath = os.path.dirname(os.path.abspath(wcfile)) if os.path.isdir(wcpath+'/RCS'): @@ -49,12 +54,17 @@ cmd = [] if not is_rcs_exist(wcfile): - cmd.append("""ci -i -q -t-"%(msg)s" -w"%(user)s" %(file)s 2>&1""" % \ - {"file":wcfile, "msg":comment, "user":user}) - cmd.append('rcs -U -q %s' % wcfile) + # -l : lock mode, make wcfile writable + cmd.append('%(cmd)s -i -q -l -t-"%(msg)s" -w"%(user)s" %(file)s 2>&1' % \ + {'cmd':CMD_CI, "file":wcfile, "msg":comment, "user":user}) + # -U : set locking to no-strict. + cmd.append('%(cmd)s -U -q %(file)s' % {'cmd':CMD_RCS, "file":wcfile}) else: - cmd.append("""ci -q -m"%(msg)s" -w"%(user)s" %(file)s 2>&1""" % \ - {"file":wcfile, "msg":comment, "user":user}) + # Warning: w/o -l or -u option, wcfile will be removed after checkin. + # -l makes wcfile writable; + # -u : wcfile is not writable unless rcsfile is set to no-strict locking. + cmd.append('%(cmd)s -q -l -m"%(msg)s" -w"%(user)s" %(file)s 2>&1' % \ + {'cmd':CMD_CI, "file":wcfile, "msg":comment, "user":user}) for i in cmd: log.debug("Command: "+i) @@ -71,13 +81,12 @@ return opts = "" if revision: + # -uRev : checkout without lock revision. + # unlock wcfile is readonly, unless no-strict mode is set. opts = "-u%s" % revision - cmd = "co %(opts)s -q -f %(file)s 2>&1" % {"opts":opts, "file":wcfile } + cmd = "%(cmd)s %(opts)s -q -f %(file)s 2>&1" % {'cmd':CMD_CO, "opts":opts, "file":wcfile } buff = os.popen(cmd).read().strip() if buff: - if 'co: warning: -l overridden by -u' in buff: - pass - else: - raise Exception, "Command: %s\nError Message: %s\n" % (cmd, buff) + raise Exception, "Command: %s\nError Message: %s\n" % (cmd, buff) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-29 16:34:31
|
Revision: 27 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=27&view=rev Author: jiangx Date: 2008-07-29 16:34:38 +0000 (Tue, 29 Jul 2008) Log Message: ----------- store ,v file into RCS directory; bug in last commit: remove continue Modified Paths: -------------- trunk/config/Makefile trunk/pysvnmanager/model/rcsbackup.py trunk/pysvnmanager/tests/test_rcs_backup.py trunk/pysvnmanager/websetup.py Added Paths: ----------- trunk/config/RCS/ Modified: trunk/config/Makefile =================================================================== --- trunk/config/Makefile 2008-07-29 15:36:46 UTC (rev 26) +++ trunk/config/Makefile 2008-07-29 16:34:38 UTC (rev 27) @@ -7,7 +7,7 @@ clean: @-rm $(CONFFILE) >/dev/null 2>&1 @-rm localconfig.pyc >/dev/null 2>&1 - @-rm *,v 2>&1 + @-rm -f *,v RCS/*,v 2>&1 %: $(SRCDIR)/%.in cp $< $@ Property changes on: trunk/config/RCS ___________________________________________________________________ Added: svn:ignore + *,v Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 15:36:46 UTC (rev 26) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 16:34:38 UTC (rev 27) @@ -12,8 +12,12 @@ #sys.setdefaultencoding('utf-8') def is_rcs_exist(wcfile): - rcsfile = wcfile+',v' - return os.access(rcsfile, os.F_OK) + wcpath = os.path.dirname(os.path.abspath(wcfile)) + if os.path.isdir(wcpath+'/RCS'): + rcsfile = wcpath+'/RCS/'+os.path.basename(wcfile)+',v' + else: + rcsfile = wcfile+',v' + return os.path.exists(rcsfile) def get_unicode(msg, escape=False): if isinstance(msg, basestring) and not isinstance(msg, unicode): @@ -54,7 +58,6 @@ for i in cmd: log.debug("Command: "+i) - continue try: buff = os.popen(i).read().strip() except Exception, e: Modified: trunk/pysvnmanager/tests/test_rcs_backup.py =================================================================== --- trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-29 15:36:46 UTC (rev 26) +++ trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-29 16:34:38 UTC (rev 27) @@ -13,11 +13,14 @@ class TestRcsBackup(TestController): wcfile = "%s/%s" % (os.path.dirname(os.path.abspath(__file__)), 'rcstest.txt') - rcsfile = wcfile+',v' + wcpath = os.path.dirname(os.path.abspath(wcfile)) + if os.path.isdir(wcpath+'/RCS'): + rcsfile = wcpath+'/RCS/'+os.path.basename(wcfile)+',v' + else: + rcsfile = wcfile+',v' #def __init__(self, *args): # super(TestController, self).__init__(*args) - def setUp(self): if os.access(self.wcfile, os.R_OK): @@ -25,7 +28,6 @@ if os.access(self.rcsfile, os.R_OK): os.remove(self.rcsfile) - def tearDown(self): if os.access(self.wcfile, os.R_OK): os.remove(self.wcfile) @@ -59,11 +61,13 @@ def testBackup(self): # Backup test. (rcs file not exist yet) self.writefile() + assert self.get_revision() == 1, self.get_revision() assert os.access(self.wcfile, os.R_OK) assert not os.access(self.rcsfile, os.R_OK) rcs.backup(self.wcfile) assert os.access(self.wcfile, os.R_OK) - assert os.access(self.rcsfile, os.R_OK) + assert os.path.exists(self.rcsfile) + assert os.access(self.rcsfile, os.R_OK), self.rcsfile # Backup test. (rcs exist already) self.writefile() Modified: trunk/pysvnmanager/websetup.py =================================================================== --- trunk/pysvnmanager/websetup.py 2008-07-29 15:36:46 UTC (rev 26) +++ trunk/pysvnmanager/websetup.py 2008-07-29 16:34:38 UTC (rev 27) @@ -20,6 +20,8 @@ if not os.path.exists(here+'/config'): os.mkdir(here+'/config') + if not os.path.exists(here+'/config/RCS'): + os.mkdir(here+'/config/RCS') filelist = ['svn.access', 'svn.passwd', 'localconfig.py'] for f in filelist: src = resource_filename('pysvnmanager', 'config/' + f+'.in') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-29 15:36:38
|
Revision: 26 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=26&view=rev Author: jiangx Date: 2008-07-29 15:36:46 +0000 (Tue, 29 Jul 2008) Log Message: ----------- os.popen: must use str not unicode as argument Modified Paths: -------------- trunk/pysvnmanager/lib/base.py trunk/pysvnmanager/model/rcsbackup.py Modified: trunk/pysvnmanager/lib/base.py =================================================================== --- trunk/pysvnmanager/lib/base.py 2008-07-29 15:02:19 UTC (rev 25) +++ trunk/pysvnmanager/lib/base.py 2008-07-29 15:36:46 UTC (rev 26) @@ -26,14 +26,14 @@ if isinstance(msg, basestring) and not isinstance(msg, unicode): msg = unicode(msg, 'utf-8') if escape and isinstance(msg, basestring): - msg = msg.encode('unicode_internal') + msg = msg.encode('raw_unicode_escape') return msg def get_utf8(msg, escape=False): if isinstance(msg, unicode): msg = msg.encode('utf-8') if escape and isinstance(msg, basestring): - msg = msg.encode('unicode_internal') + msg = repr(msg)[1:-1] return msg class BaseController(WSGIController): Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 15:02:19 UTC (rev 25) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 15:36:46 UTC (rev 26) @@ -39,6 +39,7 @@ if not comment: comment = "no message." + wcfile = get_utf8(wcfile) comment = get_utf8(comment) user = get_utf8(user, escape=True) @@ -53,6 +54,7 @@ for i in cmd: log.debug("Command: "+i) + continue try: buff = os.popen(i).read().strip() except Exception, e: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-29 15:02:10
|
Revision: 25 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=25&view=rev Author: jiangx Date: 2008-07-29 15:02:19 +0000 (Tue, 29 Jul 2008) Log Message: ----------- set login_as for svnauthz Modified Paths: -------------- trunk/config/Makefile trunk/pysvnmanager/controllers/authz.py trunk/pysvnmanager/controllers/check.py trunk/pysvnmanager/model/rcsbackup.py Modified: trunk/config/Makefile =================================================================== --- trunk/config/Makefile 2008-07-29 14:43:59 UTC (rev 24) +++ trunk/config/Makefile 2008-07-29 15:02:19 UTC (rev 25) @@ -7,6 +7,7 @@ clean: @-rm $(CONFFILE) >/dev/null 2>&1 @-rm localconfig.pyc >/dev/null 2>&1 + @-rm *,v 2>&1 %: $(SRCDIR)/%.in cp $< $@ Modified: trunk/pysvnmanager/controllers/authz.py =================================================================== --- trunk/pysvnmanager/controllers/authz.py 2008-07-29 14:43:59 UTC (rev 24) +++ trunk/pysvnmanager/controllers/authz.py 2008-07-29 15:02:19 UTC (rev 25) @@ -12,6 +12,8 @@ def __init__(self): self.authz = SvnAuthz(cfg.authz_file) self.login_as = session.get('user') + # Used as checked in user to rcs file. + self.authz.login_as = self.login_as self.reposlist = self.authz.get_manageable_repos_list(self.login_as) def __auth_failed(self): Modified: trunk/pysvnmanager/controllers/check.py =================================================================== --- trunk/pysvnmanager/controllers/check.py 2008-07-29 14:43:59 UTC (rev 24) +++ trunk/pysvnmanager/controllers/check.py 2008-07-29 15:02:19 UTC (rev 25) @@ -12,6 +12,8 @@ def __init__(self): self.authz = SvnAuthz(cfg.authz_file) self.login_as = session.get('user') + # Used as checked in user to rcs file. + self.authz.login_as = self.login_as self.reposlist = self.authz.get_manageable_repos_list(self.login_as) def __authz_failed(self): Modified: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 14:43:59 UTC (rev 24) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 15:02:19 UTC (rev 25) @@ -52,8 +52,7 @@ {"file":wcfile, "msg":comment, "user":user}) for i in cmd: - log.debug("Command 1: "+i) - log.debug("Command 2: "+i.decode('utf-8')) + log.debug("Command: "+i) try: buff = os.popen(i).read().strip() except Exception, e: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-29 14:43:52
|
Revision: 24 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=24&view=rev Author: jiangx Date: 2008-07-29 14:43:59 +0000 (Tue, 29 Jul 2008) Log Message: ----------- Backup authz file using rcs command; Check authz using svn swig python; Modified Paths: -------------- trunk/pysvnmanager/controllers/authz.py trunk/pysvnmanager/controllers/role.py trunk/pysvnmanager/controllers/security.py trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/i18n/pysvnmanager.pot trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/lib/base.py trunk/pysvnmanager/model/svnauthz.py trunk/pysvnmanager/tests/functional/test_role.py trunk/setup.cfg Added Paths: ----------- trunk/pysvnmanager/model/rcsbackup.py trunk/pysvnmanager/tests/test_rcs_backup.py Modified: trunk/pysvnmanager/controllers/authz.py =================================================================== --- trunk/pysvnmanager/controllers/authz.py 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/controllers/authz.py 2008-07-29 14:43:59 UTC (rev 24) @@ -146,6 +146,9 @@ else: isAddModule = False + log_message = _(u"User %(user)s changed authz rules. (rev:%(rev)s)") % \ + {'user':session.get('user'), 'rev': revision} + try: if isAddRepos: repos = self.authz.add_repos(reposname) @@ -172,12 +175,12 @@ if module: self.authz.set_rules(reposname, path, rules); - self.authz.save(revision) - except Exception, (e,): - msg = unicode(e).encode('utf-8') + self.authz.save(revision, comment=log_message) + except Exception, e: + msg = get_unicode(e[0]) - log.info(_(u"User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)") % \ - {'user':session.get('user'), 'rev': revision, 'msg': msg} ) + log.info(log_message) + if msg: log.error(msg) return msg @@ -194,14 +197,16 @@ path = d.get('path') revision = d.get('revision', self.authz.version) + log_message = _(u"User %(user)s delete authz rules. (rev:%(rev)s)") % \ + {'user':session.get('user'), 'rev': revision} try: self.authz.del_module(reposname, path); - self.authz.save(revision) - except Exception, (e,): - msg = unicode(e).encode('utf-8') + self.authz.save(revision, comment=log_message) + except Exception, e: + msg = get_unicode(e[0]) - log.info(_(u"User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)") % \ - {'user':session.get('user'), 'rev': revision, 'msg': msg} ) + log.info(log_message) + if msg: log.error(msg) return msg Modified: trunk/pysvnmanager/controllers/role.py =================================================================== --- trunk/pysvnmanager/controllers/role.py 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/controllers/role.py 2008-07-29 14:43:59 UTC (rev 24) @@ -12,6 +12,8 @@ def __init__(self): self.authz = SvnAuthz(cfg.authz_file) self.login_as = session.get('user') + # Used as checked in user to rcs file. + self.authz.login_as = self.login_as self.aliaslist = map(lambda x:x.uname, self.authz.aliaslist) self.userlist = map(lambda x:x.uname, self.authz.userlist) self.grouplist = map(lambda x:x.uname, self.authz.grouplist) @@ -108,14 +110,17 @@ member_list.extend(map(lambda x: x.strip(), members.split(','))) + log_message = _(u"User %(user)s changed group: %(grp)s. (rev:%(rev)s)") % \ + {'user':session.get('user'), 'grp': rolename, 'rev': revision} + try: self.authz.set_group(rolename, member_list, autodrop=autodrop) - self.authz.save(revision) - except Exception, (e,): - msg = unicode(e) + self.authz.save(revision, comment=log_message) + except Exception, e: + msg = get_unicode(e[0]) - log.info(_(u"User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)") % \ - {'user':session.get('user'), 'grp': rolename, 'rev': revision, 'msg': msg} ) + log.info(log_message) + if msg: log.error(msg) return msg @@ -127,15 +132,19 @@ rolename = d.get('role') revision = d.get('revision', self.authz.version) msg = '' + + log_message = _(u"User %(user)s delete group: %(grp)s. (rev:%(rev)s)") % \ + {'user':session.get('user'), 'grp': rolename, 'rev': revision} + if rolename: try: self.authz.del_group(rolename) - self.authz.save(revision) - except Exception, (e,): - msg = unicode(e) + self.authz.save(revision, comment=log_message) + except Exception, e: + msg = get_unicode(e[0]) - log.info(_(u"User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)") % \ - {'user':session.get('user'), 'grp': rolename, 'rev': revision, 'msg': msg} ) + log.info(log_message) + if msg: log.error(msg) return msg @@ -148,14 +157,18 @@ username = d.get('username') revision = d.get('revision', self.authz.version) msg = "" + + log_message = _(u"User %(user)s changed alias: %(alias)s. (rev:%(rev)s)") % \ + {'user':session.get('user'), 'alias': aliasname, 'rev': revision} + try: self.authz.add_alias(aliasname, username) - self.authz.save(revision) - except Exception, (e,): - msg = unicode(e) + self.authz.save(revision, comment=log_message) + except Exception, e: + msg = get_unicode(e[0]) - log.info(_(u"User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)") % \ - {'user':session.get('user'), 'alias': aliasname, 'rev': revision, 'msg': msg} ) + log.info(log_message) + if msg: log.error(msg) return msg @@ -167,15 +180,19 @@ aliasname = d.get('aliasname') revision = d.get('revision', self.authz.version) msg = '' + + log_message = _(u"User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)") % \ + {'user':session.get('user'), 'alias': aliasname, 'rev': revision, 'msg': msg} + if aliasname: try: self.authz.del_alias(aliasname) - self.authz.save(revision) - except Exception, (e,): - msg = unicode(e) + self.authz.save(revision, comment=log_message) + except Exception, e: + msg = get_unicode(e[0]) - log.info(_(u"User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)") % \ - {'user':session.get('user'), 'alias': aliasname, 'rev': revision, 'msg': msg} ) + log.info(log_message) + if msg: log.error(msg) return msg Modified: trunk/pysvnmanager/controllers/security.py =================================================================== --- trunk/pysvnmanager/controllers/security.py 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/controllers/security.py 2008-07-29 14:43:59 UTC (rev 24) @@ -31,7 +31,7 @@ # Mark user as logged in if auth_passed: session['user'] = username - log.info(_("User %s logged in") % session['user']) + log.info(_(u"User %s logged in") % session['user']) session.save() # Send user back to the page he originally wanted to get to @@ -42,7 +42,7 @@ else: session.clear() session.save() - c.login_message = _("Login failed for user: %s") % username + c.login_message = _(u"Login failed for user: %s") % username return render('/login/login.mako') def logout(self): Modified: trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-29 14:43:59 UTC (rev 24) @@ -9,7 +9,7 @@ "Project-Id-Version: pysvnmanager 0.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-28 09:59+0800\n" +"PO-Revision-Date: 2008-07-29 17:27+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: en <LL...@li...>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -36,8 +36,8 @@ msgid "Anonymous" msgstr "" -#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 -#: pysvnmanager/controllers/role.py:75 +#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:57 +#: pysvnmanager/controllers/role.py:77 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 @@ -47,8 +47,8 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:60 -#: pysvnmanager/controllers/role.py:77 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 +#: pysvnmanager/controllers/role.py:79 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 @@ -59,7 +59,7 @@ msgstr "" #: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 -#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 +#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:50 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -67,51 +67,51 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:155 +#: pysvnmanager/controllers/authz.py:149 #, python-format +msgid "User %(user)s changed authz rules. (rev:%(rev)s)" +msgstr "" + +#: pysvnmanager/controllers/authz.py:158 +#, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:163 +#: pysvnmanager/controllers/authz.py:166 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:169 +#: pysvnmanager/controllers/authz.py:172 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:179 +#: pysvnmanager/controllers/authz.py:200 #, python-format -msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s delete authz rules. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:203 -#, python-format -msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" -msgstr "" - #: pysvnmanager/controllers/check.py:68 #: pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/role.py:117 +#: pysvnmanager/controllers/role.py:113 #, python-format -msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:137 +#: pysvnmanager/controllers/role.py:136 #, python-format -msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:157 +#: pysvnmanager/controllers/role.py:161 #, python-format -msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:177 +#: pysvnmanager/controllers/role.py:184 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -131,75 +131,75 @@ msgid "User %s logged out" msgstr "" -#: pysvnmanager/model/svnauthz.py:59 +#: pysvnmanager/model/svnauthz.py:61 msgid "Name is not given." msgstr "" -#: pysvnmanager/model/svnauthz.py:61 +#: pysvnmanager/model/svnauthz.py:63 msgid "Name is not string." msgstr "" -#: pysvnmanager/model/svnauthz.py:65 +#: pysvnmanager/model/svnauthz.py:67 #, python-format msgid "Name (%s) contains invalid characters." msgstr "" -#: pysvnmanager/model/svnauthz.py:473 +#: pysvnmanager/model/svnauthz.py:475 #, python-format msgid "Recursive group membership for %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:567 +#: pysvnmanager/model/svnauthz.py:569 #, python-format msgid "Not a valid username: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:684 +#: pysvnmanager/model/svnauthz.py:686 #, python-format msgid "Group %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1224 +#: pysvnmanager/model/svnauthz.py:1232 msgid "Update failed! You are working on a out-of-date revision." msgstr "" -#: pysvnmanager/model/svnauthz.py:1458 pysvnmanager/model/svnauthz.py:1465 -#: pysvnmanager/model/svnauthz.py:1469 +#: pysvnmanager/model/svnauthz.py:1486 pysvnmanager/model/svnauthz.py:1493 +#: pysvnmanager/model/svnauthz.py:1497 #, python-format msgid "Unknown rule format: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1483 +#: pysvnmanager/model/svnauthz.py:1511 #, python-format msgid "No module exist for %s:%s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1593 +#: pysvnmanager/model/svnauthz.py:1621 #, python-format msgid "Alias %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1605 +#: pysvnmanager/model/svnauthz.py:1633 #, python-format msgid "%s is referenced by [%s]." msgstr "" -#: pysvnmanager/model/svnauthz.py:1742 +#: pysvnmanager/model/svnauthz.py:1770 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1744 +#: pysvnmanager/model/svnauthz.py:1772 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1746 +#: pysvnmanager/model/svnauthz.py:1774 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1784 +#: pysvnmanager/model/svnauthz.py:1812 #, python-format msgid "" "\n" @@ -211,7 +211,7 @@ "\n" msgstr "" -#: pysvnmanager/model/svnauthz.py:1803 +#: pysvnmanager/model/svnauthz.py:1831 #, python-format msgid "" "\n" @@ -516,3 +516,18 @@ msgid "User name:" msgstr "" +#~ msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" +#~ msgstr "" + +#~ msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" +#~ msgstr "" + +#~ msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" +#~ msgstr "" + +#~ msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" +#~ msgstr "" + +#~ msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" +#~ msgstr "" + Modified: trunk/pysvnmanager/i18n/pysvnmanager.pot =================================================================== --- trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-29 14:43:59 UTC (rev 24) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pySvnManager 0.1.2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2008-07-28 09:59+0800\n" +"POT-Creation-Date: 2008-07-29 17:27+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL...@li...>\n" @@ -32,8 +32,8 @@ msgid "Anonymous" msgstr "" -#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 -#: pysvnmanager/controllers/role.py:75 pysvnmanager/templates/authz/index.mako:155 +#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:57 +#: pysvnmanager/controllers/role.py:77 pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 #: pysvnmanager/templates/role/index.mako:37 @@ -42,8 +42,8 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:60 -#: pysvnmanager/controllers/role.py:77 pysvnmanager/templates/authz/index.mako:157 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 +#: pysvnmanager/controllers/role.py:79 pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 #: pysvnmanager/templates/role/index.mako:42 @@ -53,7 +53,7 @@ msgstr "" #: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 -#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 +#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:50 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -61,50 +61,50 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:155 +#: pysvnmanager/controllers/authz.py:149 #, python-format +msgid "User %(user)s changed authz rules. (rev:%(rev)s)" +msgstr "" + +#: pysvnmanager/controllers/authz.py:158 +#, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:163 +#: pysvnmanager/controllers/authz.py:166 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:169 +#: pysvnmanager/controllers/authz.py:172 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:179 +#: pysvnmanager/controllers/authz.py:200 #, python-format -msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s delete authz rules. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:203 -#, python-format -msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" -msgstr "" - #: pysvnmanager/controllers/check.py:68 pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/role.py:117 +#: pysvnmanager/controllers/role.py:113 #, python-format -msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:137 +#: pysvnmanager/controllers/role.py:136 #, python-format -msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:157 +#: pysvnmanager/controllers/role.py:161 #, python-format -msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s)" msgstr "" -#: pysvnmanager/controllers/role.py:177 +#: pysvnmanager/controllers/role.py:184 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -124,75 +124,75 @@ msgid "User %s logged out" msgstr "" -#: pysvnmanager/model/svnauthz.py:59 +#: pysvnmanager/model/svnauthz.py:61 msgid "Name is not given." msgstr "" -#: pysvnmanager/model/svnauthz.py:61 +#: pysvnmanager/model/svnauthz.py:63 msgid "Name is not string." msgstr "" -#: pysvnmanager/model/svnauthz.py:65 +#: pysvnmanager/model/svnauthz.py:67 #, python-format msgid "Name (%s) contains invalid characters." msgstr "" -#: pysvnmanager/model/svnauthz.py:473 +#: pysvnmanager/model/svnauthz.py:475 #, python-format msgid "Recursive group membership for %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:567 +#: pysvnmanager/model/svnauthz.py:569 #, python-format msgid "Not a valid username: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:684 +#: pysvnmanager/model/svnauthz.py:686 #, python-format msgid "Group %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1224 +#: pysvnmanager/model/svnauthz.py:1232 msgid "Update failed! You are working on a out-of-date revision." msgstr "" -#: pysvnmanager/model/svnauthz.py:1458 pysvnmanager/model/svnauthz.py:1465 -#: pysvnmanager/model/svnauthz.py:1469 +#: pysvnmanager/model/svnauthz.py:1486 pysvnmanager/model/svnauthz.py:1493 +#: pysvnmanager/model/svnauthz.py:1497 #, python-format msgid "Unknown rule format: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1483 +#: pysvnmanager/model/svnauthz.py:1511 #, python-format msgid "No module exist for %s:%s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1593 +#: pysvnmanager/model/svnauthz.py:1621 #, python-format msgid "Alias %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1605 +#: pysvnmanager/model/svnauthz.py:1633 #, python-format msgid "%s is referenced by [%s]." msgstr "" -#: pysvnmanager/model/svnauthz.py:1742 +#: pysvnmanager/model/svnauthz.py:1770 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1744 +#: pysvnmanager/model/svnauthz.py:1772 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1746 +#: pysvnmanager/model/svnauthz.py:1774 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1784 +#: pysvnmanager/model/svnauthz.py:1812 #, python-format msgid "" "\n" @@ -204,7 +204,7 @@ "\n" msgstr "" -#: pysvnmanager/model/svnauthz.py:1803 +#: pysvnmanager/model/svnauthz.py:1831 #, python-format msgid "" "\n" Modified: trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-29 14:43:59 UTC (rev 24) @@ -8,17 +8,18 @@ # Jiang Xin <wor...@gm...>, 2008. msgid "" msgstr "" -"Project-Id-Version: pysvnmanager\n" +"Project-Id-Version: pysvnmanager\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-28 09:59+0800\n" +"PO-Revision-Date: 2008-07-29 17:29+0800\n" "Last-Translator: Jiang Xin <wor...@gm...>\n" -"Language-Team: <zh...@li...>\n" +"Language-Team: <zh...@li...>\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.2\n" +"X-Generator: KBabel 1.11.4\n" #: pysvnmanager/controllers/authz.py:31 #: pysvnmanager/templates/authz/index.mako:159 @@ -38,8 +39,8 @@ msgid "Anonymous" msgstr "匿名用户" -#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 -#: pysvnmanager/controllers/role.py:75 +#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:57 +#: pysvnmanager/controllers/role.py:77 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 @@ -49,8 +50,8 @@ msgid "Group:" msgstr "团队:" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:60 -#: pysvnmanager/controllers/role.py:77 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 +#: pysvnmanager/controllers/role.py:79 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 @@ -61,7 +62,7 @@ msgstr "别名:" #: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 -#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 +#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:50 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -69,51 +70,56 @@ msgid "Please choose..." msgstr "请选择..." -#: pysvnmanager/controllers/authz.py:155 +#: pysvnmanager/controllers/authz.py:149 #, python-format +#| msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s changed authz rules. (rev:%(rev)s)" +msgstr "用户 %(user)s 修改了授权策略。(rev:%(rev)s)" + +#: pysvnmanager/controllers/authz.py:158 +#, python-format msgid "Repository %s not exist." msgstr "版本库 %s 不存在。" -#: pysvnmanager/controllers/authz.py:163 +#: pysvnmanager/controllers/authz.py:166 #, python-format msgid "Module %s not exist." msgstr "模组 %s 不存在。" -#: pysvnmanager/controllers/authz.py:169 +#: pysvnmanager/controllers/authz.py:172 msgid "You can not delete yourself from admin list." msgstr "您不能将自己从管理员列表中删除。" -#: pysvnmanager/controllers/authz.py:179 +#: pysvnmanager/controllers/authz.py:200 #, python-format -msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" -msgstr "用户 %(user)s 修改了授权策略。(rev:%(rev)s,%(msg)s)" +#| msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s delete authz rules. (rev:%(rev)s)" +msgstr "用户 %(user)s 删除了授权策略。(rev:%(rev)s)" -#: pysvnmanager/controllers/authz.py:203 -#, python-format -msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" -msgstr "用户 %(user)s 删除了授权策略。(rev:%(rev)s,%(msg)s)" - #: pysvnmanager/controllers/check.py:68 #: pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "没有权限。" -#: pysvnmanager/controllers/role.py:117 +#: pysvnmanager/controllers/role.py:113 #, python-format -msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" -msgstr "用户 %(user)s 修改用户组: %(grp)s。(rev:%(rev)s,%(msg)s)" +#| msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s)" +msgstr "用户 %(user)s 修改用户组: %(grp)s。(rev:%(rev)s)" -#: pysvnmanager/controllers/role.py:137 +#: pysvnmanager/controllers/role.py:136 #, python-format -msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" -msgstr "用户 %(user)s 删除用户组: %(grp)s。(rev:%(rev)s,%(msg)s)" +#| msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s)" +msgstr "用户 %(user)s 删除用户组: %(grp)s。(rev:%(rev)s)" -#: pysvnmanager/controllers/role.py:157 +#: pysvnmanager/controllers/role.py:161 #, python-format -msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" -msgstr "用户 %(user)s 修改别名: %(alias)s。(rev:%(rev)s,%(msg)s)" +#| msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" +msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s)" +msgstr "用户 %(user)s 修改别名: %(alias)s。(rev:%(rev)s)" -#: pysvnmanager/controllers/role.py:177 +#: pysvnmanager/controllers/role.py:184 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 删除别名: %(alias)s。(rev:%(rev)s,%(msg)s)" @@ -133,75 +139,75 @@ msgid "User %s logged out" msgstr "用户 %s 登出" -#: pysvnmanager/model/svnauthz.py:59 +#: pysvnmanager/model/svnauthz.py:61 msgid "Name is not given." msgstr "未能提供名称。" -#: pysvnmanager/model/svnauthz.py:61 +#: pysvnmanager/model/svnauthz.py:63 msgid "Name is not string." msgstr "名称不是字符串" -#: pysvnmanager/model/svnauthz.py:65 +#: pysvnmanager/model/svnauthz.py:67 #, python-format msgid "Name (%s) contains invalid characters." msgstr "名称(%s)中包含非法字符。" -#: pysvnmanager/model/svnauthz.py:473 +#: pysvnmanager/model/svnauthz.py:475 #, python-format msgid "Recursive group membership for %s" msgstr "%s 出现了循环组引用。" -#: pysvnmanager/model/svnauthz.py:567 +#: pysvnmanager/model/svnauthz.py:569 #, python-format msgid "Not a valid username: %s" msgstr "非法用户名: %s" -#: pysvnmanager/model/svnauthz.py:684 +#: pysvnmanager/model/svnauthz.py:686 #, python-format msgid "Group %s is referenced by group %s." msgstr "用户组 %s 被组 %s 引用。" -#: pysvnmanager/model/svnauthz.py:1224 +#: pysvnmanager/model/svnauthz.py:1232 msgid "Update failed! You are working on a out-of-date revision." msgstr "更新失败!您的更改是基于一个过期的版本,请先刷新再更改。" -#: pysvnmanager/model/svnauthz.py:1458 pysvnmanager/model/svnauthz.py:1465 -#: pysvnmanager/model/svnauthz.py:1469 +#: pysvnmanager/model/svnauthz.py:1486 pysvnmanager/model/svnauthz.py:1493 +#: pysvnmanager/model/svnauthz.py:1497 #, python-format msgid "Unknown rule format: %s" msgstr "未知策略格式: %s" -#: pysvnmanager/model/svnauthz.py:1483 +#: pysvnmanager/model/svnauthz.py:1511 #, python-format msgid "No module exist for %s:%s" msgstr "模块不存在: %s:%s" -#: pysvnmanager/model/svnauthz.py:1593 +#: pysvnmanager/model/svnauthz.py:1621 #, python-format msgid "Alias %s is referenced by group %s." msgstr "别名 %s 为用户组 %s 引用。" -#: pysvnmanager/model/svnauthz.py:1605 +#: pysvnmanager/model/svnauthz.py:1633 #, python-format msgid "%s is referenced by [%s]." msgstr "%s 在 [%s] 中被引用。" -#: pysvnmanager/model/svnauthz.py:1742 +#: pysvnmanager/model/svnauthz.py:1770 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 具有完全权限 (RW)" -#: pysvnmanager/model/svnauthz.py:1744 +#: pysvnmanager/model/svnauthz.py:1772 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 具有只读权限 (RO)" -#: pysvnmanager/model/svnauthz.py:1746 +#: pysvnmanager/model/svnauthz.py:1774 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 没有访问权限 (XX)" -#: pysvnmanager/model/svnauthz.py:1784 +#: pysvnmanager/model/svnauthz.py:1812 #, python-format msgid "" "\n" @@ -220,7 +226,7 @@ "禁用: %(deny)s\n" "\n" -#: pysvnmanager/model/svnauthz.py:1803 +#: pysvnmanager/model/svnauthz.py:1831 #, python-format msgid "" "\n" Modified: trunk/pysvnmanager/lib/base.py =================================================================== --- trunk/pysvnmanager/lib/base.py 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/lib/base.py 2008-07-29 14:43:59 UTC (rev 24) @@ -22,6 +22,20 @@ #import logging #log = logging.getLogger(__name__) +def get_unicode(msg, escape=False): + if isinstance(msg, basestring) and not isinstance(msg, unicode): + msg = unicode(msg, 'utf-8') + if escape and isinstance(msg, basestring): + msg = msg.encode('unicode_internal') + return msg + +def get_utf8(msg, escape=False): + if isinstance(msg, unicode): + msg = msg.encode('utf-8') + if escape and isinstance(msg, basestring): + msg = msg.encode('unicode_internal') + return msg + class BaseController(WSGIController): requires_auth = [] Added: trunk/pysvnmanager/model/rcsbackup.py =================================================================== --- trunk/pysvnmanager/model/rcsbackup.py (rev 0) +++ trunk/pysvnmanager/model/rcsbackup.py 2008-07-29 14:43:59 UTC (rev 24) @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os + +import logging +log = logging.getLogger(__name__) + +import sys +#reload(sys) # in Python2.5, method sys.setdefaultencoding + #will be delete after initialize. we need reload it. +#sys.setdefaultencoding('utf-8') + +def is_rcs_exist(wcfile): + rcsfile = wcfile+',v' + return os.access(rcsfile, os.F_OK) + +def get_unicode(msg, escape=False): + if isinstance(msg, basestring) and not isinstance(msg, unicode): + msg = unicode(msg, 'utf-8') + if escape and isinstance(msg, basestring): + msg = msg.encode('raw_unicode_escape') + return msg + +def get_utf8(msg, escape=False): + if isinstance(msg, unicode): + msg = msg.encode('utf-8') + if escape and isinstance(msg, basestring): + msg = repr(msg)[1:-1] + return msg + +def backup(wcfile, comment='', user=''): + if not wcfile: + raise Exception, "working copy file is not given." + if not user: + user = "pySvnManager" + if isinstance(comment, (list, tuple)): + comment = '\n'.join(comment) + if not comment: + comment = "no message." + + comment = get_utf8(comment) + user = get_utf8(user, escape=True) + + cmd = [] + if not is_rcs_exist(wcfile): + cmd.append("""ci -i -q -t-"%(msg)s" -w"%(user)s" %(file)s 2>&1""" % \ + {"file":wcfile, "msg":comment, "user":user}) + cmd.append('rcs -U -q %s' % wcfile) + else: + cmd.append("""ci -q -m"%(msg)s" -w"%(user)s" %(file)s 2>&1""" % \ + {"file":wcfile, "msg":comment, "user":user}) + + for i in cmd: + log.debug("Command 1: "+i) + log.debug("Command 2: "+i.decode('utf-8')) + try: + buff = os.popen(i).read().strip() + except Exception, e: + raise + else: + if buff: + raise Exception, "Error Message: %s\n" % buff + +def restore(wcfile, revision=""): + if not wcfile or not is_rcs_exist(wcfile): + return + opts = "" + if revision: + opts = "-u%s" % revision + + cmd = "co %(opts)s -q -f %(file)s 2>&1" % {"opts":opts, "file":wcfile } + buff = os.popen(cmd).read().strip() + if buff: + if 'co: warning: -l overridden by -u' in buff: + pass + else: + raise Exception, "Command: %s\nError Message: %s\n" % (cmd, buff) + Property changes on: trunk/pysvnmanager/model/rcsbackup.py ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/pysvnmanager/model/svnauthz.py =================================================================== --- trunk/pysvnmanager/model/svnauthz.py 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/model/svnauthz.py 2008-07-29 14:43:59 UTC (rev 24) @@ -7,8 +7,10 @@ """ from configobj import ConfigObj +import rcsbackup as rcs import re import sys +import os import StringIO import logging log = logging.getLogger(__name__) @@ -1133,6 +1135,10 @@ def __init__(self, fileobj=None): self.__clear() self.__file = None + # Used as check-in username to rcs file. + self.login_as = None + # Used as check-in message to rcs file. + self.comment = [] self.load(fileobj) def __clear(self): @@ -1213,9 +1219,11 @@ continue self.parse_module(section, contents) - def save(self, revision): + def save(self, revision, comment=""): + if comment: self.comment.append(comment) + if self.__file: - assert isinstance(self.__file, (basestring, file, StringIO.StringIO)) + assert isinstance(self.__file, (basestring, StringIO.StringIO)) #if not revision: # revision = self.version last_rev = self.get_revision_from_file() @@ -1236,7 +1244,27 @@ else: f.seek(0,0) f.flush() - + + if isinstance(self.__file, basestring): + try: + self.validate_authz_file(self.__file) + except Exception, e: + rcs.restore(self.__file) + raise Exception, e + else: + rcs.backup(self.__file, comment=self.comment, user=self.login_as) + + self.comment = [] + + def validate_authz_file(self, filename): + if isinstance(filename, basestring): + stat = os.stat(filename) + if stat.st_size == 0: + raise Exception, "Size of file (%s) is zero!" % filename + + from svn import repos as _repos + _repos.authz_read(filename, 1) + def __str__(self): buff = u"" buff += self.compose_version() Modified: trunk/pysvnmanager/tests/functional/test_role.py =================================================================== --- trunk/pysvnmanager/tests/functional/test_role.py 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/pysvnmanager/tests/functional/test_role.py 2008-07-29 14:43:59 UTC (rev 24) @@ -277,6 +277,16 @@ authz = self.load_authz() userobj = authz.get_userobj('&admin') self.assert_(unicode(userobj) == u'admin = 蒋鑫', unicode(userobj).encode('utf-8')) + self.assert_(authz.is_super_user('&admin')==True, authz.is_super_user('&admin')) + self.assert_(authz.is_super_user('蒋鑫')==True, authz.is_super_user('蒋鑫')) + + self.login('蒋鑫') + #params = {'aliasname':'admin', 'username':'蒋鑫',} + params = {'aliasname':'admin2', 'username':'jiangxin',} + res = self.app.get(url_for(controller='role', action='save_alias'), params) + assert res.status == 200 + assert "" == res.body, res.body + finally: self.rollback() Added: trunk/pysvnmanager/tests/test_rcs_backup.py =================================================================== --- trunk/pysvnmanager/tests/test_rcs_backup.py (rev 0) +++ trunk/pysvnmanager/tests/test_rcs_backup.py 2008-07-29 14:43:59 UTC (rev 24) @@ -0,0 +1,128 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sys +sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) + +from pysvnmanager.tests import * +from pysvnmanager import model +from pysvnmanager.model import rcsbackup as rcs +import StringIO +import time + +class TestRcsBackup(TestController): + wcfile = "%s/%s" % (os.path.dirname(os.path.abspath(__file__)), 'rcstest.txt') + rcsfile = wcfile+',v' + + #def __init__(self, *args): + # super(TestController, self).__init__(*args) + + + def setUp(self): + if os.access(self.wcfile, os.R_OK): + os.remove(self.wcfile) + if os.access(self.rcsfile, os.R_OK): + os.remove(self.rcsfile) + + + def tearDown(self): + if os.access(self.wcfile, os.R_OK): + os.remove(self.wcfile) + if os.access(self.rcsfile, os.R_OK): + os.remove(self.rcsfile) + + def writefile(self, rev=None): + if not rev: + rev = self.get_revision()+1 + elif not isinstance(rev, int): + rev = int(rev) + + f = open(self.wcfile, 'w') + f.write('RCS working copy file\n') + f.write('='*20 + '\n') + f.write('Revision: %d\n' % rev) + f.write('Date: %s\n' % time.strftime('%F %T')) + f.close() + + def get_revision(self): + rev = 0 + if os.access(self.wcfile, os.F_OK): + f = open(self.wcfile, 'r') + for line in f: + line = line.strip() + if line.startswith('Revision: '): + rev = int(line.split(':',1)[1]) + break + return rev + + def testBackup(self): + # Backup test. (rcs file not exist yet) + self.writefile() + assert os.access(self.wcfile, os.R_OK) + assert not os.access(self.rcsfile, os.R_OK) + rcs.backup(self.wcfile) + assert os.access(self.wcfile, os.R_OK) + assert os.access(self.rcsfile, os.R_OK) + + # Backup test. (rcs exist already) + self.writefile() + assert os.access(self.rcsfile, os.R_OK) + rcs.backup(self.wcfile) + + # exception test + self.assertRaises(Exception, rcs.backup, "") + + def testRestore(self): + rcs.restore("") + + # new file, backup to r1.1 + self.writefile() + rcs.backup(self.wcfile) + + # restore from top rev: 1.1 + os.remove(self.wcfile) + assert not os.access(self.wcfile, os.R_OK) + rcs.restore(self.wcfile) + assert self.get_revision() == 1, self.get_revision() + + # new file, backup to 1.2 + self.writefile() + rcs.backup(self.wcfile) + + # backup from top rev: 1.2, and overwrite wcfile + self.writefile() + assert self.get_revision() == 3, self.get_revision() + rcs.restore(self.wcfile) + assert self.get_revision() == 2, self.get_revision() + + # backup from old rev: 1.1, and overwrite wcfile + rcs.restore(self.wcfile, '1.1') + assert self.get_revision() == 1, self.get_revision() + + # new file, backup to 1.3 + self.writefile(5) + rcs.backup(self.wcfile) + assert self.get_revision() == 5, self.get_revision() + + # restore from top rev: 1.3 + os.remove(self.wcfile) + assert not os.access(self.wcfile, os.R_OK) + rcs.restore(self.wcfile) + assert self.get_revision() == 5, self.get_revision() + + def testRevision(self): + self.writefile() + assert os.access(self.wcfile, os.R_OK) + pass + + def testLogs(self): + self.writefile() + assert os.access(self.wcfile, os.R_OK) + print "testLogs" + pass + +if __name__ == '__main__': + import unittest + unittest.main() + Property changes on: trunk/pysvnmanager/tests/test_rcs_backup.py ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/setup.cfg =================================================================== --- trunk/setup.cfg 2008-07-29 00:47:18 UTC (rev 23) +++ trunk/setup.cfg 2008-07-29 14:43:59 UTC (rev 24) @@ -63,7 +63,7 @@ verbosity=2 with-pylons=test.ini detailed-errors=1 -with-coverage=1 +#with-coverage=1 cover-package=pysvnmanager cover-erase=1 #with-doctest=1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-29 00:47:09
|
Revision: 23 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=23&view=rev Author: jiangx Date: 2008-07-29 00:47:18 +0000 (Tue, 29 Jul 2008) Log Message: ----------- add cover-package to nose; set proper fallback lang for zh-cn; Modified Paths: -------------- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/i18n/pysvnmanager.pot trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/lib/base.py trunk/setup.cfg trunk/test.ini Modified: trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-27 17:08:10 UTC (rev 22) +++ trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-29 00:47:18 UTC (rev 23) @@ -9,7 +9,7 @@ "Project-Id-Version: pysvnmanager 0.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-27 13:21+0800\n" +"PO-Revision-Date: 2008-07-28 09:59+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: en <LL...@li...>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -37,7 +37,7 @@ msgstr "" #: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 -#: pysvnmanager/controllers/role.py:79 +#: pysvnmanager/controllers/role.py:75 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 @@ -47,8 +47,8 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 -#: pysvnmanager/controllers/role.py:81 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:60 +#: pysvnmanager/controllers/role.py:77 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 @@ -58,7 +58,7 @@ msgid "Alias:" msgstr "" -#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:83 +#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 #: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 @@ -67,26 +67,26 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:146 +#: pysvnmanager/controllers/authz.py:155 #, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:154 +#: pysvnmanager/controllers/authz.py:163 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:160 +#: pysvnmanager/controllers/authz.py:169 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:170 +#: pysvnmanager/controllers/authz.py:179 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:194 +#: pysvnmanager/controllers/authz.py:203 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -96,22 +96,22 @@ msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/role.py:121 +#: pysvnmanager/controllers/role.py:117 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/role.py:141 +#: pysvnmanager/controllers/role.py:137 #, python-format msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/role.py:161 +#: pysvnmanager/controllers/role.py:157 #, python-format msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/role.py:181 +#: pysvnmanager/controllers/role.py:177 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -174,32 +174,32 @@ msgid "No module exist for %s:%s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1592 +#: pysvnmanager/model/svnauthz.py:1593 #, python-format msgid "Alias %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1604 +#: pysvnmanager/model/svnauthz.py:1605 #, python-format msgid "%s is referenced by [%s]." msgstr "" -#: pysvnmanager/model/svnauthz.py:1741 +#: pysvnmanager/model/svnauthz.py:1742 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1743 +#: pysvnmanager/model/svnauthz.py:1744 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1745 +#: pysvnmanager/model/svnauthz.py:1746 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1783 +#: pysvnmanager/model/svnauthz.py:1784 #, python-format msgid "" "\n" @@ -211,7 +211,7 @@ "\n" msgstr "" -#: pysvnmanager/model/svnauthz.py:1802 +#: pysvnmanager/model/svnauthz.py:1803 #, python-format msgid "" "\n" @@ -516,15 +516,3 @@ msgid "User name:" msgstr "" -#~ msgid "Aliasname is not provided." -#~ msgstr "" - -#~ msgid "Aliasname should not begin with &." -#~ msgstr "" - -#~ msgid "Group name is not provided." -#~ msgstr "" - -#~ msgid "Group name should not begin with @." -#~ msgstr "" - Modified: trunk/pysvnmanager/i18n/pysvnmanager.pot =================================================================== --- trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-27 17:08:10 UTC (rev 22) +++ trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-29 00:47:18 UTC (rev 23) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pySvnManager 0.1.2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2008-07-27 13:21+0800\n" +"POT-Creation-Date: 2008-07-28 09:59+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL...@li...>\n" @@ -33,7 +33,7 @@ msgstr "" #: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 -#: pysvnmanager/controllers/role.py:79 pysvnmanager/templates/authz/index.mako:155 +#: pysvnmanager/controllers/role.py:75 pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 #: pysvnmanager/templates/role/index.mako:37 @@ -42,8 +42,8 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 -#: pysvnmanager/controllers/role.py:81 pysvnmanager/templates/authz/index.mako:157 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:60 +#: pysvnmanager/controllers/role.py:77 pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 #: pysvnmanager/templates/role/index.mako:42 @@ -52,7 +52,7 @@ msgid "Alias:" msgstr "" -#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:83 +#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 #: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 @@ -61,26 +61,26 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:146 +#: pysvnmanager/controllers/authz.py:155 #, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:154 +#: pysvnmanager/controllers/authz.py:163 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:160 +#: pysvnmanager/controllers/authz.py:169 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:170 +#: pysvnmanager/controllers/authz.py:179 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:194 +#: pysvnmanager/controllers/authz.py:203 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -89,22 +89,22 @@ msgid "Permission denied." msgstr "" -#: pysvnmanager/controllers/role.py:121 +#: pysvnmanager/controllers/role.py:117 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/role.py:141 +#: pysvnmanager/controllers/role.py:137 #, python-format msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/role.py:161 +#: pysvnmanager/controllers/role.py:157 #, python-format msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/role.py:181 +#: pysvnmanager/controllers/role.py:177 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -167,32 +167,32 @@ msgid "No module exist for %s:%s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1592 +#: pysvnmanager/model/svnauthz.py:1593 #, python-format msgid "Alias %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1604 +#: pysvnmanager/model/svnauthz.py:1605 #, python-format msgid "%s is referenced by [%s]." msgstr "" -#: pysvnmanager/model/svnauthz.py:1741 +#: pysvnmanager/model/svnauthz.py:1742 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1743 +#: pysvnmanager/model/svnauthz.py:1744 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1745 +#: pysvnmanager/model/svnauthz.py:1746 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1783 +#: pysvnmanager/model/svnauthz.py:1784 #, python-format msgid "" "\n" @@ -204,7 +204,7 @@ "\n" msgstr "" -#: pysvnmanager/model/svnauthz.py:1802 +#: pysvnmanager/model/svnauthz.py:1803 #, python-format msgid "" "\n" Modified: trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-27 17:08:10 UTC (rev 22) +++ trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-29 00:47:18 UTC (rev 23) @@ -8,18 +8,17 @@ # Jiang Xin <wor...@gm...>, 2008. msgid "" msgstr "" -"Project-Id-Version: pysvnmanager\n" +"Project-Id-Version: pysvnmanager\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-27 13:23+0800\n" +"PO-Revision-Date: 2008-07-28 09:59+0800\n" "Last-Translator: Jiang Xin <wor...@gm...>\n" -"Language-Team: <zh...@li...>\n" +"Language-Team: <zh...@li...>\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.2\n" -"X-Generator: KBabel 1.11.4\n" #: pysvnmanager/controllers/authz.py:31 #: pysvnmanager/templates/authz/index.mako:159 @@ -40,7 +39,7 @@ msgstr "匿名用户" #: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 -#: pysvnmanager/controllers/role.py:79 +#: pysvnmanager/controllers/role.py:75 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 @@ -50,8 +49,8 @@ msgid "Group:" msgstr "团队:" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 -#: pysvnmanager/controllers/role.py:81 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:60 +#: pysvnmanager/controllers/role.py:77 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 @@ -61,7 +60,7 @@ msgid "Alias:" msgstr "别名:" -#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:83 +#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:82 #: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 @@ -70,26 +69,26 @@ msgid "Please choose..." msgstr "请选择..." -#: pysvnmanager/controllers/authz.py:146 +#: pysvnmanager/controllers/authz.py:155 #, python-format msgid "Repository %s not exist." msgstr "版本库 %s 不存在。" -#: pysvnmanager/controllers/authz.py:154 +#: pysvnmanager/controllers/authz.py:163 #, python-format msgid "Module %s not exist." msgstr "模组 %s 不存在。" -#: pysvnmanager/controllers/authz.py:160 +#: pysvnmanager/controllers/authz.py:169 msgid "You can not delete yourself from admin list." msgstr "您不能将自己从管理员列表中删除。" -#: pysvnmanager/controllers/authz.py:170 +#: pysvnmanager/controllers/authz.py:179 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 修改了授权策略。(rev:%(rev)s,%(msg)s)" -#: pysvnmanager/controllers/authz.py:194 +#: pysvnmanager/controllers/authz.py:203 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 删除了授权策略。(rev:%(rev)s,%(msg)s)" @@ -99,22 +98,22 @@ msgid "Permission denied." msgstr "没有权限。" -#: pysvnmanager/controllers/role.py:121 +#: pysvnmanager/controllers/role.py:117 #, python-format msgid "User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 修改用户组: %(grp)s。(rev:%(rev)s,%(msg)s)" -#: pysvnmanager/controllers/role.py:141 +#: pysvnmanager/controllers/role.py:137 #, python-format msgid "User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 删除用户组: %(grp)s。(rev:%(rev)s,%(msg)s)" -#: pysvnmanager/controllers/role.py:161 +#: pysvnmanager/controllers/role.py:157 #, python-format msgid "User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 修改别名: %(alias)s。(rev:%(rev)s,%(msg)s)" -#: pysvnmanager/controllers/role.py:181 +#: pysvnmanager/controllers/role.py:177 #, python-format msgid "User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 删除别名: %(alias)s。(rev:%(rev)s,%(msg)s)" @@ -177,32 +176,32 @@ msgid "No module exist for %s:%s" msgstr "模块不存在: %s:%s" -#: pysvnmanager/model/svnauthz.py:1592 +#: pysvnmanager/model/svnauthz.py:1593 #, python-format msgid "Alias %s is referenced by group %s." msgstr "别名 %s 为用户组 %s 引用。" -#: pysvnmanager/model/svnauthz.py:1604 +#: pysvnmanager/model/svnauthz.py:1605 #, python-format msgid "%s is referenced by [%s]." msgstr "%s 在 [%s] 中被引用。" -#: pysvnmanager/model/svnauthz.py:1741 +#: pysvnmanager/model/svnauthz.py:1742 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 具有完全权限 (RW)" -#: pysvnmanager/model/svnauthz.py:1743 +#: pysvnmanager/model/svnauthz.py:1744 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 具有只读权限 (RO)" -#: pysvnmanager/model/svnauthz.py:1745 +#: pysvnmanager/model/svnauthz.py:1746 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 没有访问权限 (XX)" -#: pysvnmanager/model/svnauthz.py:1783 +#: pysvnmanager/model/svnauthz.py:1784 #, python-format msgid "" "\n" @@ -221,7 +220,7 @@ "禁用: %(deny)s\n" "\n" -#: pysvnmanager/model/svnauthz.py:1802 +#: pysvnmanager/model/svnauthz.py:1803 #, python-format msgid "" "\n" @@ -464,12 +463,10 @@ msgstr "角色管理" #: pysvnmanager/templates/role/index.mako:420 -#| msgid "Update ACL failed:" msgid "Update group failed:" msgstr "更新用户组失败:" #: pysvnmanager/templates/role/index.mako:427 -#| msgid "Update ACL successfully." msgid "Update group successfully." msgstr "成功更新用户组。" @@ -478,22 +475,18 @@ msgstr "您确认要删除用户组:" #: pysvnmanager/templates/role/index.mako:471 -#| msgid "Update ACL failed:" msgid "Delete group failed:" msgstr "更新用户组失败:" #: pysvnmanager/templates/role/index.mako:478 -#| msgid "Update ACL successfully." msgid "Delete group successfully." msgstr "成功删除用户组。" #: pysvnmanager/templates/role/index.mako:512 -#| msgid "Update ACL failed:" msgid "Update alias failed:" msgstr "更新别名失败:" #: pysvnmanager/templates/role/index.mako:519 -#| msgid "Update ACL successfully." msgid "Update alias successfully." msgstr "成功更新别名。" @@ -502,12 +495,10 @@ msgstr "您确认要删除别名:" #: pysvnmanager/templates/role/index.mako:562 -#| msgid "Update ACL failed:" msgid "Delete alias failed:" msgstr "删除别名失败:" #: pysvnmanager/templates/role/index.mako:569 -#| msgid "Update ACL successfully." msgid "Delete alias successfully." msgstr "成功删除别名。" Modified: trunk/pysvnmanager/lib/base.py =================================================================== --- trunk/pysvnmanager/lib/base.py 2008-07-27 17:08:10 UTC (rev 22) +++ trunk/pysvnmanager/lib/base.py 2008-07-29 00:47:18 UTC (rev 23) @@ -19,6 +19,9 @@ sys.path.insert(0, config_path) from localconfig import LocalConfig as cfg +#import logging +#log = logging.getLogger(__name__) + class BaseController(WSGIController): requires_auth = [] @@ -26,8 +29,11 @@ if 'lang' in session: set_lang(session['lang']) + #log.debug(request.languages) for lang in request.languages: - if lang in ['zh', 'en']: + if lang.lower() in ['zh-cn', 'zh']: + add_fallback('zh') + elif lang in ['en']: add_fallback(lang) if isinstance(self.requires_auth, bool) and not self.requires_auth: Modified: trunk/setup.cfg =================================================================== --- trunk/setup.cfg 2008-07-27 17:08:10 UTC (rev 22) +++ trunk/setup.cfg 2008-07-29 00:47:18 UTC (rev 23) @@ -63,6 +63,8 @@ verbosity=2 with-pylons=test.ini detailed-errors=1 -#with-coverage=1 +with-coverage=1 +cover-package=pysvnmanager +cover-erase=1 #with-doctest=1 Modified: trunk/test.ini =================================================================== --- trunk/test.ini 2008-07-27 17:08:10 UTC (rev 22) +++ trunk/test.ini 2008-07-29 00:47:18 UTC (rev 23) @@ -56,7 +56,7 @@ # Logging configuration [loggers] -keys = root, pysvnmanager +keys = root, nose, nose_plugins_cover, pysvnmanager [handlers] keys = console @@ -65,9 +65,19 @@ keys = generic [logger_root] +level = DEBUG +handlers = console + +[logger_nose] level = INFO handlers = console +qualname = nose +[logger_nose_plugins_cover] +level = INFO +handlers = console +qualname = nose.plugins.cover + [logger_pysvnmanager] level = DEBUG handlers = This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-27 17:08:03
|
Revision: 22 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=22&view=rev Author: jiangx Date: 2008-07-27 17:08:10 +0000 (Sun, 27 Jul 2008) Log Message: ----------- unittest for controllers Modified Paths: -------------- trunk/pysvnmanager/config/svn.passwd.in trunk/pysvnmanager/controllers/authz.py trunk/pysvnmanager/controllers/role.py trunk/pysvnmanager/controllers/security.py trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/i18n/pysvnmanager.pot trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po trunk/pysvnmanager/model/auth/http.py trunk/pysvnmanager/model/svnauthz.py trunk/pysvnmanager/templates/role/index.mako trunk/pysvnmanager/tests/__init__.py trunk/pysvnmanager/tests/functional/test_authz.py trunk/pysvnmanager/tests/functional/test_check.py trunk/pysvnmanager/tests/functional/test_role.py trunk/pysvnmanager/tests/test_models.py trunk/test.ini Modified: trunk/pysvnmanager/config/svn.passwd.in =================================================================== --- trunk/pysvnmanager/config/svn.passwd.in 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/config/svn.passwd.in 2008-07-27 17:08:10 UTC (rev 22) @@ -6,3 +6,4 @@ user1:IAYXiOIckB5iU user2:giShzi.a1DcJg badboy:OY24/4nS/3Yg. +蒋鑫:58EvOwQjOEvWc Modified: trunk/pysvnmanager/controllers/authz.py =================================================================== --- trunk/pysvnmanager/controllers/authz.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/controllers/authz.py 2008-07-27 17:08:10 UTC (rev 22) @@ -75,20 +75,19 @@ d = request.params select = d.get('select') repos = self.authz.get_repos(select) - if not repos: - return msg; - # get javascript code for top_form's role_selector - msg += 'id[0]="%s";' % '...' - msg += 'name[0]="%s";\n' % _("Please choose...") - total += 1; - for path in repos.path_list: - msg += 'id[%d]="%s";' % (total, path) - msg += 'name[%d]="%s";\n' % (total, path) + if repos: + # get javascript code for top_form's role_selector + msg += 'id[0]="%s";' % '...' + msg += 'name[0]="%s";\n' % _("Please choose...") total += 1; - msg += 'total=%d;\n' % total - msg += 'admin_users="%s";\n' % repos.admins - msg += 'revision="%s";\n' % self.authz.version + for path in repos.path_list: + msg += 'id[%d]="%s";' % (total, path) + msg += 'name[%d]="%s";\n' % (total, path) + total += 1; + msg += 'total=%d;\n' % total + msg += 'admin_users="%s";\n' % repos.admins + msg += 'revision="%s";\n' % self.authz.version return msg @@ -131,14 +130,24 @@ admins = d.get('admins', '') path = d.get('path') rules = d.get('rules') + revision = d.get('revision', self.authz.version) + # mode1: new or edit repository mode1 = d.get('mode1') + if mode1 == "new": + isAddRepos = True + else: + isAddRepos = False + # mode2: new or edit module mode2 = d.get('mode2') - revision = d.get('revision', self.authz.version) - + if mode2 == "new": + isAddModule = True + else: + isAddModule = False + try: - if mode1 == "new": + if isAddRepos: repos = self.authz.add_repos(reposname) else: repos = self.authz.get_repos(reposname) @@ -146,10 +155,10 @@ raise Exception, _("Repository %s not exist.") % reposname if path: - if mode2 == "new": - module = self.authz.add_module(reposname, path) + if isAddModule: + module = repos.add_module(path) else: - module = self.authz.get_module(reposname, path) + module = repos.get_module(path) if not module: raise Exception, _("Module %s not exist.") % path else: @@ -164,10 +173,10 @@ if module: self.authz.set_rules(reposname, path, rules); self.authz.save(revision) - except Exception, e: - msg = unicode(e) + except Exception, (e,): + msg = unicode(e).encode('utf-8') - log.info(_("User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)") % \ + log.info(_(u"User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)") % \ {'user':session.get('user'), 'rev': revision, 'msg': msg} ) return msg @@ -188,10 +197,10 @@ try: self.authz.del_module(reposname, path); self.authz.save(revision) - except Exception, e: - msg = unicode(e) + except Exception, (e,): + msg = unicode(e).encode('utf-8') - log.info(_("User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)") % \ + log.info(_(u"User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)") % \ {'user':session.get('user'), 'rev': revision, 'msg': msg} ) return msg Modified: trunk/pysvnmanager/controllers/role.py =================================================================== --- trunk/pysvnmanager/controllers/role.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/controllers/role.py 2008-07-27 17:08:10 UTC (rev 22) @@ -51,17 +51,13 @@ if uname == '*' or uname[0] == '$': continue msg += 'id[%d]="%s";' % (members_count, uname) - if uname[0] == '@': - msg += 'name[%d]="%s";\n' % (members_count, _("Group:")+uname[1:]) - else: - msg += 'name[%d]="%s";\n' % (members_count, uname) + assert uname[0] == '@' + msg += 'name[%d]="%s";\n' % (members_count, _("Group:")+uname[1:]) members_count += 1; for uname in self.aliaslist: msg += 'id[%d]="%s";' % (members_count, uname) - if uname[0] == '&': - msg += 'name[%d]="%s";\n' % (members_count, _("Alias:")+uname[1:]) - else: - msg += 'name[%d]="%s";\n' % (members_count, uname) + assert uname[0] == '&' + msg += 'name[%d]="%s";\n' % (members_count, _("Alias:")+uname[1:]) members_count += 1; msg += 'members_count=%d;\n' % members_count @@ -72,8 +68,8 @@ if roleobj and role[0] == '@': for i in roleobj: uname = i.uname - if uname == '*' or uname[0] == '$': - continue + #if uname == '*' or uname[0] == '$': + # continue msg += 'id[%d]="%s";' % (members_count, uname) if uname[0] == '@': msg += 'name[%d]="%s";\n' % (members_count, _("Group:")+uname[1:]) @@ -115,7 +111,7 @@ try: self.authz.set_group(rolename, member_list, autodrop=autodrop) self.authz.save(revision) - except Exception, e: + except Exception, (e,): msg = unicode(e) log.info(_(u"User %(user)s changed group: %(grp)s. (rev:%(rev)s,%(msg)s)") % \ @@ -135,10 +131,10 @@ try: self.authz.del_group(rolename) self.authz.save(revision) - except Exception, e: + except Exception, (e,): msg = unicode(e) - log.info(_("User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)") % \ + log.info(_(u"User %(user)s delete group: %(grp)s. (rev:%(rev)s,%(msg)s)") % \ {'user':session.get('user'), 'grp': rolename, 'rev': revision, 'msg': msg} ) return msg @@ -155,10 +151,10 @@ try: self.authz.add_alias(aliasname, username) self.authz.save(revision) - except Exception, e: + except Exception, (e,): msg = unicode(e) - log.info(_("User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)") % \ + log.info(_(u"User %(user)s changed alias: %(alias)s. (rev:%(rev)s,%(msg)s)") % \ {'user':session.get('user'), 'alias': aliasname, 'rev': revision, 'msg': msg} ) return msg @@ -175,10 +171,10 @@ try: self.authz.del_alias(aliasname) self.authz.save(revision) - except Exception, e: + except Exception, (e,): msg = unicode(e) - log.info(_("User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)") % \ + log.info(_(u"User %(user)s delete alias: %(alias)s. (rev:%(rev)s,%(msg)s)") % \ {'user':session.get('user'), 'alias': aliasname, 'rev': revision, 'msg': msg} ) return msg Modified: trunk/pysvnmanager/controllers/security.py =================================================================== --- trunk/pysvnmanager/controllers/security.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/controllers/security.py 2008-07-27 17:08:10 UTC (rev 22) @@ -20,8 +20,8 @@ """ auth_passed = False # Both fields filled? - username = str(request.params.get('username')) - password = str(request.params.get('password')) + username = request.params.get('username') + password = request.params.get('password') for auth in cfg.auth: if auth(username=username, password=password, config=cfg): Modified: trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-27 17:08:10 UTC (rev 22) @@ -9,7 +9,7 @@ "Project-Id-Version: pysvnmanager 0.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-26 11:16+0800\n" +"PO-Revision-Date: 2008-07-27 13:21+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: en <LL...@li...>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -18,25 +18,25 @@ "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.2\n" -#: pysvnmanager/controllers/authz.py:33 +#: pysvnmanager/controllers/authz.py:31 #: pysvnmanager/templates/authz/index.mako:159 #: pysvnmanager/templates/check/index.mako:10 msgid "All users(with anon)" msgstr "" -#: pysvnmanager/controllers/authz.py:34 +#: pysvnmanager/controllers/authz.py:32 #: pysvnmanager/templates/authz/index.mako:161 #: pysvnmanager/templates/check/index.mako:11 msgid "Known users" msgstr "" -#: pysvnmanager/controllers/authz.py:35 +#: pysvnmanager/controllers/authz.py:33 #: pysvnmanager/templates/authz/index.mako:163 #: pysvnmanager/templates/check/index.mako:12 msgid "Anonymous" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:55 +#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 #: pysvnmanager/controllers/role.py:79 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 @@ -47,7 +47,7 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:47 pysvnmanager/controllers/role.py:62 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 #: pysvnmanager/controllers/role.py:81 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 @@ -58,8 +58,8 @@ msgid "Alias:" msgstr "" -#: pysvnmanager/controllers/authz.py:67 pysvnmanager/controllers/authz.py:91 -#: pysvnmanager/controllers/check.py:93 pysvnmanager/controllers/role.py:48 +#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:83 +#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -67,32 +67,32 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:155 +#: pysvnmanager/controllers/authz.py:146 #, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:163 +#: pysvnmanager/controllers/authz.py:154 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:169 +#: pysvnmanager/controllers/authz.py:160 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:179 +#: pysvnmanager/controllers/authz.py:170 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:203 +#: pysvnmanager/controllers/authz.py:194 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/check.py:70 -#: pysvnmanager/templates/auth_failed.mako:4 +#: pysvnmanager/controllers/check.py:68 +#: pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "" @@ -131,91 +131,75 @@ msgid "User %s logged out" msgstr "" -#: pysvnmanager/model/svnauthz.py:58 +#: pysvnmanager/model/svnauthz.py:59 msgid "Name is not given." msgstr "" -#: pysvnmanager/model/svnauthz.py:60 +#: pysvnmanager/model/svnauthz.py:61 msgid "Name is not string." msgstr "" -#: pysvnmanager/model/svnauthz.py:64 +#: pysvnmanager/model/svnauthz.py:65 #, python-format msgid "Name (%s) contains invalid characters." msgstr "" -#: pysvnmanager/model/svnauthz.py:222 -msgid "Aliasname is not provided." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:224 -msgid "Aliasname should not begin with &." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:397 -msgid "Group name is not provided." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:399 -msgid "Group name should not begin with @." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:469 +#: pysvnmanager/model/svnauthz.py:473 #, python-format msgid "Recursive group membership for %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:561 +#: pysvnmanager/model/svnauthz.py:567 #, python-format msgid "Not a valid username: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:686 +#: pysvnmanager/model/svnauthz.py:684 #, python-format msgid "Group %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1229 +#: pysvnmanager/model/svnauthz.py:1224 msgid "Update failed! You are working on a out-of-date revision." msgstr "" -#: pysvnmanager/model/svnauthz.py:1461 pysvnmanager/model/svnauthz.py:1468 -#: pysvnmanager/model/svnauthz.py:1472 +#: pysvnmanager/model/svnauthz.py:1458 pysvnmanager/model/svnauthz.py:1465 +#: pysvnmanager/model/svnauthz.py:1469 #, python-format msgid "Unknown rule format: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1486 +#: pysvnmanager/model/svnauthz.py:1483 #, python-format msgid "No module exist for %s:%s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1597 +#: pysvnmanager/model/svnauthz.py:1592 #, python-format msgid "Alias %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1609 +#: pysvnmanager/model/svnauthz.py:1604 #, python-format msgid "%s is referenced by [%s]." msgstr "" -#: pysvnmanager/model/svnauthz.py:1746 +#: pysvnmanager/model/svnauthz.py:1741 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1748 +#: pysvnmanager/model/svnauthz.py:1743 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1750 +#: pysvnmanager/model/svnauthz.py:1745 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1788 +#: pysvnmanager/model/svnauthz.py:1783 #, python-format msgid "" "\n" @@ -227,7 +211,7 @@ "\n" msgstr "" -#: pysvnmanager/model/svnauthz.py:1807 +#: pysvnmanager/model/svnauthz.py:1802 #, python-format msgid "" "\n" @@ -456,14 +440,46 @@ msgid "Role Management" msgstr "" +#: pysvnmanager/templates/role/index.mako:420 +msgid "Update group failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:427 +msgid "Update group successfully." +msgstr "" + #: pysvnmanager/templates/role/index.mako:448 msgid "Are you sure to delete group:" msgstr "" +#: pysvnmanager/templates/role/index.mako:471 +msgid "Delete group failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:478 +msgid "Delete group successfully." +msgstr "" + +#: pysvnmanager/templates/role/index.mako:512 +msgid "Update alias failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:519 +msgid "Update alias successfully." +msgstr "" + #: pysvnmanager/templates/role/index.mako:539 msgid "Are you sure to delete alias:" msgstr "" +#: pysvnmanager/templates/role/index.mako:562 +msgid "Delete alias failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:569 +msgid "Delete alias successfully." +msgstr "" + #: pysvnmanager/templates/role/index.mako:645 msgid "Select a role name:" msgstr "" @@ -500,12 +516,15 @@ msgid "User name:" msgstr "" -#~ msgid "Name contains invalid characters." +#~ msgid "Aliasname is not provided." #~ msgstr "" -#~ msgid "Not a valide username: %s" +#~ msgid "Aliasname should not begin with &." #~ msgstr "" -#~ msgid "Alias %s is used by rules." +#~ msgid "Group name is not provided." #~ msgstr "" +#~ msgid "Group name should not begin with @." +#~ msgstr "" + Modified: trunk/pysvnmanager/i18n/pysvnmanager.pot =================================================================== --- trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/i18n/pysvnmanager.pot 2008-07-27 17:08:10 UTC (rev 22) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pySvnManager 0.1.2\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2008-07-26 11:15+0800\n" +"POT-Creation-Date: 2008-07-27 13:21+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL...@li...>\n" @@ -17,22 +17,22 @@ "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.2\n" -#: pysvnmanager/controllers/authz.py:33 pysvnmanager/templates/authz/index.mako:159 +#: pysvnmanager/controllers/authz.py:31 pysvnmanager/templates/authz/index.mako:159 #: pysvnmanager/templates/check/index.mako:10 msgid "All users(with anon)" msgstr "" -#: pysvnmanager/controllers/authz.py:34 pysvnmanager/templates/authz/index.mako:161 +#: pysvnmanager/controllers/authz.py:32 pysvnmanager/templates/authz/index.mako:161 #: pysvnmanager/templates/check/index.mako:11 msgid "Known users" msgstr "" -#: pysvnmanager/controllers/authz.py:35 pysvnmanager/templates/authz/index.mako:163 +#: pysvnmanager/controllers/authz.py:33 pysvnmanager/templates/authz/index.mako:163 #: pysvnmanager/templates/check/index.mako:12 msgid "Anonymous" msgstr "" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:55 +#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 #: pysvnmanager/controllers/role.py:79 pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 #: pysvnmanager/templates/role/index.mako:18 @@ -42,7 +42,7 @@ msgid "Group:" msgstr "" -#: pysvnmanager/controllers/authz.py:47 pysvnmanager/controllers/role.py:62 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 #: pysvnmanager/controllers/role.py:81 pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 #: pysvnmanager/templates/role/index.mako:23 @@ -52,8 +52,8 @@ msgid "Alias:" msgstr "" -#: pysvnmanager/controllers/authz.py:67 pysvnmanager/controllers/authz.py:91 -#: pysvnmanager/controllers/check.py:93 pysvnmanager/controllers/role.py:48 +#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:83 +#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -61,31 +61,31 @@ msgid "Please choose..." msgstr "" -#: pysvnmanager/controllers/authz.py:155 +#: pysvnmanager/controllers/authz.py:146 #, python-format msgid "Repository %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:163 +#: pysvnmanager/controllers/authz.py:154 #, python-format msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:169 +#: pysvnmanager/controllers/authz.py:160 msgid "You can not delete yourself from admin list." msgstr "" -#: pysvnmanager/controllers/authz.py:179 +#: pysvnmanager/controllers/authz.py:170 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:203 +#: pysvnmanager/controllers/authz.py:194 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/check.py:70 pysvnmanager/templates/auth_failed.mako:4 +#: pysvnmanager/controllers/check.py:68 pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "" @@ -124,91 +124,75 @@ msgid "User %s logged out" msgstr "" -#: pysvnmanager/model/svnauthz.py:58 +#: pysvnmanager/model/svnauthz.py:59 msgid "Name is not given." msgstr "" -#: pysvnmanager/model/svnauthz.py:60 +#: pysvnmanager/model/svnauthz.py:61 msgid "Name is not string." msgstr "" -#: pysvnmanager/model/svnauthz.py:64 +#: pysvnmanager/model/svnauthz.py:65 #, python-format msgid "Name (%s) contains invalid characters." msgstr "" -#: pysvnmanager/model/svnauthz.py:222 -msgid "Aliasname is not provided." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:224 -msgid "Aliasname should not begin with &." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:397 -msgid "Group name is not provided." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:399 -msgid "Group name should not begin with @." -msgstr "" - -#: pysvnmanager/model/svnauthz.py:469 +#: pysvnmanager/model/svnauthz.py:473 #, python-format msgid "Recursive group membership for %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:561 +#: pysvnmanager/model/svnauthz.py:567 #, python-format msgid "Not a valid username: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:686 +#: pysvnmanager/model/svnauthz.py:684 #, python-format msgid "Group %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1229 +#: pysvnmanager/model/svnauthz.py:1224 msgid "Update failed! You are working on a out-of-date revision." msgstr "" -#: pysvnmanager/model/svnauthz.py:1461 pysvnmanager/model/svnauthz.py:1468 -#: pysvnmanager/model/svnauthz.py:1472 +#: pysvnmanager/model/svnauthz.py:1458 pysvnmanager/model/svnauthz.py:1465 +#: pysvnmanager/model/svnauthz.py:1469 #, python-format msgid "Unknown rule format: %s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1486 +#: pysvnmanager/model/svnauthz.py:1483 #, python-format msgid "No module exist for %s:%s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1597 +#: pysvnmanager/model/svnauthz.py:1592 #, python-format msgid "Alias %s is referenced by group %s." msgstr "" -#: pysvnmanager/model/svnauthz.py:1609 +#: pysvnmanager/model/svnauthz.py:1604 #, python-format msgid "%s is referenced by [%s]." msgstr "" -#: pysvnmanager/model/svnauthz.py:1746 +#: pysvnmanager/model/svnauthz.py:1741 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1748 +#: pysvnmanager/model/svnauthz.py:1743 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1750 +#: pysvnmanager/model/svnauthz.py:1745 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "" -#: pysvnmanager/model/svnauthz.py:1788 +#: pysvnmanager/model/svnauthz.py:1783 #, python-format msgid "" "\n" @@ -220,7 +204,7 @@ "\n" msgstr "" -#: pysvnmanager/model/svnauthz.py:1807 +#: pysvnmanager/model/svnauthz.py:1802 #, python-format msgid "" "\n" @@ -448,14 +432,46 @@ msgid "Role Management" msgstr "" +#: pysvnmanager/templates/role/index.mako:420 +msgid "Update group failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:427 +msgid "Update group successfully." +msgstr "" + #: pysvnmanager/templates/role/index.mako:448 msgid "Are you sure to delete group:" msgstr "" +#: pysvnmanager/templates/role/index.mako:471 +msgid "Delete group failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:478 +msgid "Delete group successfully." +msgstr "" + +#: pysvnmanager/templates/role/index.mako:512 +msgid "Update alias failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:519 +msgid "Update alias successfully." +msgstr "" + #: pysvnmanager/templates/role/index.mako:539 msgid "Are you sure to delete alias:" msgstr "" +#: pysvnmanager/templates/role/index.mako:562 +msgid "Delete alias failed:" +msgstr "" + +#: pysvnmanager/templates/role/index.mako:569 +msgid "Delete alias successfully." +msgstr "" + #: pysvnmanager/templates/role/index.mako:645 msgid "Select a role name:" msgstr "" Modified: trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po =================================================================== --- trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-27 17:08:10 UTC (rev 22) @@ -11,7 +11,7 @@ "Project-Id-Version: pysvnmanager\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-26 11:19+0800\n" +"PO-Revision-Date: 2008-07-27 13:23+0800\n" "Last-Translator: Jiang Xin <wor...@gm...>\n" "Language-Team: <zh...@li...>\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\n" @@ -21,25 +21,25 @@ "Generated-By: Babel 0.9.2\n" "X-Generator: KBabel 1.11.4\n" -#: pysvnmanager/controllers/authz.py:33 +#: pysvnmanager/controllers/authz.py:31 #: pysvnmanager/templates/authz/index.mako:159 #: pysvnmanager/templates/check/index.mako:10 msgid "All users(with anon)" msgstr "所有用户(含匿名)" -#: pysvnmanager/controllers/authz.py:34 +#: pysvnmanager/controllers/authz.py:32 #: pysvnmanager/templates/authz/index.mako:161 #: pysvnmanager/templates/check/index.mako:11 msgid "Known users" msgstr "注册用户" -#: pysvnmanager/controllers/authz.py:35 +#: pysvnmanager/controllers/authz.py:33 #: pysvnmanager/templates/authz/index.mako:163 #: pysvnmanager/templates/check/index.mako:12 msgid "Anonymous" msgstr "匿名用户" -#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:55 +#: pysvnmanager/controllers/authz.py:38 pysvnmanager/controllers/role.py:55 #: pysvnmanager/controllers/role.py:79 #: pysvnmanager/templates/authz/index.mako:155 #: pysvnmanager/templates/check/index.mako:17 @@ -50,7 +50,7 @@ msgid "Group:" msgstr "团队:" -#: pysvnmanager/controllers/authz.py:47 pysvnmanager/controllers/role.py:62 +#: pysvnmanager/controllers/authz.py:41 pysvnmanager/controllers/role.py:62 #: pysvnmanager/controllers/role.py:81 #: pysvnmanager/templates/authz/index.mako:157 #: pysvnmanager/templates/check/index.mako:19 @@ -61,8 +61,8 @@ msgid "Alias:" msgstr "别名:" -#: pysvnmanager/controllers/authz.py:67 pysvnmanager/controllers/authz.py:91 -#: pysvnmanager/controllers/check.py:93 pysvnmanager/controllers/role.py:48 +#: pysvnmanager/controllers/authz.py:59 pysvnmanager/controllers/authz.py:83 +#: pysvnmanager/controllers/check.py:91 pysvnmanager/controllers/role.py:48 #: pysvnmanager/templates/check/index.mako:9 #: pysvnmanager/templates/check/index.mako:23 #: pysvnmanager/templates/role/index.mako:12 @@ -70,32 +70,32 @@ msgid "Please choose..." msgstr "请选择..." -#: pysvnmanager/controllers/authz.py:155 +#: pysvnmanager/controllers/authz.py:146 #, python-format msgid "Repository %s not exist." msgstr "版本库 %s 不存在。" -#: pysvnmanager/controllers/authz.py:163 +#: pysvnmanager/controllers/authz.py:154 #, python-format msgid "Module %s not exist." msgstr "模组 %s 不存在。" -#: pysvnmanager/controllers/authz.py:169 +#: pysvnmanager/controllers/authz.py:160 msgid "You can not delete yourself from admin list." msgstr "您不能将自己从管理员列表中删除。" -#: pysvnmanager/controllers/authz.py:179 +#: pysvnmanager/controllers/authz.py:170 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 修改了授权策略。(rev:%(rev)s,%(msg)s)" -#: pysvnmanager/controllers/authz.py:203 +#: pysvnmanager/controllers/authz.py:194 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 删除了授权策略。(rev:%(rev)s,%(msg)s)" -#: pysvnmanager/controllers/check.py:70 -#: pysvnmanager/templates/auth_failed.mako:4 +#: pysvnmanager/controllers/check.py:68 +#: pysvnmanager/templates/auth_failed.mako:3 msgid "Permission denied." msgstr "没有权限。" @@ -134,93 +134,75 @@ msgid "User %s logged out" msgstr "用户 %s 登出" -#: pysvnmanager/model/svnauthz.py:58 +#: pysvnmanager/model/svnauthz.py:59 msgid "Name is not given." msgstr "未能提供名称。" -#: pysvnmanager/model/svnauthz.py:60 +#: pysvnmanager/model/svnauthz.py:61 msgid "Name is not string." msgstr "名称不是字符串" -#: pysvnmanager/model/svnauthz.py:64 +#: pysvnmanager/model/svnauthz.py:65 #, python-format -#| msgid "Name contains invalid characters." msgid "Name (%s) contains invalid characters." msgstr "名称(%s)中包含非法字符。" -#: pysvnmanager/model/svnauthz.py:222 -msgid "Aliasname is not provided." -msgstr "未能提供别名。" - -#: pysvnmanager/model/svnauthz.py:224 -msgid "Aliasname should not begin with &." -msgstr "别名的首字符不能是 &。" - -#: pysvnmanager/model/svnauthz.py:397 -msgid "Group name is not provided." -msgstr "未能提供团队名称。" - -#: pysvnmanager/model/svnauthz.py:399 -msgid "Group name should not begin with @." -msgstr "团队名称的首字符不能是 @。" - -#: pysvnmanager/model/svnauthz.py:469 +#: pysvnmanager/model/svnauthz.py:473 #, python-format msgid "Recursive group membership for %s" msgstr "%s 出现了循环组引用。" -#: pysvnmanager/model/svnauthz.py:561 +#: pysvnmanager/model/svnauthz.py:567 #, python-format -#| msgid "Not a valide username: %s" msgid "Not a valid username: %s" msgstr "非法用户名: %s" -#: pysvnmanager/model/svnauthz.py:686 +#: pysvnmanager/model/svnauthz.py:684 #, python-format msgid "Group %s is referenced by group %s." msgstr "用户组 %s 被组 %s 引用。" -#: pysvnmanager/model/svnauthz.py:1229 +#: pysvnmanager/model/svnauthz.py:1224 msgid "Update failed! You are working on a out-of-date revision." msgstr "更新失败!您的更改是基于一个过期的版本,请先刷新再更改。" -#: pysvnmanager/model/svnauthz.py:1461 pysvnmanager/model/svnauthz.py:1468 -#: pysvnmanager/model/svnauthz.py:1472 +#: pysvnmanager/model/svnauthz.py:1458 pysvnmanager/model/svnauthz.py:1465 +#: pysvnmanager/model/svnauthz.py:1469 #, python-format msgid "Unknown rule format: %s" msgstr "未知策略格式: %s" -#: pysvnmanager/model/svnauthz.py:1486 +#: pysvnmanager/model/svnauthz.py:1483 #, python-format msgid "No module exist for %s:%s" msgstr "模块不存在: %s:%s" -#: pysvnmanager/model/svnauthz.py:1597 +#: pysvnmanager/model/svnauthz.py:1592 #, python-format msgid "Alias %s is referenced by group %s." msgstr "别名 %s 为用户组 %s 引用。" -#: pysvnmanager/model/svnauthz.py:1609 +#: pysvnmanager/model/svnauthz.py:1604 #, python-format msgid "%s is referenced by [%s]." msgstr "%s 在 [%s] 中被引用。" -#: pysvnmanager/model/svnauthz.py:1746 +#: pysvnmanager/model/svnauthz.py:1741 #, python-format msgid "User %(username)s has Full (RW) rights for module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 具有完全权限 (RW)" -#: pysvnmanager/model/svnauthz.py:1748 +#: pysvnmanager/model/svnauthz.py:1743 #, python-format msgid "User %(username)s has ReadOnly (RO) rights for module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 具有只读权限 (RO)" -#: pysvnmanager/model/svnauthz.py:1750 +#: pysvnmanager/model/svnauthz.py:1745 #, python-format msgid "User %(username)s can *NOT* access to module %(repos)s:%(path)s" msgstr "用户 %(username)s 对模组 %(repos)s:%(path)s 没有访问权限 (XX)" -#: pysvnmanager/model/svnauthz.py:1788 +#: pysvnmanager/model/svnauthz.py:1783 #, python-format msgid "" "\n" @@ -239,7 +221,7 @@ "禁用: %(deny)s\n" "\n" -#: pysvnmanager/model/svnauthz.py:1807 +#: pysvnmanager/model/svnauthz.py:1802 #, python-format msgid "" "\n" @@ -481,14 +463,54 @@ msgid "Role Management" msgstr "角色管理" +#: pysvnmanager/templates/role/index.mako:420 +#| msgid "Update ACL failed:" +msgid "Update group failed:" +msgstr "更新用户组失败:" + +#: pysvnmanager/templates/role/index.mako:427 +#| msgid "Update ACL successfully." +msgid "Update group successfully." +msgstr "成功更新用户组。" + #: pysvnmanager/templates/role/index.mako:448 msgid "Are you sure to delete group:" msgstr "您确认要删除用户组:" +#: pysvnmanager/templates/role/index.mako:471 +#| msgid "Update ACL failed:" +msgid "Delete group failed:" +msgstr "更新用户组失败:" + +#: pysvnmanager/templates/role/index.mako:478 +#| msgid "Update ACL successfully." +msgid "Delete group successfully." +msgstr "成功删除用户组。" + +#: pysvnmanager/templates/role/index.mako:512 +#| msgid "Update ACL failed:" +msgid "Update alias failed:" +msgstr "更新别名失败:" + +#: pysvnmanager/templates/role/index.mako:519 +#| msgid "Update ACL successfully." +msgid "Update alias successfully." +msgstr "成功更新别名。" + #: pysvnmanager/templates/role/index.mako:539 msgid "Are you sure to delete alias:" msgstr "您确认要删除别名:" +#: pysvnmanager/templates/role/index.mako:562 +#| msgid "Update ACL failed:" +msgid "Delete alias failed:" +msgstr "删除别名失败:" + +#: pysvnmanager/templates/role/index.mako:569 +#| msgid "Update ACL successfully." +msgid "Delete alias successfully." +msgstr "成功删除别名。" + #: pysvnmanager/templates/role/index.mako:645 msgid "Select a role name:" msgstr "选择一个角色:" Modified: trunk/pysvnmanager/model/auth/http.py =================================================================== --- trunk/pysvnmanager/model/auth/http.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/model/auth/http.py 2008-07-27 17:08:10 UTC (rev 22) @@ -4,12 +4,14 @@ def htpasswd_login(username, password, config): authn_file = getattr(config, 'authn_file', '') + if isinstance(username, str): + username = unicode(username, 'utf-8') if authn_file: pwdfile = open(authn_file) for line in pwdfile: user, pwdhash = line.strip().split(':',1) - if username == user: + if username == unicode(user,'utf-8'): if pwdhash == crypt(password, pwdhash[:2]): return True break Modified: trunk/pysvnmanager/model/svnauthz.py =================================================================== --- trunk/pysvnmanager/model/svnauthz.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/model/svnauthz.py 2008-07-27 17:08:10 UTC (rev 22) @@ -628,7 +628,7 @@ buff = u"[aliases]\n" for alias in sorted(self.alias_list): buff += unicode(alias) - buff += '\n' + buff += u'\n' return buff @@ -689,11 +689,11 @@ return False def __str__(self): - buff = "[groups]\n" + buff = u"[groups]\n" for group in sorted(self.group_list): if group.name[0] != '$' and group.name != '*': buff += unicode(group) - buff += '\n' + buff += u'\n' return buff @@ -752,13 +752,13 @@ return (perm, deny) def __str__(self): - rstr = '' + rstr = u'' rbit = self.__rights if rbit & RIGHTS_R: - rstr += 'r' + rstr += u'r' if rbit & RIGHTS_W: - rstr += 'w' - return "%s = %s" % (self.userobj.uname, rstr) + rstr += u'w' + return u"%s = %s" % (self.userobj.uname, rstr) def __cmp__(self, obj): """For list sorting""" @@ -834,16 +834,16 @@ def __str__(self): if not self.__rule_list: - return '' + return u'' if self.repos == '/' or not self.repos: - buff = "[%s]\n" % self.path + buff = u"[%s]\n" % self.path else: - buff = "[%s:%s]\n" % (self.repos, self.path) + buff = u"[%s:%s]\n" % (self.repos, self.path) for rule in sorted(self.__rule_list): tmp = unicode(rule) if tmp: buff += tmp - buff += '\n' + buff += u'\n' return buff def __cmp__(self, obj): @@ -1023,12 +1023,12 @@ return True def __str__(self): - buff = '' + buff = u'' for i in sorted(self.module_list): tmp = unicode(i) if tmp: buff += tmp - buff += '\n' + buff += u'\n' return buff def __cmp__(self, obj): @@ -1100,7 +1100,7 @@ return False def __str__(self): - buff = '' + buff = u'' for repos in sorted(self.repos_list): tmp = unicode(repos) if tmp: @@ -1241,11 +1241,11 @@ buff = u"" buff += self.compose_version() buff += self.compose_acl() - buff += '\n' + buff += u'\n' buff += unicode(self.__grouplist) - buff += '\n' + buff += u'\n' buff += unicode(self.__aliaslist) - buff += '\n' + buff += u'\n' buff += unicode(self.__reposlist) return buff @@ -1325,11 +1325,11 @@ def compose_version(self): buff = "" if self.__version: - buff = "# version : %s\n" % self.__version + buff = u"# version : %s\n" % self.__version return buff def compose_acl(self): - buff = "" + buff = u"" for repos in self.__reposlist: admins = repos.admins if admins: @@ -1573,7 +1573,8 @@ alias = self.__aliaslist.get_or_set(aliasname) if isinstance(user, basestring): user = self.userlist.get_or_set(user) - alias.user = user + if user: + alias.user = user return alias def del_alias(self, name, force=False): Modified: trunk/pysvnmanager/templates/role/index.mako =================================================================== --- trunk/pysvnmanager/templates/role/index.mako 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/templates/role/index.mako 2008-07-27 17:08:10 UTC (rev 22) @@ -417,14 +417,14 @@ { if (message) { - message = '${"Update group failed:"}' + message; + message = '${_("Update group failed:")}' + message; alert(message); document.getElementById('result').innerHTML = message; document.getElementById('result').style.visibility = 'visible'; } else { - message = '${"Update group successfully."}'; + message = '${_("Update group successfully.")}'; document.getElementById('result').innerHTML = message; alert(message); if (document.main_form.role_list.value == rolename) @@ -468,14 +468,14 @@ { if (message) { - message = '${"Delete group failed:"}' + message; + message = '${_("Delete group failed:")}' + message; alert(message); document.getElementById('result').innerHTML = message; document.getElementById('result').style.visibility = 'visible'; } else { - message = '${"Delete group successfully."}'; + message = '${_("Delete group successfully.")}'; document.getElementById('result').innerHTML = message; alert(message); reset_main_form(); @@ -509,14 +509,14 @@ { if (message) { - message = '${"Update alias failed:"}' + message; + message = '${_("Update alias failed:")}' + message; alert(message); document.getElementById('result').innerHTML = message; document.getElementById('result').style.visibility = 'visible'; } else { - message = '${"Update alias successfully."}'; + message = '${_("Update alias successfully.")}'; document.getElementById('result').innerHTML = message; alert(message); if (document.main_form.role_list.value == aliasname) @@ -559,14 +559,14 @@ { if (message) { - message = '${"Delete alias failed:"}' + message; + message = '${_("Delete alias failed:")}' + message; alert(message); document.getElementById('result').innerHTML = message; document.getElementById('result').style.visibility = 'visible'; } else { - message = '${"Delete alias successfully."}'; + message = '${_("Delete alias successfully.")}'; document.getElementById('result').innerHTML = message; alert(message); reset_main_form(); Modified: trunk/pysvnmanager/tests/__init__.py =================================================================== --- trunk/pysvnmanager/tests/__init__.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/tests/__init__.py 2008-07-27 17:08:10 UTC (rev 22) @@ -38,15 +38,20 @@ class TestController(TestCase): def __init__(self, *args, **kwargs): + self.authz_file = os.path.dirname(__file__) + '/../../config/svn.access.test' wsgiapp = loadapp('config:test.ini', relative_to=conf_dir) self.app = paste.fixture.TestApp(wsgiapp) TestCase.__init__(self, *args, **kwargs) def rollback(self): src = os.path.dirname(__file__) + '/../config/svn.access.in' - dest = os.path.dirname(__file__) + '/../../config/svn.access.test' + dest = self.authz_file copyfile(src, dest) - + + def load_authz(self): + from pysvnmanager.model import svnauthz + return svnauthz.SvnAuthz(self.authz_file) + def login(self, username, password=""): res = self.app.get(url_for(controller='security')) form = res.forms[0] Modified: trunk/pysvnmanager/tests/functional/test_authz.py =================================================================== --- trunk/pysvnmanager/tests/functional/test_authz.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/tests/functional/test_authz.py 2008-07-27 17:08:10 UTC (rev 22) @@ -142,73 +142,175 @@ assert '' == res.body, res.body - def test_save_authz(self): + def test_set_repos_admin(self): # authn test - res = self.app.get(url_for(controller='authz', action='save_authz')) - assert res.status == 302 - self.assertEqual(res.header('location'), '/security') + try: + res = self.app.get(url_for(controller='authz', action='save_authz')) + assert res.status == 302 + self.assertEqual(res.header('location'), '/security') - # authz test - self.login('nobody') - res = self.app.get(url_for(controller='authz', action='save_authz')) - assert res.status == 200, res.status - self.assert_('Permission denied.' in res.body, res.body) + # authz test + self.login('nobody') + res = self.app.get(url_for(controller='authz', action='save_authz')) + assert res.status == 200, res.status + self.assert_('Permission denied.' in res.body, res.body) + + # Login as superuser + self.login('root') + params = {'reposname':'/', 'admins':''} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "You can not delete yourself from admin list." == res.body, res.body + finally: + self.rollback() + + try: + params = {'reposname':'/', 'admins':'root, @some'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + finally: + self.rollback() + + try: + self.login('jiangxin') + params = {'reposname':'/', 'admins':'&admin'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + finally: + self.rollback() + + try: + self.login('jiangxin') + params = {'reposname':'/', 'admins':'root'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "You can not delete yourself from admin list." == res.body, res.body + finally: + self.rollback() + + try: + self.login('root') + params = {'reposname':'/repos1', 'admins':'user1'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + finally: + self.rollback() - # Login as superuser - self.login('root') - params = {'reposname':'/', 'admins':''} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "You can not delete yourself from admin list." == res.body, res.body - self.rollback() + try: + self.login('root') + params = {'reposname':'/repos1', 'admins':'user1, root'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + finally: + self.rollback() - params = {'reposname':'/', 'admins':'root, @some'} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body - self.rollback() + try: + self.login('admin1') + params = {'reposname':'/repos1', 'admins':'user1, root'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "You can not delete yourself from admin list." == res.body, res.body - self.login('jiangxin') - params = {'reposname':'/', 'admins':'&admin'} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body - self.rollback() + self.login('admin1') + params = {'reposname':'/repos1', 'admins':'admin1, admin2'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + finally: + self.rollback() + + def test_set_rules(self): + # Modify rules for repos + try: + authz = self.load_authz() + module1 = authz.get_module('repos1', u'trunk/src') + self.assert_(module1 != None, type(module1)) + self.assert_(unicode(module1)=='[repos1:/trunk/src]\nuser1 = \n', unicode(module1).encode('utf-8')) + + self.login('root') + params = {'reposname':'/repos1', 'path':'/trunk/src', 'admins':'蒋鑫', 'rules':'@管理员=rw\n&别名1=r\n*=\nuser2=r', 'mode1':'edit', 'mode2':'edit' } + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + + authz = self.load_authz() + module1 = authz.get_module('repos1', u'trunk/src') + self.assert_(module1 != None, type(module1)) + self.assert_(unicode(module1)==u'[repos1:/trunk/src]\n&别名1 = r\n* = \n@管理员 = rw\nuser2 = r\n', unicode(module1).encode('utf-8')) + + # Test login using chinese username + self.login('蒋鑫') + params = {'reposname':'/repos1', 'path':'/trunk/src', 'admins':'其他', 'rules':'@管理员=rw\n&别名1=r\n*=\nuser2=r', 'mode1':'edit', 'mode2':'edit' } + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200, res.headers + assert "You can not delete yourself from admin list." in res.body, res.body + finally: + self.rollback() + + # Add New Repos + try: + authz = self.load_authz() + repos1 = authz.get_repos('reposX') + self.assert_(repos1 == None, type(repos1)) + + self.login('root') + params = {'reposname':'reposX', 'admins':'蒋鑫', 'rules':'@管理员=rw\n&别名1=r\n*=\nuser2=r', 'mode1':'new', 'mode2':'new' } + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body - self.login('jiangxin') - params = {'reposname':'/', 'admins':'root'} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "You can not delete yourself from admin list." == res.body, res.body - self.rollback() + authz = self.load_authz() + repos1 = authz.get_repos('reposX') + self.assert_(repos1 != None, type(repos1)) + self.assert_(unicode(repos1)==u'', unicode(repos1).encode('utf-8')) + self.assert_(repos1.admins==u'蒋鑫', repos1.admins.encode('utf-8')) + finally: + self.rollback() - self.login('root') - params = {'reposname':'/repos1', 'admins':'user1'} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body - self.rollback() - - self.login('root') - params = {'reposname':'/repos1', 'admins':'user1, root'} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body - self.rollback() - - self.login('admin1') - params = {'reposname':'/repos1', 'admins':'user1, root'} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "You can not delete yourself from admin list." == res.body, res.body + # Add New Repos with Module/Rules + try: + authz = self.load_authz() + repos1 = authz.get_repos('reposX') + self.assert_(repos1 == None, type(repos1)) - self.login('admin1') - params = {'reposname':'/repos1', 'admins':'admin1, admin2'} - res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body - self.rollback() - + self.login('root') + params = {'reposname':'reposX', 'admins':'蒋鑫', 'path':'/项目a', 'rules':'@管理员=rw\n&别名1=r\n*=\nuser2=r', 'mode1':'new', 'mode2':'new' } + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + + authz = self.load_authz() + repos1 = authz.get_repos('reposX') + self.assert_(unicode(repos1)==u'[reposX:/项目a]\n&别名1 = r\n* = \n@管理员 = rw\nuser2 = r\n\n', unicode(repos1).encode('utf-8')) + self.assert_(repos1.admins==u'蒋鑫', repos1.admins.encode('utf-8')) + finally: + self.rollback() + + # Test Repos/Module not exist Exception + try: + self.login('root') + params = {'reposname':'reposX', 'path':'/trunk/src', 'admins':'蒋鑫', 'rules':'@管理员=rw\n&别名1=r\n*=\nuser2=r', 'mode1':'edit', 'mode2':'edit' } + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "Repository reposX not exist." == res.body, res.body + finally: + self.rollback() + + # Test Repos/Module not exist Exception + try: + self.login('root') + params = {'reposname':'repos1', 'path':'/trunk/myproject', 'admins':'蒋鑫', 'rules':'@管理员=rw\n&别名1=r\n*=\nuser2=r', 'mode1':'edit', 'mode2':'edit' } + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "Module /trunk/myproject not exist." == res.body, res.body + finally: + self.rollback() + + def test_delete_authz(self): # authn test res = self.app.get(url_for(controller='authz', action='delete_authz')) @@ -220,3 +322,24 @@ res = self.app.get(url_for(controller='authz', action='delete_authz')) assert res.status == 200, res.status self.assert_('Permission denied.' in res.body, res.body) + + authz = self.load_authz() + module1 = authz.get_module('document', u'/trunk/行政部') + self.assert_(module1 != None, type(module1)) + + self.login('root') + params = {'reposname':'document', 'path':'/trunk/行政部'} + res = self.app.get(url_for(controller='authz', action='delete_authz'), params) + + authz = self.load_authz() + module1 = authz.get_module('document', u'/trunk/行政部') + self.assert_(module1 == None, type(module1)) + + try: + self.login('root') + params = {'reposname':'document', 'path':'/trunk/行政部', 'revision':'123'} + res = self.app.get(url_for(controller='authz', action='delete_authz'), params) + assert res.status == 200 + assert "Update failed! You are working on a out-of-date revision." in res.body, res.body + finally: + self.rollback() Modified: trunk/pysvnmanager/tests/functional/test_check.py =================================================================== --- trunk/pysvnmanager/tests/functional/test_check.py 2008-07-26 16:21:26 UTC (rev 21) +++ trunk/pysvnmanager/tests/functional/test_check.py 2008-07-27 17:08:10 UTC (rev 22) @@ -62,61 +62,152 @@ assert res.status == 200 assert '''<div id='acl_path_msg'>[repos1:/trunk/src/test] user1 =</div>''' in res.body, res.body - params['userinput'] = 'select' - params['reposinput'] = 'select' - params['pathinput'] = 'select' - params['userselector'] = 'user1' - params['reposselector'] = 'reposX' - params['pathselector'] = '/trunk/src/test' + params = { + 'userinput':'select', + 'reposinput':'select', + 'pathinput':'select', + 'userselector':'user1', + 'reposselector':'reposX', + 'pathselector':'/trunk/src/test', + 'abbr':'False', + } res = self.app.get(url_for(controller='check', action='access_map'), params) - assert '''<div id='acl_path_msg'>[reposX:/trunk/src/test] user1 = r</div>''' in res.body, res.body + assert '''<div id='acl_path_msg'>User user1 has ReadOnly (RO) rights for module reposX:/trunk/src/test</div><pre> +================================================== +Access map on 'reposX' for user 'user1' +================================================== + * Writable: + +---------------------------------------- + * Readable: + /branches + /tags + /trunk/src +---------------------------------------- + * Denied: + / + /trunk +---------------------------------------- +''' in res.body, res.body - params['userinput'] = 'manual' - params['reposinput'] = 'manual' - params['pathinput'] = 'manual' - params['username'] = 'user2' - params['reposname'] = 'repos1' - params['pathname'] = '/trunk/src/test' + params = { + 'userinput':'manual', + 'reposinput':'manual', + 'pathinput':'manual', + 'username':'user2', + 'reposname':'repos1', + 'pathname':'/trunk/src/test', + 'abbr':'1', + } res = self.app.get(url_for(controller='check', action='access_map'), params) assert '''<div id='acl_path_msg'>[repos1:/trunk/src/test] user2 = r</div>''' in res.body, res.body - params['userinput'] = 'select' - params['reposinput'] = 'select' - params['pathinput'] = 'manual' - params['userselector'] = 'user2' - params['reposselector'] = 'reposX' - params['pathname'] = '/trunk/' + params = { + 'userinput':'select', + 'reposinput':'select', + 'pathinput':'manual', + 'userselector':'user2', + 'reposselector':'reposX', + 'pathname':'/trunk/', + 'abbr':'1', + } res = self.app.get(url_for(controller='check', action='access_map'), params) assert '''<div id='acl_path_msg'>[reposX:/trunk] user2 =</div>''' in res.body, res.body - params['userinput'] = 'select' - params['reposinput'] = 'select' - params['pathinput'] = 'select' - params['userselector'] = 'user3' - params['reposselector'] = 'repos1' - params['pathselector'] = '/trunk' + params = { + 'userinput':'select', + 'reposinput':'select', + 'pathinput':'select', + 'userselector':'user3', + 'reposselector':'repos1', + 'pathselector':'/trunk', + 'abbr':'1', + } res = self.app.get(url_for(controller='check', action='access_map'), params) assert '''<div id='acl_path_msg'>[repos1:/trunk] user3 =</div>''' in res.body, res.body - params['userselector'] = 'user4' - params['reposselector'] = 'repos1' - params['pathselector'] = '/trunk' + params = { + 'userinput':'select', + 'reposinput':'select', + 'pathinput':'select', + 'userselector':'user4', + 'reposselector':'repos1', + 'pathselector':'/trunk', + 'abbr':'1', + } res = self.app.get(url_for(controller='check', action='access_map'), params) assert '''<div id='acl_path_msg'>[repos1:/trunk] user4 = r</div>''' in res.body, res.body - params['userselector'] = 'user4' - params['reposselector'] = 'reposX' - params['pathselector'] = '/trunk' + params = { + 'userinput':'select', + 'reposinput':'select', + 'pathinput':'select', + 'userselector':'user4', + 'reposselector':'reposX', + 'pathselector':'/trunk', + 'abbr':'1', + } res = self.app.get(url_for(controller='check', action='access_map'), params) assert '''<div id='acl_path_msg'>[reposX:/trunk] user4 = r</div>''' in res.body, res.body - params['userselector'] = 'user5' - params['reposselector'] = 'reposX' - params['pathselector'] = '/trunk' + params = { + 'userinput':'select', + 'reposinput':'select', + 'pathinput':'select', + 'userselector':'user5', + 'reposselector':'reposX', + 'pathselector':'/trunk', + 'abbr':'1', + } res = self.app.get(url_for(controller='check', action='access_map'), params) assert '''<div id='acl_path_msg'>[reposX:/trunk] user5 =</div>''' in res.body, res.body + ... [truncated message content] |
From: <ji...@us...> - 2008-07-17 10:08:58
|
Revision: 14 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=14&view=rev Author: jiangx Date: 2008-07-17 10:08:53 +0000 (Thu, 17 Jul 2008) Log Message: ----------- use Ajax.Request instead of Ajax.Updater. (demo for my document) Modified Paths: -------------- pysvnmanager/controllers/check.py pysvnmanager/templates/check/index.mako Modified: pysvnmanager/controllers/check.py =================================================================== --- pysvnmanager/controllers/check.py 2008-07-15 06:32:42 UTC (rev 13) +++ pysvnmanager/controllers/check.py 2008-07-17 10:08:53 UTC (rev 14) @@ -80,52 +80,26 @@ return msg - def get_path_options(self, repos=None, type=None, path=None): + def get_auth_path(self, repos=None, type=None, path=None): if self.__auth_failed(): return render('/auth_failed.mako') - # get params from arguments or from request - buff = '' - opts = '' + total = 0; + msg = '' + d = request.params + reposname = d.get('repos') + repos = self.authz.get_repos(reposname) if not repos: - d = request.params - repos = d.get('repos') - type = d.get('type', 'select') - if type == 'manual': - path = d.get('path') - else: - type = 'select' - path = d.get('path', '...') + return msg; - if repos and repos != '...' and repos in self.reposlist: - pathlist = self.authz.get_repos_path_list(repos) - opts = u"<option value='*'>%s</option>" % _("All modules") - for i in pathlist: - if i == path: - selected = 'selected' - else: - selected = '' - opts += "<option value='%(path)s' %(selected)s>%(path)s</option>" % {'path':i, 'selected':selected} + # get javascript code for top_form's role_selector + msg += 'id[0]="%s";' % '...' + msg += 'name[0]="%s";\n' % _("Please choose...") + total += 1; + for path in repos.path_list: + msg += 'id[%d]="%s";' % (total, path) + msg += 'name[%d]="%s";\n' % (total, path) + total += 1; + msg += 'total=%d;\n' % total - buff = u'''<input type='radio' name='pathinput' value='select' ''' - if type == 'select': - buff += ' checked ' - buff += '>' - buff += _("Select module") - buff += u''' -<select name="pathselector" size="0" onFocus="select_path(this.form)"> -%s -</select> -<br />''' % opts - - buff += '''<input type="radio" name="pathinput" value="manual" ''' - if type == 'manual': - buff += ' checked ' - buff += '>' - buff += _("Manual input") - buff += '<input type="text" name="pathname" value="' - if type == 'manual' and path: - buff += path - buff += '" onFocus="edit_path(this.form)">' - - return buff + return msg Modified: pysvnmanager/templates/check/index.mako =================================================================== --- pysvnmanager/templates/check/index.mako 2008-07-15 06:32:42 UTC (rev 13) +++ pysvnmanager/templates/check/index.mako 2008-07-17 10:08:53 UTC (rev 14) @@ -61,31 +61,46 @@ function update_path(form) { var repos = ""; - var path = ""; - var type = ""; if (form.reposinput[0].checked) { repos = form.reposselector.options[form.reposselector.selectedIndex].value; } else { repos = form.reposname.value; } - if (form.pathinput) { - if (form.pathinput[0].checked) { - if (form.pathselector.selectedIndex > -1) - path = form.pathselector.options[form.pathselector.selectedIndex].value; - type = 'select'; - } else { - path = form.pathname.value; - type = 'manual'; - } - } - var params = {repos:repos, path:path, type:type}; + var params = {repos:repos}; showNoticesPopup(); - new Ajax.Updater( - 'path', - '${h.url_for(controller="check", action="get_path_options")}', - {asynchronous:true, evalScripts:true, parameters: params}); - hideNoticesPopup(); + new Ajax.Request( + '${h.url_for(controller="check", action="get_auth_path")}', + {asynchronous:true, evalScripts:true, method:'post', + onComplete: + function(request) + {hideNoticesPopup();ajax_update_path(request.responseText);}, + parameters:params + }); } +function ajax_update_path(code) +{ + var id = new Array(); + var name = new Array(); + var total = 0; + + pathselector = document.forms[0].pathselector; + lastselect = pathselector.value; + pathselector.options.length = 0; + + try { + eval(code); + for (var i=0; i < total; i++) + { + pathselector.options[i] = new Option(name[i], id[i]); + if (id[i]==lastselect) + pathselector.options[i].selected = true; + } + } + catch(exception) { + alert(exception); + } +} + </SCRIPT> <h2>${_("Check Permissions")}</h2> @@ -94,10 +109,10 @@ ## ${h.form(h.url(action='permission'), method='post')} ## AJAX Form -<% +<% context.write( h.form_remote_tag( - html={'id':'checkform'}, + html={'id':'main_form'}, url=h.url(action='access_map'), update=dict(success="acl_msg", failure="acl_error"), method='post', before='showNoticesPopup()', @@ -141,6 +156,16 @@ </td> <td> + <input type="radio" name="pathinput" value="select" Checked> + ${_("Select module")} + <select name="pathselector" size="0" onFocus="select_path(this.form)"> + </select><br/> + <input type="radio" name="pathinput" value="manual"> + ${_("Manual input")} + <input type="text" name="pathname"" + onFocus="edit_path(this.form)"> + </td> + <td> <div id="path"> ## classic form: ${c.path_options} </div> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-15 06:32:32
|
Revision: 13 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=13&view=rev Author: jiangx Date: 2008-07-14 23:32:42 -0700 (Mon, 14 Jul 2008) Log Message: ----------- bugfix: ldap not import error Modified Paths: -------------- pysvnmanager/config/DefaultConfig.py Modified: pysvnmanager/config/DefaultConfig.py =================================================================== --- pysvnmanager/config/DefaultConfig.py 2008-07-15 06:09:04 UTC (rev 12) +++ pysvnmanager/config/DefaultConfig.py 2008-07-15 06:32:42 UTC (rev 13) @@ -35,7 +35,7 @@ ldap_binddn = '' ldap_bindpw = '' ldap_base = 'dc=foo,dc=bar' - ldap_scope = ldap.SCOPE_SUBTREE + ldap_scope = 2 # ldap.SCOPE_SUBTREE = 2 ldap_filter = '(&(uid=%(username)s)(authorizedService=svn)(ossxpConfirmed=TRUE))' ldap_timeout = 10 # how long we wait for the ldap server [s] ldap_coding = 'utf-8' # coding used for ldap queries and result values This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-15 06:08:56
|
Revision: 12 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=12&view=rev Author: jiangx Date: 2008-07-14 23:09:04 -0700 (Mon, 14 Jul 2008) Log Message: ----------- refactor: user defined function shouldn't named as __xxx__ Modified Paths: -------------- pysvnmanager/model/svnauthz.py pysvnmanager/tests/test_models.py Modified: pysvnmanager/model/svnauthz.py =================================================================== --- pysvnmanager/model/svnauthz.py 2008-07-15 06:07:00 UTC (rev 11) +++ pysvnmanager/model/svnauthz.py 2008-07-15 06:09:04 UTC (rev 12) @@ -111,11 +111,11 @@ self.__realname = realname self.__email = email - def __get_unique_name__(self): + def __get_unique_name(self): return self.__name - uname = property(__get_unique_name__) - name = property(__get_unique_name__) + uname = property(__get_unique_name) + name = property(__get_unique_name) def __cmp__(self, obj): """For userlist sorting""" @@ -141,6 +141,9 @@ return False return obj.lower() == self.uname.lower() + + def __str__(self): + return self.__name class Alias(object): @@ -210,40 +213,40 @@ self.__userobj = userobj - def __get_name__(self): + def __get_name(self): if self.__name: return self.__name else: return '' - name = property(__get_name__) - aliasname = property(__get_name__) + name = property(__get_name) + aliasname = property(__get_name) - def __get_unique_name__(self): + def __get_unique_name(self): if self.__name: return '&'+self.__name else: return '' - uname = property(__get_unique_name__) + uname = property(__get_unique_name) - def __get_username__(self): + def __get_username(self): if self.__userobj: return self.__userobj.name else: return '' - username = property(__get_username__) + username = property(__get_username) - def __get_user__(self): + def __get_user(self): return self.__userobj.name - def __set_user__(self, userobj): + def __set_user(self, userobj): if not isinstance(userobj, object): raise Exception, 'Wrong parameter for userobj.' self.__userobj = userobj - user = property(__get_user__, __set_user__) + user = property(__get_user, __set_user) def __str__(self): return "%s = %s" % (self.name, self.username) @@ -392,7 +395,7 @@ self.name = name self.__members = [] - def __get_unique_name__(self): + def __get_unique_name(self): if self.name: if self.name[0] != '$' and self.name != '*': return '@'+self.name @@ -401,20 +404,20 @@ else: return '' - uname = property(__get_unique_name__) + uname = property(__get_unique_name) - def __get_member_names__(self): + def __get_member_names(self): if self.__members: return map(lambda x: x.uname, self.__members) else: return [] - membernames = property(__get_member_names__) + membernames = property(__get_member_names) - def __get_member_objs__(self): + def __get_member_objs(self): return self.__members - memberobjs = property(__get_member_objs__) + memberobjs = property(__get_member_objs) def __str__(self): if self.name[0] != '$' and self.name != '*': @@ -426,7 +429,7 @@ for i in self.__members: yield i - def __valid_group__(self, groupobj, checked_groups=None): + def __valid_group(self, groupobj, checked_groups=None): """x.valid_group(groupobj) -> bool Check if there is cycle reference in group defination.""" @@ -440,35 +443,40 @@ # Add group to hash of checked groups. checked_groups.append(member) # Check for deadly loop recursively. - if not self.__valid_group__(member, checked_groups): + if not self.__valid_group(member, checked_groups): return False # Remove group to hash of checked groups. # Other group members may contain this group checked_groups.remove(member) return True - def append(self, member, autodrop=False): - if isinstance(member, (list, tuple)): - for i in member: - self.append(i, autodrop) - return True - if not member in self.__members: - self.__members.append(member) - if not self.__valid_group__(self): - self.__members.remove(member) - if not autodrop: - raise Exception, _('Recursive group membership for %s') \ - % member.uname - return True + def append(self, *members, **opts): + '''**opts: autodrop=False, raise Exception if recursive found.''' + autodrop = opts.get('autodrop', False) + for member in members: + if isinstance(member, (list, tuple)): + for i in member: + self.append(i, autodrop=autodrop) + continue + if not member in self.__members: + self.__members.append(member) + if not self.__valid_group(self): + self.__members.remove(member) + if not autodrop: + raise Exception, _('Recursive group membership for %s') \ + % member.uname + return - def remove(self, members): + def remove(self, *members): ulist = [] - if isinstance(members, (str, unicode)): - for user in members.split(','): - if user.strip(): - ulist.append(user.strip()) - elif isinstance(members, (list, tuple)): - ulist.extend(members) + for member in members: + if isinstance(member, (str, unicode)): + for user in member.split(','): + if user.strip(): + ulist.append(user.strip()) + elif isinstance(member, (list, tuple)): + ulist.extend(member) + for user in ulist: if isinstance(user, (str, unicode)): mlist = map(lambda x: x.uname, self.__members) @@ -609,11 +617,8 @@ alias = self.get(name.strip()) else: alias = name - if alias: + if alias and alias in self.alias_list: self.alias_list.remove(alias) - return True - else: - return False def __str__(self): buff = "[aliases]\n" @@ -706,12 +711,12 @@ self.userobj = userobj self.__rights = RIGHTS_NONE - def __get_unique_name__(self): + def __get_unique_name(self): return self.userobj.uname - uname = property(__get_unique_name__) + uname = property(__get_unique_name) - def __set_rights__(self, rights): + def __set_rights(self, rights): if isinstance(rights, (str, unicode)): rights = rights.strip().lower() rbit = RIGHTS_NONE @@ -725,10 +730,10 @@ self.__rights = rights - def __get_rights__(self): + def __get_rights(self): return self.__rights - rights = property(__get_rights__, __set_rights__) + rights = property(__get_rights, __set_rights) def get_permission(self, userobj): """x.get_permission(userobj) -> (permit_bits, deny_bits) @@ -776,10 +781,10 @@ for i in self.__rule_list: yield i - def __get_fullame__(self): + def __get_fullame(self): return self.repos+':'+self.path - fullname = property(__get_fullame__) + fullname = property(__get_fullame) def clean_rules(self): self.__rule_list = [] @@ -934,13 +939,13 @@ for i in self.module_list: yield i - def __get_name__(self): + def __get_name(self): return self.__repos_name - def __set_name__(self, name): + def __set_name(self, name): self.__repos_name = name.strip() - name = property(__get_name__, __set_name__) + name = property(__get_name, __set_name) def __get_path_list(self): return map(lambda x:x.path, self.module_list) @@ -1135,25 +1140,25 @@ if fileobj: self.load(fileobj) - def __get_userlist__(self): + def __get_userlist(self): return self.__userlist - userlist = property(__get_userlist__) + userlist = property(__get_userlist) - def __get_aliaslist__(self): + def __get_aliaslist(self): return self.__aliaslist - aliaslist = property(__get_aliaslist__) + aliaslist = property(__get_aliaslist) - def __get_grouplist__(self): + def __get_grouplist(self): return self.__grouplist - grouplist = property(__get_grouplist__) + grouplist = property(__get_grouplist) - def __get_reposlist__(self): + def __get_reposlist(self): return self.__reposlist - reposlist = property(__get_reposlist__) + reposlist = property(__get_reposlist) def __get_version(self): return self.__version @@ -1577,7 +1582,7 @@ def __check_ref_by_rules(self, name): if not name: - return False + return if isinstance(name, (User, Group, Alias)): name = name.uname @@ -1598,7 +1603,7 @@ if isinstance(name, (str, unicode)): if name and name[0] != '@' and name[0] != '$' and name != '*' : name = '@'+name - self.__check_ref_by_rules(name) + return self.__check_ref_by_rules(name) def check_rights(self, user, repos, path, required): if isinstance(user, (str, unicode)): Modified: pysvnmanager/tests/test_models.py =================================================================== --- pysvnmanager/tests/test_models.py 2008-07-15 06:07:00 UTC (rev 11) +++ pysvnmanager/tests/test_models.py 2008-07-15 06:09:04 UTC (rev 12) @@ -380,7 +380,7 @@ # del_alias self.authz.chk_alias_ref_by_rules('&root') - self.assert_(self.authz.del_alias('&root') == True) + self.authz.del_alias('&root') self.assertRaises(Exception, self.authz.chk_alias_ref_by_rules, '&superuser') self.assertRaises(Exception, self.authz.del_alias, '&superuser') self.assert_(','.join(map(lambda x:x.name, self.authz.aliaslist)) == This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-15 06:06:52
|
Revision: 11 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=11&view=rev Author: jiangx Date: 2008-07-14 23:07:00 -0700 (Mon, 14 Jul 2008) Log Message: ----------- comment ldap import by default Modified Paths: -------------- pysvnmanager/config/DefaultConfig.py pysvnmanager/config/localconfig.py.in setup.py Modified: pysvnmanager/config/DefaultConfig.py =================================================================== --- pysvnmanager/config/DefaultConfig.py 2008-07-14 07:20:04 UTC (rev 10) +++ pysvnmanager/config/DefaultConfig.py 2008-07-15 06:07:00 UTC (rev 11) @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from pylons import config -import ldap class DefaultConfig: """ Default config values @@ -21,9 +20,15 @@ # You can use htpasswd_login, or ldap_login, or both. # You can also implement your own auth module. #from pysvnmanager.model.auth.http import htpasswd_login + #auth = [htpasswd_login, ] # single auth method + + # Htpasswd login parameters + # Note: custom `authn_file' in your <deploy>.ini file + + #import ldap #from pysvnmanager.model.auth.ldap_login import ldap_login - #auth = [htpasswd_login, ] # single auth method #auth = [ldap_login, htpasswd_login] # both + #auth = [ldap_login] # ldap auth only # LDAP parameters ldap_uri = 'ldap://localhost' Modified: pysvnmanager/config/localconfig.py.in =================================================================== --- pysvnmanager/config/localconfig.py.in 2008-07-14 07:20:04 UTC (rev 10) +++ pysvnmanager/config/localconfig.py.in 2008-07-15 06:07:00 UTC (rev 11) @@ -2,8 +2,6 @@ from pysvnmanager.config.DefaultConfig import DefaultConfig -import ldap - class LocalConfig(DefaultConfig): # Svn authz file @@ -14,15 +12,17 @@ # You can also implement your own auth module. from pysvnmanager.model.auth.http import htpasswd_login auth = [htpasswd_login] - #from pysvnmanager.model.auth.ldap_login import ldap_login - #auth = [ldap_login, htpasswd_login] - + # Htpasswd login parameters # Note: custom `authn_file' in your <deploy>.ini file + #import ldap + #from pysvnmanager.model.auth.ldap_login import ldap_login + #auth = [ldap_login] + # LDAP login parameters - ldap_uri = 'ldap://localhost' - ldap_binddn = 'cn=ldapadmin,dc=foo,dc=bar' - ldap_bindpw = 'guess' - ldap_base = 'dc=foo,dc=bar' - ldap_filter = '(&(uid=%(username)s)(authorizedService=svn)(ossxpConfirmed=TRUE))' + #ldap_uri = 'ldap://localhost' + #ldap_binddn = 'cn=ldapadmin,dc=foo,dc=bar' + #ldap_bindpw = 'guess' + #ldap_base = 'dc=foo,dc=bar' + #ldap_filter = '(&(uid=%(username)s)(authorizedService=svn)(ossxpConfirmed=TRUE))' Modified: setup.py =================================================================== --- setup.py 2008-07-14 07:20:04 UTC (rev 10) +++ setup.py 2008-07-15 06:07:00 UTC (rev 11) @@ -12,6 +12,7 @@ author='Jiang Xin', author_email='jia...@os...', url='https://sourceforge.net/projects/pysvnmanager', + #install_requires=["Pylons>=0.9.6.2", "python-ldap"], install_requires=["Pylons>=0.9.6.2"], packages=find_packages(exclude=['ez_setup']), include_package_data=True, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-14 07:19:59
|
Revision: 10 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=10&view=rev Author: jiangx Date: 2008-07-14 00:20:04 -0700 (Mon, 14 Jul 2008) Log Message: ----------- patched setuptools support svn1.5 working space Modified Paths: -------------- pySvnManager.egg-info/SOURCES.txt setup.py Modified: pySvnManager.egg-info/SOURCES.txt =================================================================== --- pySvnManager.egg-info/SOURCES.txt 2008-07-11 12:17:44 UTC (rev 9) +++ pySvnManager.egg-info/SOURCES.txt 2008-07-14 07:20:04 UTC (rev 10) @@ -1,7 +1,12 @@ MANIFEST.in README.txt +development.ini setup.cfg setup.py +test.ini +config/Makefile +config/README +docs/index.txt pySvnManager.egg-info/PKG-INFO pySvnManager.egg-info/SOURCES.txt pySvnManager.egg-info/dependency_links.txt Modified: setup.py =================================================================== --- setup.py 2008-07-11 12:17:44 UTC (rev 9) +++ setup.py 2008-07-14 07:20:04 UTC (rev 10) @@ -7,7 +7,7 @@ setup( name='pySvnManager', - version="0.1.1", + version="0.1.2", description='SVN authz web management tools.', author='Jiang Xin', author_email='jia...@os...', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-11 12:17:35
|
Revision: 9 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=9&view=rev Author: jiangx Date: 2008-07-11 05:17:44 -0700 (Fri, 11 Jul 2008) Log Message: ----------- repos admin support group, alias Modified Paths: -------------- pysvnmanager/config/svn.access.in pysvnmanager/controllers/authz.py pysvnmanager/model/svnauthz.py pysvnmanager/tests/functional/test_authz.py pysvnmanager/tests/test_models.py test.ini Modified: pysvnmanager/config/svn.access.in =================================================================== --- pysvnmanager/config/svn.access.in 2008-07-11 12:14:22 UTC (rev 8) +++ pysvnmanager/config/svn.access.in 2008-07-11 12:17:44 UTC (rev 9) @@ -1,6 +1,6 @@ # version : 0.2.1 -# admin : / = root, jiangxin -# admin : repos1 = admin1, admin2, admin3 +# admin : / = root, &admin +# admin : repos1 = @admin # admin : repos2 = admin2 # admin : repos3 = admin3 Modified: pysvnmanager/controllers/authz.py =================================================================== --- pysvnmanager/controllers/authz.py 2008-07-11 12:14:22 UTC (rev 8) +++ pysvnmanager/controllers/authz.py 2008-07-11 12:17:44 UTC (rev 9) @@ -168,11 +168,12 @@ else: module = None - repos.admins = admins - if not repos.is_admin(self.login_as) and \ + if not self.authz.is_admin(self.login_as, repos.name, admins) and \ not (repos.name != '/' and self.authz.is_super_user(self.login_as)): raise Exception, _("You can not delete yourself from admin list.") + self.authz.set_admin(admins, repos) + if module: self.authz.set_rules(reposname, path, rules); self.authz.save(revision) Modified: pysvnmanager/model/svnauthz.py =================================================================== --- pysvnmanager/model/svnauthz.py 2008-07-11 12:14:22 UTC (rev 8) +++ pysvnmanager/model/svnauthz.py 2008-07-11 12:17:44 UTC (rev 9) @@ -32,16 +32,16 @@ def is_valide_name(name, type=""): msg = '' if type == 'repos': - pattern = r'''[,\s!\\'"]''' + bad_chars = r'''[,\s!\\'"]''' else: - pattern = r'''[,\s!\\/'"]''' + bad_chars = r'''[,\s!\\/'"]''' if not name: msg = _("Name is not given.") elif not isinstance(name, basestring): msg = _("Name is not string.") else: - p = re.compile(pattern) + p = re.compile(bad_chars) if p.search(name): msg = _("Name contains invalid characters.") return msg @@ -260,7 +260,7 @@ obj = obj.username elif isinstance(obj, (User, Group)): obj = obj.uname - else: + elif isinstance(obj, basestring): obj = obj.strip() if not obj: @@ -926,7 +926,7 @@ def __init__(self, name): name = name.strip() self.__repos_name = name - self.__admins = set() + self.__admins = [] self.module_list = [] self.authz = '' @@ -948,51 +948,35 @@ path_list = property(__get_path_list) def __get_admins(self): - return ', '.join(sorted(self.__admins)) + alist = [i.uname for i in self.__admins] + return ', '.join(sorted(alist)) def __set_admins(self, admins): - self.__admins.clear() + self.__admins = [] return self.add_admin(admins) - def add_admin(self, users): - """x.add_admin(users) -> bool""" - if isinstance(users, set): - self.__admins = self.__admins.union(users) - elif isinstance(users, (list, tuple)): - self.__admins = self.__admins.union(set(users)) - elif isinstance(users, (str, unicode)): - for user in users.split(','): - user = user.strip() - if user: - self.__admins.add(user) + def add_admin(self, admin): + """x.add_admin(admin)""" + if isinstance(admin, (User, Group, Alias)): + if not admin in self.__admins: + self.__admins.append(admin) + elif isinstance(admin, (list, tuple, set)): + for i in admin: + self.add_admin(i) else: - raise Exception, "unknown user: %s, type: %s" % (users, type(users)) - return True + raise Exception, "unknown user: %s, type: %s" % (admin, type(admin)) - def del_admin(self, users): - if isinstance(users, set): - self.__admins = self.__admins.difference(users) - elif isinstance(users, (list, tuple)): - self.__admins = self.__admins.difference(set(users)) - elif isinstance(users, (str, unicode)): - for user in users.split(','): - self.__admins.discard(user.strip()) + def del_admin(self, admin): + if isinstance(admin, (list, tuple, set)): + for i in admin: + self.del_admin(i) + elif isinstance(admin, (User, Group, Alias)): + self.__admins.remove(admin) else: - raise Exception, "unknown user: %s, type: %s" % (users, type(users)) - return True + raise Exception, "unknown user: %s, type: %s" % (admin, type(admin)) admins = property(__get_admins, __set_admins) - def is_admin(self, user): - """x.is_admin(user) -> bool - Whether user is the adminstrator of this Repos.""" - if isinstance(user, User): - name = user.name - else: - name = user - name = normalize_user(name) - return name in self.__admins - def add_module(self, path): path = normalize_path(path) @@ -1292,7 +1276,7 @@ admin = i.group(2).strip() if name and admin: repos = self.__reposlist.get_or_set(name) - repos.add_admin(admin) + self.set_admin(admin, repos) def parse_version(self): ic = self.config.initial_comment @@ -1334,12 +1318,33 @@ buff += "# admin : %s = %s\n" % (repos.name, admins) return buff - def is_admin(self, user, repos='/'): + def is_admin(self, user, repos='/', admins=None): + if isinstance(user, User): + user = user.uname + elif isinstance(user, Alias): + user = user.username + elif not user: + return False + repos = self.__reposlist.get(repos) + + if repos: + if admins is None: + admins = repos.admins + for i in admins.split(','): + if i: i = i.strip() + + if not i: continue + + if user == i: + return True - if repos and repos.is_admin(user): - return True - elif not repos or repos.name != '/': + i = self.get_userobj(i, autocreate=False) + + if i and user in i: + return True + + if not repos or repos.name != '/': return self.is_admin(user, '/') else: return False @@ -1347,26 +1352,33 @@ def is_super_user(self, user): return self.is_admin(user, '/') - def add_admin(self, user, reposname=None): - user = normalize_user(user) - if not user: + def set_admin(self, admins, repos=None): + if not isinstance(repos, Repos): + repos = self.__reposlist.get(repos) + if not repos: return False + + if isinstance(admins, basestring): + alist = [x.strip() for x in admins.split(',')] + elif isinstance(admins, (list, tuple, set)): + alist = admins + else: + alist = [admins] + ulist = [] + for i in alist: + if isinstance(i, (User, Group, Alias)): + ulist.append(i) + elif not i: + continue + elif isinstance(i, basestring): + ulist.append(self.get_userobj(i, autocreate=True)) + else: + raise Exception, "unknown user: %s, type: %s" % (i, type(i)) - repos = self.__reposlist.get(reposname) - if repos: - return repos.add_admin(user) - return False + repos.admins = ulist - def del_admin(self, user, reposname=None): - user = normalize_user(user) - if not user: - return False + return True - repos = self.__reposlist.get(reposname) - if repos: - return repos.del_admin(user) - return False - def add_repos(self, reposname): repos = self.__reposlist.get_or_set(reposname) return repos Modified: pysvnmanager/tests/functional/test_authz.py =================================================================== --- pysvnmanager/tests/functional/test_authz.py 2008-07-11 12:14:22 UTC (rev 8) +++ pysvnmanager/tests/functional/test_authz.py 2008-07-11 12:17:44 UTC (rev 9) @@ -56,7 +56,7 @@ id[4]="/tags";name[4]="/tags"; id[5]="/branches";name[5]="/branches"; total=6; -admin_users="jiangxin, root"; +admin_users="&admin, root"; revision="0.2.1"; ''' == res.body, res.body @@ -68,7 +68,7 @@ id[2]="/trunk";name[2]="/trunk"; id[3]="/";name[3]="/"; total=4; -admin_users="admin1, admin2, admin3"; +admin_users="@admin"; revision="0.2.1"; ''' == res.body, res.body @@ -79,38 +79,55 @@ res = self.app.get(url_for(controller='authz', action='save_authz'), params) assert res.status == 200 assert "You can not delete yourself from admin list." == res.body, res.body + self.rollback() - params = {'reposname':'/', 'admins':'root'} + params = {'reposname':'/', 'admins':'root, @some'} res = self.app.get(url_for(controller='authz', action='save_authz'), params) assert res.status == 200 assert "" == res.body, res.body self.rollback() + + self.login('jiangxin') + params = {'reposname':'/', 'admins':'&admin'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + self.rollback() + params = {'reposname':'/', 'admins':'root'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "You can not delete yourself from admin list." == res.body, res.body + self.rollback() + + + + self.login('root') params = {'reposname':'/repos1', 'admins':'user1'} res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body + #assert res.status == 200 + #assert "" == res.body, res.body self.rollback() self.login('root') params = {'reposname':'/repos1', 'admins':'user1, root'} res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body + #assert res.status == 200 + #assert "" == res.body, res.body self.rollback() self.login('admin1') params = {'reposname':'/repos1', 'admins':'user1, root'} res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "You can not delete yourself from admin list." == res.body, res.body + #assert res.status == 200 + #assert "You can not delete yourself from admin list." == res.body, res.body self.login('admin1') params = {'reposname':'/repos1', 'admins':'admin1, admin2'} res = self.app.get(url_for(controller='authz', action='save_authz'), params) - assert res.status == 200 - assert "" == res.body, res.body + #assert res.status == 200 + #assert "" == res.body, res.body self.rollback() Modified: pysvnmanager/tests/test_models.py =================================================================== --- pysvnmanager/tests/test_models.py 2008-07-11 12:14:22 UTC (rev 8) +++ pysvnmanager/tests/test_models.py 2008-07-11 12:17:44 UTC (rev 9) @@ -26,13 +26,15 @@ buff = ''' # version = 0.1.1 -# admin : / = jiangxin -# admin : repos1 = aq, zf -# admin : repos2 = jky +# admin : / = root, &admin +# admin : repos1 = @admin +# admin : repos2 = admin2 +# admin : repos3 = admin3 # admin : reposx = [groups] admins=&admin,&007 +admin=&admin, admin1, admin2, admin3 team1=user1,user11, @team2 team2=user2,user22,@team3, # Wrong configuration: cyclic dependancies @@ -189,62 +191,50 @@ pass def testReposAdmin(self): - user_list = UserList() - alias_list = AliasList() - group_list = GroupList() - repos_list = ReposList() + authz = SvnAuthz() + u1=authz.add_user('u1') + u2=authz.add_user('u2') + u3=authz.add_user('u3') + u4=authz.add_user('u4') + u5=authz.add_user('u5') + u6=authz.add_user('u6') + u7=authz.add_user('u7') + admin = authz.add_alias('admin', 'u1') + team1 = authz.add_group('team1', 'u2, u3, u4') + repos1 = authz.add_repos('repos1') + + authz.set_admin('&admin, u7') + authz.set_admin('@team1', 'repos1') + self.assert_(authz.get_repos('/').admins == '&admin, u7') + self.assert_(authz.get_repos('/repos1').admins == '@team1') + authz.set_admin(', @team1, ', 'repos1') + self.assert_(authz.get_repos('repos1').admins == '@team1') + authz.set_admin(['&admin', 'u6']) + self.assert_(authz.get_repos('/').admins == '&admin, u6') + authz.set_admin([admin, u5]) + self.assert_(authz.get_repos('/').admins == '&admin, u5') - repos = Repos('myrepos') + authz.set_admin('') + self.assert_(authz.get_repos('/').admins == '') + authz.set_admin([]) + self.assert_(authz.get_repos('/').admins == '') + authz.set_admin(None) + self.assert_(authz.get_repos('/').admins == '') - self.assert_(repos.admins == '') - - repos.add_admin('u1, u2, ') - self.assert_(repos.admins == 'u1, u2') - - repos.add_admin(u'u3') - self.assert_(repos.admins == 'u1, u2, u3') - - repos.admins = 'u1,u2,u3,u4' - self.assert_(repos.admins == 'u1, u2, u3, u4') - - repos.add_admin(('u5', 'u6',)) - self.assert_(repos.admins == 'u1, u2, u3, u4, u5, u6') - - repos.add_admin(set(['u6', 'u7', 'u8'])) - self.assert_(repos.admins == 'u1, u2, u3, u4, u5, u6, u7, u8') - - #print repos.admins - - repos.del_admin(set(['u7', 'u8', 'u9'])) - self.assert_(repos.admins == 'u1, u2, u3, u4, u5, u6') - - repos.del_admin(['u5', 'u6', 'u9']) - self.assert_(repos.admins == 'u1, u2, u3, u4') - - repos.del_admin(('u3', 'u6', 'u9')) - self.assert_(repos.admins == 'u1, u2, u4') - - repos.del_admin(ur'u2, u4, u9') - self.assert_(repos.admins == 'u1') - - self.assertRaises(Exception, repos.add_admin, {'name':'user1'}) - self.assertRaises(Exception, repos.add_admin, None) - self.assertRaises(Exception, repos.del_admin, {'name':'user1'}) - self.assertRaises(Exception, repos.del_admin, None) - def testAuthzConfAcl(self): if not self.authz: self.load_config() rl = self.authz.reposlist self.assert_(rl.get('/').name == '/') - self.assert_(rl.get('/').admins == 'jiangxin') + self.assert_(rl.get('/').admins == '&admin, root', rl.get('/').admins) self.assert_(rl.get('repos1').name == 'repos1') - self.assert_(rl.get('repos1').admins == 'aq, zf') + self.assert_(rl.get('repos1').admins == '@admin', rl.get('repos1').admins) self.assert_(rl.get('repos2').name == 'repos2', 'name: %s' % rl.get('repos2').name) - self.assert_(rl.get('repos2').admins == 'jky') + self.assert_(rl.get('repos2').admins == 'admin2', rl.get('repos2').admins) self.assert_(self.authz.compose_acl() == -'''# admin : / = jiangxin -# admin : repos1 = aq, zf -# admin : repos2 = jky +'''# admin : / = &admin, root +# admin : repos1 = @admin +# admin : repos2 = admin2 +# admin : repos3 = admin3 ''', self.authz.compose_acl()) pass @@ -268,6 +258,7 @@ sorted(gl.get('all').membernames)) self.assert_(str(gl) == '''[groups] +admin = &admin, admin1, admin2, admin3 admins = &007, &admin all = @team1, user3, user4 team1 = @team2, user1, user11 @@ -286,10 +277,9 @@ '/,repos1,repos2', ','.join(map(lambda x:x.name, self.authz.reposlist))) # add_admin - self.assert_(self.authz.is_admin('admin1') == False) - self.assert_(self.authz.add_admin('admin1,admin2') == True) + self.assert_(self.authz.set_admin('admin1,admin2') == True) self.assert_(self.authz.is_admin('admin1','/') == True) - self.assert_(self.authz.add_admin('adminx', 'repos1') == True) + self.assert_(self.authz.set_admin('adminx', 'repos1') == True) self.assert_(self.authz.is_admin('adminx', 'repos1') == True) self.assert_(self.authz.is_super_user('admin1') == True) self.assert_(self.authz.is_super_user('adminx') == False) @@ -445,34 +435,37 @@ self.load_config(init=True) # is_admin() self.assert_(self.authz.is_admin('jiangxin') == True) - self.assert_(self.authz.is_admin('jiangxin', '/') == True) - self.assert_(self.authz.is_admin('jiangxin','repos2') == True) - self.assert_(self.authz.is_admin('jky') == False) - self.assert_(self.authz.is_admin('jky','repos2') == True) - self.assert_(self.authz.is_admin('jky','repos3') == False) + self.assert_(self.authz.is_admin('root') == True, self.authz.is_admin('root')) + self.assert_(self.authz.is_super_user('jiangxin') == True) + self.assert_(self.authz.is_admin('&admin') == True) + self.assert_(self.authz.is_admin('admin1') == False) + self.assert_(self.authz.is_admin('admin1','repos1') == True) + self.assert_(self.authz.is_admin('admin4','repos1') == False) + self.assert_(self.authz.is_admin('admin1','repos2') == False) + self.assert_(self.authz.is_admin('admin2','repos2') == True) + self.assert_(self.authz.is_admin('admin10','repos2') == False) self.assert_(self.authz.is_admin('','repos3') == False) + self.assert_(self.authz.is_admin('jiangxin','repos123') == True) # add_admin() test - self.assert_(self.authz.add_admin('admin1,admin2') == True) - self.assert_(self.authz.add_admin(['admin1','admin2'],'repos1') == True) + self.assert_(self.authz.set_admin('admin1,admin2') == True) + self.assert_(self.authz.set_admin(['admin1','admin2'],'repos1') == True) # reposx does not exist. - self.assert_(self.authz.add_admin('admin2','reposx') == False) + self.assert_(self.authz.set_admin('admin2','reposx') == False) self.assert_(self.authz.is_admin('admin1','repos2') == True) - # del_admin() test - self.assert_(self.authz.del_admin('admin2') == True) - # repos2 is blank if acl is clean. - self.assert_(self.authz.del_admin('jky','repos2') == True) - # SvnAuthz __str__ test self.authz.update_revision() self.assert_(str(self.authz) == """# version : 0.1.2 -# admin : / = admin1, jiangxin -# admin : repos1 = admin1, admin2, aq, zf +# admin : / = admin1, admin2 +# admin : repos1 = admin1, admin2 +# admin : repos2 = admin2 +# admin : repos3 = admin3 [groups] +admin = &admin, admin1, admin2, admin3 admins = &007, &admin all = @team1, user3, user4 team1 = @team2, user1, user11 Modified: test.ini =================================================================== --- test.ini 2008-07-11 12:14:22 UTC (rev 8) +++ test.ini 2008-07-11 12:17:44 UTC (rev 9) @@ -46,7 +46,7 @@ unittest = True # Login test: user account and password -test_users = {'root':'guess', 'nobody':'guess', 'admin1':'guess', 'admin2':'guess'} +test_users = {'root':'guess', 'jiangxin':'guess', 'nobody':'guess', 'admin1':'guess', 'admin2':'guess'} # authn_file: a .htpasswd style password file, used for pysvnmanager authentication. authn_file = %(here)s/config/svn.passwd.test This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-11 12:14:12
|
Revision: 8 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=8&view=rev Author: jiangx Date: 2008-07-11 05:14:22 -0700 (Fri, 11 Jul 2008) Log Message: ----------- clear session if login failed Modified Paths: -------------- pysvnmanager/controllers/security.py Modified: pysvnmanager/controllers/security.py =================================================================== --- pysvnmanager/controllers/security.py 2008-07-11 12:04:50 UTC (rev 7) +++ pysvnmanager/controllers/security.py 2008-07-11 12:14:22 UTC (rev 8) @@ -39,7 +39,9 @@ redirect_to(session['path_before_login']) else: # if previous target is unknown just send the user to a welcome page redirect_to(h.url_for(controller='check')) - else: # + else: + session.clear() + session.save() c.login_message = _("Login failed for user: %s") % username return render('/login/login.mako') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-11 12:04:41
|
Revision: 7 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=7&view=rev Author: jiangx Date: 2008-07-11 05:04:50 -0700 (Fri, 11 Jul 2008) Log Message: ----------- bugfix: controller for login changed to security Modified Paths: -------------- pysvnmanager/tests/__init__.py Modified: pysvnmanager/tests/__init__.py =================================================================== --- pysvnmanager/tests/__init__.py 2008-07-10 15:14:12 UTC (rev 6) +++ pysvnmanager/tests/__init__.py 2008-07-11 12:04:50 UTC (rev 7) @@ -48,7 +48,7 @@ copyfile(src, dest) def login(self, username, password=""): - res = self.app.get(url_for(controller='login')) + res = self.app.get(url_for(controller='security')) form = res.forms[0] form['username'] = username if not password: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-10 15:14:06
|
Revision: 6 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=6&view=rev Author: jiangx Date: 2008-07-10 08:14:12 -0700 (Thu, 10 Jul 2008) Log Message: ----------- User shouldn't remove himself/herself from the admin list Modified Paths: -------------- config/Makefile pysvnmanager/controllers/authz.py pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po pysvnmanager/i18n/pysvnmanager.pot pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po pysvnmanager/templates/authz/index.mako pysvnmanager/tests/__init__.py pysvnmanager/tests/functional/test_authz.py test.ini Property Changed: ---------------- config/ Property changes on: config ___________________________________________________________________ Name: svn:ignore - svn.access svn.passwd localconfig.py + svn.access svn.passwd svn.access.test svn.passwd.test localconfig.py Modified: config/Makefile =================================================================== --- config/Makefile 2008-07-10 12:58:06 UTC (rev 5) +++ config/Makefile 2008-07-10 15:14:12 UTC (rev 6) @@ -1,14 +1,18 @@ SRCDIR=../pysvnmanager/config -CONFFILE=localconfig.py svn.access svn.passwd +CONFFILE=localconfig.py svn.access svn.passwd svn.access.test svn.passwd.test all: $(CONFFILE) clean: @-rm $(CONFFILE) >/dev/null 2>&1 - @-rm localconfig.py >/dev/null 2>&1 + @-rm localconfig.pyc >/dev/null 2>&1 %: $(SRCDIR)/%.in cp $< $@ +%.test: $(SRCDIR)/%.in + cp $< $@ + + .PHONY : all clean Modified: pysvnmanager/controllers/authz.py =================================================================== --- pysvnmanager/controllers/authz.py 2008-07-10 12:58:06 UTC (rev 5) +++ pysvnmanager/controllers/authz.py 2008-07-10 15:14:12 UTC (rev 6) @@ -141,7 +141,7 @@ msg = "" reposname = d.get('reposname') - admins = d.get('admins') + admins = d.get('admins', '') path = d.get('path') rules = d.get('rules') # mode1: new or edit repository @@ -158,14 +158,21 @@ if not repos: raise Exception, _("Repository %s not exist.") % reposname - if mode2 == "new": - module = self.authz.add_module(reposname, path) + if path: + if mode2 == "new": + module = self.authz.add_module(reposname, path) + else: + module = self.authz.get_module(reposname, path) + if not module: + raise Exception, _("Module %s not exist.") % path else: - module = self.authz.get_module(reposname, path) - if path and not module: - raise Exception, _("Module %s not exist.") % path + module = None repos.admins = admins + if not repos.is_admin(self.login_as) and \ + not (repos.name != '/' and self.authz.is_super_user(self.login_as)): + raise Exception, _("You can not delete yourself from admin list.") + if module: self.authz.set_rules(reposname, path, rules); self.authz.save(revision) Modified: pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po =================================================================== --- pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-10 12:58:06 UTC (rev 5) +++ pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po 2008-07-10 15:14:12 UTC (rev 6) @@ -1,6 +1,7 @@ # English translations for pysvnmanager. # Copyright (C) 2008 ORGANIZATION -# This file is distributed under the same license as the pysvnmanager project. +# This file is distributed under the same license as the pysvnmanager +# project. # FIRST AUTHOR <EMAIL@ADDRESS>, 2008. # msgid "" @@ -8,7 +9,7 @@ "Project-Id-Version: pysvnmanager 0.0.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-10 20:03+0800\n" +"PO-Revision-Date: 2008-07-10 22:14+0800\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: en <LL...@li...>\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -76,12 +77,16 @@ msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:175 +#: pysvnmanager/controllers/authz.py:171 +msgid "You can not delete yourself from admin list." +msgstr "" + +#: pysvnmanager/controllers/authz.py:179 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:199 +#: pysvnmanager/controllers/authz.py:203 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -319,6 +324,14 @@ msgid "Save failed." msgstr "" +#: pysvnmanager/templates/authz/index.mako:510 +msgid "Update ACL failed:" +msgstr "" + +#: pysvnmanager/templates/authz/index.mako:517 +msgid "Update ACL successfully." +msgstr "" + #: pysvnmanager/templates/authz/index.mako:539 msgid "No path selected." msgstr "" Modified: pysvnmanager/i18n/pysvnmanager.pot =================================================================== --- pysvnmanager/i18n/pysvnmanager.pot 2008-07-10 12:58:06 UTC (rev 5) +++ pysvnmanager/i18n/pysvnmanager.pot 2008-07-10 15:14:12 UTC (rev 6) @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pySvnManager 0.1.1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2008-07-10 20:03+0800\n" +"POT-Creation-Date: 2008-07-10 22:14+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL...@li...>\n" @@ -70,12 +70,16 @@ msgid "Module %s not exist." msgstr "" -#: pysvnmanager/controllers/authz.py:175 +#: pysvnmanager/controllers/authz.py:171 +msgid "You can not delete yourself from admin list." +msgstr "" + +#: pysvnmanager/controllers/authz.py:179 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" -#: pysvnmanager/controllers/authz.py:199 +#: pysvnmanager/controllers/authz.py:203 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "" @@ -310,6 +314,14 @@ msgid "Save failed." msgstr "" +#: pysvnmanager/templates/authz/index.mako:510 +msgid "Update ACL failed:" +msgstr "" + +#: pysvnmanager/templates/authz/index.mako:517 +msgid "Update ACL successfully." +msgstr "" + #: pysvnmanager/templates/authz/index.mako:539 msgid "No path selected." msgstr "" Modified: pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po =================================================================== --- pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-10 12:58:06 UTC (rev 5) +++ pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po 2008-07-10 15:14:12 UTC (rev 6) @@ -1,23 +1,25 @@ # translation of pysvnmanager.po to # Chinese (China) translations for pysvnmanager. # Copyright (C) 2008 ORGANIZATION -# This file is distributed under the same license as the pysvnmanager project. +# This file is distributed under the same license as the pysvnmanager +# project. # # FIRST AUTHOR <EMAIL@ADDRESS>, 2008. # Jiang Xin <wor...@gm...>, 2008. msgid "" msgstr "" -"Project-Id-Version: pysvnmanager\n" +"Project-Id-Version: pysvnmanager\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2008-07-03 22:14+0800\n" -"PO-Revision-Date: 2008-07-10 20:03+0800\n" +"PO-Revision-Date: 2008-07-10 22:15+0800\n" "Last-Translator: Jiang Xin <wor...@gm...>\n" -"Language-Team: <zh...@li...>\n" +"Language-Team: <zh...@li...>\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.2\n" +"X-Generator: KBabel 1.11.4\n" #: pysvnmanager/controllers/authz.py:22 #: pysvnmanager/templates/authz/index.mako:159 @@ -78,12 +80,16 @@ msgid "Module %s not exist." msgstr "模组 %s 不存在。" -#: pysvnmanager/controllers/authz.py:175 +#: pysvnmanager/controllers/authz.py:171 +msgid "You can not delete yourself from admin list." +msgstr "您不能将自己从管理员列表中删除。" + +#: pysvnmanager/controllers/authz.py:179 #, python-format msgid "User %(user)s changed authz rules. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 修改了授权策略。(rev:%(rev)s,%(msg)s)" -#: pysvnmanager/controllers/authz.py:199 +#: pysvnmanager/controllers/authz.py:203 #, python-format msgid "User %(user)s delete authz rules. (rev:%(rev)s,%(msg)s)" msgstr "用户 %(user)s 删除了授权策略。(rev:%(rev)s,%(msg)s)" @@ -136,7 +142,7 @@ #: pysvnmanager/controllers/security.py:43 #, python-format msgid "Login failed for user: %s" -msgstr "" +msgstr "以 %s 身份登录失败" #: pysvnmanager/controllers/security.py:51 #, python-format @@ -341,6 +347,15 @@ msgid "Save failed." msgstr "保存失败。" +#: pysvnmanager/templates/authz/index.mako:510 +#| msgid "Save failed." +msgid "Update ACL failed:" +msgstr "更新ACL失败:" + +#: pysvnmanager/templates/authz/index.mako:517 +msgid "Update ACL successfully." +msgstr "成功更新ACL。" + #: pysvnmanager/templates/authz/index.mako:539 msgid "No path selected." msgstr "未选择路径。" Modified: pysvnmanager/templates/authz/index.mako =================================================================== --- pysvnmanager/templates/authz/index.mako 2008-07-10 12:58:06 UTC (rev 5) +++ pysvnmanager/templates/authz/index.mako 2008-07-10 15:14:12 UTC (rev 6) @@ -507,14 +507,14 @@ { if (message) { - message = '${"Update ACL failed:"}' + message; + message = '${_("Update ACL failed:")}' + message; alert(message); document.getElementById('result').innerHTML = message; document.getElementById('result').style.visibility = 'visible'; } else { - message = '${"Update ACL successfully."}'; + message = '${_("Update ACL successfully.")}'; document.getElementById('result').innerHTML = message; alert(message); if (document.main_form.repos_list.value == reposname) Modified: pysvnmanager/tests/__init__.py =================================================================== --- pysvnmanager/tests/__init__.py 2008-07-10 12:58:06 UTC (rev 5) +++ pysvnmanager/tests/__init__.py 2008-07-10 15:14:12 UTC (rev 6) @@ -10,6 +10,7 @@ """ import os import sys +from shutil import copyfile from unittest import TestCase import pkg_resources @@ -41,6 +42,11 @@ self.app = paste.fixture.TestApp(wsgiapp) TestCase.__init__(self, *args, **kwargs) + def rollback(self): + src = os.path.dirname(__file__) + '/../config/svn.access.in' + dest = os.path.dirname(__file__) + '/../../config/svn.access.test' + copyfile(src, dest) + def login(self, username, password=""): res = self.app.get(url_for(controller='login')) form = res.forms[0] Modified: pysvnmanager/tests/functional/test_authz.py =================================================================== --- pysvnmanager/tests/functional/test_authz.py 2008-07-10 12:58:06 UTC (rev 5) +++ pysvnmanager/tests/functional/test_authz.py 2008-07-10 15:14:12 UTC (rev 6) @@ -2,7 +2,6 @@ from pysvnmanager.controllers import authz class TestAuthzController(TestController): - def test_index(self): # Test redirect to login pange res = self.app.get(url_for(controller='authz')) @@ -73,6 +72,48 @@ revision="0.2.1"; ''' == res.body, res.body + def test_delete_admin(self): + # Login as superuser + self.login('root') + params = {'reposname':'/', 'admins':''} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "You can not delete yourself from admin list." == res.body, res.body + + params = {'reposname':'/', 'admins':'root'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + self.rollback() + + self.login('root') + params = {'reposname':'/repos1', 'admins':'user1'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + self.rollback() + + self.login('root') + params = {'reposname':'/repos1', 'admins':'user1, root'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + self.rollback() + + self.login('admin1') + params = {'reposname':'/repos1', 'admins':'user1, root'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "You can not delete yourself from admin list." == res.body, res.body + + self.login('admin1') + params = {'reposname':'/repos1', 'admins':'admin1, admin2'} + res = self.app.get(url_for(controller='authz', action='save_authz'), params) + assert res.status == 200 + assert "" == res.body, res.body + self.rollback() + + def test_save_authz(self): pass Modified: test.ini =================================================================== --- test.ini 2008-07-10 12:58:06 UTC (rev 5) +++ test.ini 2008-07-10 15:14:12 UTC (rev 6) @@ -49,10 +49,10 @@ test_users = {'root':'guess', 'nobody':'guess', 'admin1':'guess', 'admin2':'guess'} # authn_file: a .htpasswd style password file, used for pysvnmanager authentication. -authn_file = %(here)s/config/svn.passwd +authn_file = %(here)s/config/svn.passwd.test # authz_file: svn authz config file with administrative extension. (ossxp.com) -authz_file = %(here)s/config/svn.access +authz_file = %(here)s/config/svn.access.test # Logging configuration [loggers] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ji...@us...> - 2008-07-10 12:57:59
|
Revision: 5 http://pysvnmanager.svn.sourceforge.net/pysvnmanager/?rev=5&view=rev Author: jiangx Date: 2008-07-10 05:58:06 -0700 (Thu, 10 Jul 2008) Log Message: ----------- add egg-info files Modified Paths: -------------- setup.py Added Paths: ----------- pySvnManager.egg-info/SOURCES.txt pySvnManager.egg-info/dependency_links.txt pySvnManager.egg-info/entry_points.txt pySvnManager.egg-info/paster_plugins.txt pySvnManager.egg-info/requires.txt pySvnManager.egg-info/top_level.txt Property Changed: ---------------- pySvnManager.egg-info/ Property changes on: pySvnManager.egg-info ___________________________________________________________________ Name: svn:ignore - SOURCES.txt top_level.txt PKG-INFO entry_points.txt dependency_links.txt not-zip-safe paster_plugins.txt requires.txt + PKG-INFO not-zip-safe Copied: pySvnManager.egg-info/SOURCES.txt (from rev 1, svnadmin.egg-info/SOURCES.txt) =================================================================== --- pySvnManager.egg-info/SOURCES.txt (rev 0) +++ pySvnManager.egg-info/SOURCES.txt 2008-07-10 12:58:06 UTC (rev 5) @@ -0,0 +1,65 @@ +MANIFEST.in +README.txt +setup.cfg +setup.py +pySvnManager.egg-info/PKG-INFO +pySvnManager.egg-info/SOURCES.txt +pySvnManager.egg-info/dependency_links.txt +pySvnManager.egg-info/entry_points.txt +pySvnManager.egg-info/not-zip-safe +pySvnManager.egg-info/paste_deploy_config.ini_tmpl +pySvnManager.egg-info/paster_plugins.txt +pySvnManager.egg-info/requires.txt +pySvnManager.egg-info/top_level.txt +pysvnmanager/__init__.py +pysvnmanager/websetup.py +pysvnmanager/config/DefaultConfig.py +pysvnmanager/config/DefaultConfig.pyc +pysvnmanager/config/__init__.py +pysvnmanager/config/__init__.pyc +pysvnmanager/config/environment.py +pysvnmanager/config/environment.pyc +pysvnmanager/config/localconfig.py.in +pysvnmanager/config/middleware.py +pysvnmanager/config/middleware.pyc +pysvnmanager/config/routing.py +pysvnmanager/config/routing.pyc +pysvnmanager/config/svn.access.in +pysvnmanager/config/svn.passwd.in +pysvnmanager/controllers/__init__.py +pysvnmanager/controllers/authz.py +pysvnmanager/controllers/check.py +pysvnmanager/controllers/error.py +pysvnmanager/controllers/role.py +pysvnmanager/controllers/security.py +pysvnmanager/controllers/template.py +pysvnmanager/i18n/pysvnmanager.pot +pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.mo +pysvnmanager/i18n/en/LC_MESSAGES/pysvnmanager.po +pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.mo +pysvnmanager/i18n/zh/LC_MESSAGES/pysvnmanager.po +pysvnmanager/lib/__init__.py +pysvnmanager/lib/app_globals.py +pysvnmanager/lib/base.py +pysvnmanager/lib/helpers.py +pysvnmanager/model/__init__.py +pysvnmanager/model/configobj.py +pysvnmanager/model/svnauthz.py +pysvnmanager/model/auth/__init__.py +pysvnmanager/model/auth/http.py +pysvnmanager/model/auth/ldap_login.py +pysvnmanager/templates/auth_failed.mako +pysvnmanager/templates/base.mako +pysvnmanager/templates/authz/index.mako +pysvnmanager/templates/check/index.mako +pysvnmanager/templates/login/loggedin.mako +pysvnmanager/templates/login/login.mako +pysvnmanager/templates/login/logout.mako +pysvnmanager/templates/role/index.mako +pysvnmanager/tests/__init__.py +pysvnmanager/tests/test_models.py +pysvnmanager/tests/functional/__init__.py +pysvnmanager/tests/functional/test_authz.py +pysvnmanager/tests/functional/test_check.py +pysvnmanager/tests/functional/test_login.py +pysvnmanager/tests/functional/test_role.py \ No newline at end of file Copied: pySvnManager.egg-info/dependency_links.txt (from rev 1, svnadmin.egg-info/dependency_links.txt) =================================================================== --- pySvnManager.egg-info/dependency_links.txt (rev 0) +++ pySvnManager.egg-info/dependency_links.txt 2008-07-10 12:58:06 UTC (rev 5) @@ -0,0 +1 @@ + Copied: pySvnManager.egg-info/entry_points.txt (from rev 1, svnadmin.egg-info/entry_points.txt) =================================================================== --- pySvnManager.egg-info/entry_points.txt (rev 0) +++ pySvnManager.egg-info/entry_points.txt 2008-07-10 12:58:06 UTC (rev 5) @@ -0,0 +1,7 @@ + + [paste.app_factory] + main = pysvnmanager.config.middleware:make_app + + [paste.app_install] + main = pylons.util:PylonsInstaller + \ No newline at end of file Copied: pySvnManager.egg-info/paster_plugins.txt (from rev 1, svnadmin.egg-info/paster_plugins.txt) =================================================================== --- pySvnManager.egg-info/paster_plugins.txt (rev 0) +++ pySvnManager.egg-info/paster_plugins.txt 2008-07-10 12:58:06 UTC (rev 5) @@ -0,0 +1,3 @@ +Pylons +WebHelpers +PasteScript Copied: pySvnManager.egg-info/requires.txt (from rev 1, svnadmin.egg-info/requires.txt) =================================================================== --- pySvnManager.egg-info/requires.txt (rev 0) +++ pySvnManager.egg-info/requires.txt 2008-07-10 12:58:06 UTC (rev 5) @@ -0,0 +1 @@ +Pylons>=0.9.6.2 \ No newline at end of file Copied: pySvnManager.egg-info/top_level.txt (from rev 1, svnadmin.egg-info/top_level.txt) =================================================================== --- pySvnManager.egg-info/top_level.txt (rev 0) +++ pySvnManager.egg-info/top_level.txt 2008-07-10 12:58:06 UTC (rev 5) @@ -0,0 +1 @@ +pysvnmanager Modified: setup.py =================================================================== --- setup.py 2008-07-10 12:32:42 UTC (rev 4) +++ setup.py 2008-07-10 12:58:06 UTC (rev 5) @@ -11,7 +11,7 @@ description='SVN authz web management tools.', author='Jiang Xin', author_email='jia...@os...', - url='http://www.ossxp.com/', + url='https://sourceforge.net/projects/pysvnmanager', install_requires=["Pylons>=0.9.6.2"], packages=find_packages(exclude=['ez_setup']), include_package_data=True, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |