• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

allura


Commit MetaInfo

修訂0e4a3d40e3defc5454c2658c55c778b44b63c4e8 (tree)
時間2010-05-20 02:05:46
作者Rick Copeland <rcopeland@geek...>
CommiterRick Copeland

Log Message

[#414] - Update user API so that it works if the user exists in SFX but not allura

Change Summary

差異

--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -87,7 +87,7 @@ class SVNCommit(Commit):
8787 result = cls(id=entry.revision.number, repo=repo)
8888 result.__dict__['_impl'] = entry
8989 result.author_username=entry.author
90- result.author=User.query.get(username=entry.author)
90+ result.author=User.by_username(entry.author)
9191 result.datetime=datetime.utcfromtimestamp(entry.date)
9292 return result
9393
--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -448,7 +448,7 @@ class PageController(object):
448448 if u['id'] == 'all':
449449 self.page.viewable_by.remove('all')
450450 else:
451- user = User.query.get(username=str(u['id']))
451+ user = User.by_username(str(u['id']))
452452 if user:
453453 self.page.viewable_by.remove(user.username)
454454 redirect('.')
--- a/pyforge/pyforge/controllers/auth.py
+++ b/pyforge/pyforge/controllers/auth.py
@@ -86,7 +86,7 @@ class AuthController(object):
8686 def save_new(self,display_name=None,open_ids=None,email_addresses=None,
8787 username=None,password=None):
8888 username = username.lower()
89- if M.User.query.get(username=username):
89+ if M.User.by_username(username):
9090 flash('That username is already taken. Please choose another.',
9191 'error')
9292 redirect('create_account')
@@ -130,7 +130,7 @@ class AuthController(object):
130130
131131 @expose()
132132 def do_setup_openid_user(self, username=None, display_name=None):
133- if M.User.query.get(username=username) and username != c.user.username:
133+ if M.User.by_username(username) and username != c.user.username:
134134 flash('That username is already taken. Please choose another.',
135135 'error')
136136 redirect('setup_openid_user')
@@ -173,7 +173,7 @@ class AuthController(object):
173173
174174 @expose()
175175 def do_login(self, username, password, came_from=None):
176- user = M.User.query.get(username=username)
176+ user = M.User.by_username(username)
177177 if user is None:
178178 session['userid'] = None
179179 session.save()
--- a/pyforge/pyforge/controllers/project.py
+++ b/pyforge/pyforge/controllers/project.py
@@ -408,7 +408,7 @@ class NeighborhoodAdminController(object):
408408 else:
409409 self.neighborhood.acl[permission].remove(None)
410410 if new.get('add'):
411- u = M.User.query.get(username=new['username'])
411+ u = M.User.by_username(new['username'])
412412 self.neighborhood.acl[permission].append(u._id)
413413 redirect('permissions')
414414
--- a/pyforge/pyforge/controllers/test.py
+++ b/pyforge/pyforge/controllers/test.py
@@ -90,7 +90,7 @@ class TestController(BaseController, ProjectController):
9090 def __call__(self, environ, start_response):
9191 c.app = None
9292 c.project = M.Project.query.get(shortname='test')
93- c.user = M.User.query.get(username=environ.get('username', 'test_admin'))
93+ c.user = M.User.by_username(environ.get('username', 'test_admin'))
9494 return BaseController.__call__(self, environ, start_response)
9595
9696 class DispatchTest(object):
--- a/pyforge/pyforge/ext/admin/admin_main.py
+++ b/pyforge/pyforge/ext/admin/admin_main.py
@@ -296,7 +296,7 @@ class ProjectAdminController(object):
296296 if new['id']:
297297 c.project.acl[permission].append(ObjectId(str(new['id'])))
298298 else:
299- user = M.User.query.get(username=new['username'])
299+ user = M.User.by_username(new['username'])
300300 if user is None:
301301 flash('No user %s' % new['username'], 'error')
302302 redirect('.')
@@ -334,7 +334,7 @@ class ProjectAdminController(object):
334334 if role is None: role = []
335335 for r in role:
336336 if r.get('new', {}).get('add'):
337- user = M.User.query.find({'username':str(r['new']['id'])}).first()
337+ user = M.User.by_username(str(r['new']['id']))
338338 if user:
339339 ur = user.project_role()
340340 if ObjectId(str(r['id'])) not in ur.roles:
--- a/pyforge/pyforge/ext/sfx/lib/sfx_api.py
+++ b/pyforge/pyforge/ext/sfx/lib/sfx_api.py
@@ -1,12 +1,54 @@
11 import json
22 import httplib
3+import urllib2
34 from contextlib import closing
45
56 from tg import config
67 from pylons import c, request
78
9+from pyforge import model as M
810 from pyforge.lib.security import roles_with_project_access
911
12+class SFXUserApi(object):
13+
14+ def __init__(self):
15+ self.project_host = config.get('sfx.api.host', None)
16+ self.project_path = config.get('sfx.api.project_path', '/api/user')
17+
18+ def _username_api_url(self, username):
19+ return 'http://%s/api/user/username/%s/json' % (
20+ self.project_host or request.host,
21+ username)
22+
23+ def _userid_api_url(self, id):
24+ return 'http://%s/api/user/id/%s/json' % (
25+ self.project_host or request.host,
26+ id)
27+
28+ def user_data(self, username, timeout=2):
29+ """
30+ given a sfnet hostname and userid, returns a dict of user data
31+ """
32+ try:
33+ url = self._userid_api_url(int(username))
34+ except TypeError:
35+ url = self._username_api_url(username)
36+ url_handle = urllib2.urlopen(url, timeout=timeout)
37+ return json.load(url_handle)['User']
38+
39+ def upsert_user(self, username, user_data=None):
40+ if user_data is None:
41+ user_data = self.user_data(username)
42+ u = M.User.query.get(username=username)
43+ if u is None:
44+ u = M.User(username=username)
45+ n = M.Neighborhood.query.get(name='Users')
46+ n.register_project('u/' + u.username, u, user_project=True)
47+ if u.display_name != user_data['name']:
48+ u.display_name = user_data.name
49+ if u.sfx_userid != user_data['id']:
50+ u.sfx_userid = user_data['id']
51+
1052 class SFXProjectApi(object):
1153
1254 def __init__(self):
--- a/pyforge/pyforge/ext/user_profile/user_main.py
+++ b/pyforge/pyforge/ext/user_profile/user_main.py
@@ -71,13 +71,13 @@ class UserProfileController(object):
7171 @expose('pyforge.ext.user_profile.templates.user_index')
7272 def index(self):
7373 username = c.project.shortname.split('/')[1]
74- user = User.query.find({'username':username}).first()
74+ user = User.by_username(username)
7575 return dict(user=user)
7676
7777 @expose('pyforge.ext.user_profile.templates.user_dashboard_configuration')
7878 def configuration(self):
7979 username = c.project.shortname.split('/')[1]
80- user = User.query.find({'username':username}).first()
80+ user = User.by_username(username)
8181 return dict(user=user)
8282
8383 @h.vardec
@@ -132,7 +132,7 @@ class UserProfileController(object):
132132 """
133133
134134 username = c.project.shortname.split('/')[1]
135- user = User.query.get(username=username)
135+ user = User.by_username(username)
136136 parts = [p for p in repo_path.split(os.path.sep) if p]
137137 project_path = '/' + '/'.join(parts[1:])
138138 project, rest = h.find_project(project_path)
--- a/pyforge/pyforge/lib/custom_middleware.py
+++ b/pyforge/pyforge/lib/custom_middleware.py
@@ -88,18 +88,8 @@ class SfxLoginMiddleware(object):
8888 if sfx_user_id:
8989 server_name = request.environ['HTTP_HOST']
9090 user_data = mgr.user_data(server_name, sfx_user_id)
91- user = M.User.query.get(username=user_data['username'])
92- if not user:
93- with fake_pylons_context(request):
94- user = M.User(username=user_data['username'],
95- display_name=user_data['name'])
96- n = M.Neighborhood.query.get(name='Users')
97- n.register_project('u/' + user.username, user, user_project=True)
98- if user.display_name != user_data['name']:
99- user.display_name = user_data['name']
100- sfx_user_id_num = int(sfx_user_id.split(':')[-1])
101- if user.sfx_userid != sfx_user_id_num:
102- user.sfx_userid = sfx_user_id_num
91+ with fake_pylons_context(request):
92+ user = M.User.by_username(user_data['username'], user_data)
10393 session['sfx-sessid'] = request.cookies[cookie_name]
10494 session['userid'] = user._id
10595 session.save()
--- a/pyforge/pyforge/model/auth.py
+++ b/pyforge/pyforge/model/auth.py
@@ -170,11 +170,20 @@ class User(MappedClass):
170170 return '/u/' + self.username + '/'
171171
172172 @classmethod
173- def by_email_address(self, addr):
173+ def by_email_address(cls, addr):
174174 ea = EmailAddress.query.get(_id=addr)
175175 if ea is None: return None
176176 return ea.claimed_by_user()
177177
178+ @classmethod
179+ def by_username(cls, name, extra=None):
180+ u = cls.query.get(username=name)
181+ if u is None and config.get('auth.method', 'local') == 'sfx':
182+ from pyforge.ext.sfx.lib import sfx_api
183+ api = sfx_api.SFXUserApi()
184+ u = api.upsert_user(name, extra)
185+ return u
186+
178187 def address_object(self, addr):
179188 return EmailAddress.query.get(_id=addr, claimed_by_user_id=self._id)
180189