diff --git a/ddportfolioservice/controllers/ddportfolio.py b/ddportfolioservice/controllers/ddportfolio.py index d578f18..0c1e7f6 100644 --- a/ddportfolioservice/controllers/ddportfolio.py +++ b/ddportfolioservice/controllers/ddportfolio.py @@ -26,6 +26,7 @@ import simplejson from ddportfolioservice.lib.base import * from ddportfolioservice.model.form import * from ddportfolioservice.model.urlbuilder import * +from ddportfolioservice.model import dddatabuilder log = logging.getLogger(__name__) @@ -115,7 +116,7 @@ developer name on all bug logs)'), def urllist(self): """Handle the actual data.""" - schema = DeveloperData() + schema = DDDataRequest() try: formencode.api.set_stdtranslation( domain="FormEncode", @@ -124,9 +125,31 @@ developer name on all bug logs)'), except formencode.validators.Invalid, error: c.messages = { 'errors' : error.unpack_errors() } return render('/showform.mako') - data = build_urls(form_result) - if 'mode' in request.params and request.params['mode'] == 'json': - response.headers['Content-Type'] = 'text/json' + fields = dddatabuilder.build_data(form_result['email']) + rp = request.params.copy() + if fields['isdd']: + for tuple in (('name', 'name'), + ('gpgfp', 'gpgfp'), + ('username', 'username'), + ('aliothusername', 'username'), + ('nonddemail', 'email')): + if not tuple[0] in rp or not rp[tuple[0]]: + rp[tuple[0]] = fields[tuple[1]] + if not 'mode' in rp or not rp['mode']: + rp['mode'] = 'json' + + schema = DeveloperData() + try: + formencode.api.set_stdtranslation( + domain="FormEncode", + languages=[lang[0:2] for lang in request.languages]) + form_result = schema.to_python(rp) + except formencode.validators.Invalid, error: + c.messages = { 'errors' : error.unpack_errors() } + return render('/showform.mako') + data = build_urls(rp) + if 'mode' in rp and rp['mode'] == 'json': + response.headers['Content-Type'] = 'text/javascript' return simplejson.dumps( dict([("%s.%s" % \ (entry[1], entry[2]), entry[3]) \ diff --git a/ddportfolioservice/controllers/showformscripts.py b/ddportfolioservice/controllers/showformscripts.py index 72a0aeb..22f80e9 100644 --- a/ddportfolioservice/controllers/showformscripts.py +++ b/ddportfolioservice/controllers/showformscripts.py @@ -25,8 +25,7 @@ import simplejson from ddportfolioservice.lib.base import * from ddportfolioservice.model.form import * -from ddportfolioservice.model import keyfinder -from webob.exc import HTTPBadRequest +from ddportfolioservice.model import dddatabuilder log = logging.getLogger(__name__) @@ -53,17 +52,7 @@ class ShowformscriptsController(BaseController): errors = error.unpack_errors() abort(400, "\n".join( ["%s: %s" % (key, errors[key]) for key in errors])) - - fields = dict([(field, func(str(form_result['email']))) \ - for (field, func) in \ - [('gpgfp', keyfinder.getFingerprintByEmail), - ('name', keyfinder.getRealnameByEmail), - ('username', keyfinder.getLoginByEmail)]]) - fields['email'] = form_result['email'] - if fields['username'] and fields['gpgfp'] and fields['name']: - fields['isdd'] = 1 - else: - fields['isdd'] = 0 + fields = dddatabuilder.build_data(form_result['email']) log.debug(fields) response.headers['Content-Type'] = 'text/plain' return simplejson.dumps(fields) diff --git a/ddportfolioservice/model/dddatabuilder.py b/ddportfolioservice/model/dddatabuilder.py new file mode 100644 index 0000000..455ad35 --- /dev/null +++ b/ddportfolioservice/model/dddatabuilder.py @@ -0,0 +1,38 @@ +# -*- python -*- +# -*- coding: utf-8 -*- +# +# DDPortfolio service DD data builder +# Copyright (c) 2009 Jan Dittberner +# +# This file is part of DDPortfolio service. +# +# DDPortfolio service is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero General Public License +# as published by the Free Software Foundation, either version 3 of +# the License, or (at your option) any later version. +# +# DDPortfolio service is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with this program. If not, see +# . +# +from ddportfolioservice.model import keyfinder + + +def build_data(email_address): + """Build a DD data structure from a given email address.""" + fields = dict([(field, func(str(email_address))) \ + for (field, func) in \ + [('gpgfp', keyfinder.getFingerprintByEmail), + ('name', keyfinder.getRealnameByEmail), + ('username', keyfinder.getLoginByEmail)]]) + fields['email'] = email_address + if fields['username'] and fields['gpgfp'] and fields['name']: + fields['isdd'] = 1 + else: + fields['isdd'] = 0 + return fields diff --git a/ddportfolioservice/model/form.py b/ddportfolioservice/model/form.py index ecd0a03..b88640c 100644 --- a/ddportfolioservice/model/form.py +++ b/ddportfolioservice/model/form.py @@ -38,5 +38,6 @@ class DeveloperData(formencode.Schema): class DDDataRequest(formencode.Schema): """Validation schema for DDData request.""" - allow_extra_fields = False + allow_extra_fields = True + filter_extra_fields = False email = formencode.validators.Email(not_empty=True) diff --git a/ddportfolioservice/model/keyfinder.py b/ddportfolioservice/model/keyfinder.py index f70566c..59318e1 100644 --- a/ddportfolioservice/model/keyfinder.py +++ b/ddportfolioservice/model/keyfinder.py @@ -42,7 +42,7 @@ def _get_keyring_cache(): def _get_cached(cachekey): cache = _get_keyring_cache() if cachekey in cache: - return cache[cachekey].split(':') + return cache[cachekey] return None def getFingerprintByEmail(email):