From f33f6c7751547fc14645a5b11e33b3348b2ef453 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Wed, 21 Jan 2009 01:11:01 +0100 Subject: [PATCH] implement URL generation move code for URL generation to model/urlbuilder.py add format selection to input form create output template --- ddportfolioservice/controllers/ddportfolio.py | 9 +- ddportfolioservice/ddportfolio.py | 101 ------------------ ddportfolioservice/lib/base.py | 1 + .../{ => model}/ddportfolio.ini | 12 +-- ddportfolioservice/model/urlbuilder.py | 30 ++++++ ddportfolioservice/templates/showform.mako | 2 + ddportfolioservice/templates/showurls.mako | 34 ++++++ 7 files changed, 81 insertions(+), 108 deletions(-) delete mode 100644 ddportfolioservice/ddportfolio.py rename ddportfolioservice/{ => model}/ddportfolio.ini (70%) create mode 100644 ddportfolioservice/model/urlbuilder.py create mode 100644 ddportfolioservice/templates/showurls.mako diff --git a/ddportfolioservice/controllers/ddportfolio.py b/ddportfolioservice/controllers/ddportfolio.py index 8434b5f..7c7702d 100644 --- a/ddportfolioservice/controllers/ddportfolio.py +++ b/ddportfolioservice/controllers/ddportfolio.py @@ -1,7 +1,9 @@ import logging +import simplejson from ddportfolioservice.lib.base import * from ddportfolioservice.model.form import * +from ddportfolioservice.model.urlbuilder import * log = logging.getLogger(__name__) @@ -20,4 +22,9 @@ class DdportfolioController(BaseController): except formencode.validators.Invalid, error: c.messages = { 'errors' : error.unpack_errors() } return render('/showform.mako') - return ["done"] + data = build_urls(form_result) + if 'mode' in request.params and request.params['mode'] == 'json': + response.headers['Content-Type'] = 'text/json' + return simplejson.dumps(data['data']) + c.urldata = data + return render('/showurls.mako') diff --git a/ddportfolioservice/ddportfolio.py b/ddportfolioservice/ddportfolio.py deleted file mode 100644 index 361cdc0..0000000 --- a/ddportfolioservice/ddportfolio.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- python -*- -# -*- coding: utf8 -*- - -from paste.request import parse_formvars -import pkg_resources -import simplejson -from ConfigParser import ConfigParser -from urllib import quote_plus -import logging -import sys -import formencode -from gettext import gettext as _ -from formencode import validators - -logging.basicConfig(level=logging.DEBUG, stream=sys.stderr) - -my_config = ConfigParser() -my_config.readfp(pkg_resources.resource_stream(__name__, 'ddportfolio.ini')) - - -def build_urls(fields): - """Build personalized URLs using the developer information in - fields.""" - result = {} - qfields = dict([(key, quote_plus(fields[key])) for key in fields]) - for section in my_config.sections(): - if my_config.has_option(section, 'urls'): - for url in my_config.get(section, 'urls').split(','): - if my_config.has_option(section, url + '.pattern'): - try: - result[section + '.' + url] = \ - my_config.get(section, url + '.pattern', - False, qfields) - except Exception, e: - logging.error(_("unable to parse %s: %s") % - (my_config.get(section, url + - '.pattern', True), e)) - return result - -class DeveloperData(formencode.Schema): - name = validators.String(not_empty=True) - email = validators.Email(not_empty=True) - username = validators.PlainText(not_empty=True) - -def validate_input(fields): - logging.debug(fields) - return DeveloperData().to_python(fields) - -def gather_additional_info(fields): - logging.debug(fields) - return fields - -def application(environ, start_response): - """WSGI application entry point.""" - if environ['REQUEST_METHOD'] == 'POST': - try: - fields = gather_additional_info( - validate_input(parse_formvars(environ))) - except formencode.Invalid, e: - start_response('400 Bad Request', [('content-type', 'text/plain')]) - return ["input validation failed\n", e.unpack_errors()] - data = build_urls(fields) - if ('mode' in fields and fields['mode'] == 'json'): - start_response('200 OK', [('content-type', 'text/json')]) - return [simplejson.dumps(data)] - else: - start_response('200 OK', [('content-type', 'text/html')]) - return [''' -''', _("Debian Developer Portfolio"),''' - -'] - else: - start_response('200 OK', [('content-type', 'text/html')]) - return [''' - - ''', _('Debian Developer Portfolio'), ''' - - -
-
- ''', _('Debian Developer Portfolio'), ''' -
-
-
-
-
-
- -
-
- -'''] - -if __name__ == '__main__': - from paste import httpserver - httpserver.serve(application, host='127.0.0.1', port='8080') diff --git a/ddportfolioservice/lib/base.py b/ddportfolioservice/lib/base.py index 0bad547..be55c0a 100644 --- a/ddportfolioservice/lib/base.py +++ b/ddportfolioservice/lib/base.py @@ -26,6 +26,7 @@ class BaseController(WSGIController): add_fallback(lang) except: pass + c.messages = { 'errors': [], 'messages': [] } return WSGIController.__call__(self, environ, start_response) # Include the '_' function in the public names diff --git a/ddportfolioservice/ddportfolio.ini b/ddportfolioservice/model/ddportfolio.ini similarity index 70% rename from ddportfolioservice/ddportfolio.ini rename to ddportfolioservice/model/ddportfolio.ini index 888340a..37c6d89 100644 --- a/ddportfolioservice/ddportfolio.ini +++ b/ddportfolioservice/model/ddportfolio.ini @@ -9,13 +9,13 @@ received.pattern=http://bugs.debian.org/%(email)s reported.pattern=http://bugs.debian.org/from:%(email)s bugstats.pattern=http://asdfasdf.debian.net/~tar/bugstats/?%(email)s usertags.pattern=http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=%(email)s -searchall.pattern=http://merkel.debian.org/~don/cgi/search.cgi?phrase=%(name)s&search=search +searchall.pattern=http://merkel.debian.org/~don/cgi/search.cgi?phrase=%(name)s&search=search wnpp.pattern=http://qa.debian.org/developer.php?wnpp=%(email)s [build] urls=buildd,igloo,svnbuildstat buildd.pattern=http://buildd.debian.org/pkg.cgi?maint=%(email)s -igloo.pattern=http://oldpeople.debian.org/~igloo/status.php?email=%(email)s&thin=on +igloo.pattern=http://oldpeople.debian.org/~igloo/status.php?email=%(email)s&thin=on svnbuildstat.pattern=http://svnbuildstat.debian.net/packages/list/%(email)s [qa] @@ -30,9 +30,9 @@ keylog.pattern=http://merkel.debian.org/~enrico/keylog/%(gpgfp)s.html [lists] urls=dolists,adolists,gmane -dolists.pattern=http://lists.debian.org/cgi-bin/search?author=%(name)s&sort=date +dolists.pattern=http://lists.debian.org/cgi-bin/search?author=%(name)s&sort=date adolists.pattern=http://www.google.com/search?q=site%%3Alists.alioth.debian.org+%%22%(name)s%%22 -gmane.pattern=http://search.gmane.org/?email=%(name)s&group=gmane.linux.debian.* +gmane.pattern=http://search.gmane.org/?email=%(name)s&group=gmane.linux.debian.* [files] urls=people,alioth @@ -42,10 +42,10 @@ alioth.pattern=http://alioth.debian.org/~%(username)s/ [membership] urls=nm,db,alioth nm.pattern=https://nm.debian.org/nmstatus.php?email=%(email)s -db.pattern=http://db.debian.org/search.cgi?uid=%(username)s&dosearch=Search +db.pattern=http://db.debian.org/search.cgi?uid=%(username)s&dosearch=Search alioth.pattern=http://alioth.debian.org/users/%(username)s/ [miscellaneous] urls=debtags,links debtags.pattern=http://debtags.alioth.debian.org/todo.html?maint=%(email)s -links.pattern=http://www.google.com/search?hl=en&lr=&q=site%%3Adebian.org+%%22%(name)s%%22+-site%%3Anm.debian.org+-site%%3Alintian.debian.org+-site%%3Abugs.debian.org+-site%%3Alists.debian.org+-site%%3Apackages.debian.org+-site%%3Alists.alioth.debian.org+-site%%3Aftp.debian.org++-site%%3Apackages.qa.debian.org++-site%%3Aftp*.*.debian.org+-inurl%%3Adebian.org%%2Fdevel%%2Fpeople.+-inurl%%3Aindices%%2FMaintainers+-inurl%%3Adebian.org%%2Fdebian%%2Fproject++-inurl%%3A%%2Fdists%%2F&btnG=Search +links.pattern=http://www.google.com/search?hl=en&lr=&q=site%%3Adebian.org+%%22%(name)s%%22+-site%%3Anm.debian.org+-site%%3Alintian.debian.org+-site%%3Abugs.debian.org+-site%%3Alists.debian.org+-site%%3Apackages.debian.org+-site%%3Alists.alioth.debian.org+-site%%3Aftp.debian.org++-site%%3Apackages.qa.debian.org++-site%%3Aftp*.*.debian.org+-inurl%%3Adebian.org%%2Fdevel%%2Fpeople.+-inurl%%3Aindices%%2FMaintainers+-inurl%%3Adebian.org%%2Fdebian%%2Fproject++-inurl%%3A%%2Fdists%%2F&btnG=Search diff --git a/ddportfolioservice/model/urlbuilder.py b/ddportfolioservice/model/urlbuilder.py new file mode 100644 index 0000000..11cad6e --- /dev/null +++ b/ddportfolioservice/model/urlbuilder.py @@ -0,0 +1,30 @@ +# -*- python -*- +# -*- coding: utf8 -*- + +import ConfigParser +import pkg_resources +from urllib import quote_plus + +my_config = ConfigParser.ConfigParser() +my_config.readfp(pkg_resources.resource_stream(__name__, 'ddportfolio.ini')) + + +def build_urls(fields): + """Build personalized URLs using the developer information in + fields.""" + data = {} + errors = {} + qfields = dict([(key, quote_plus(fields[key])) for key in fields]) + for section in my_config.sections(): + if my_config.has_option(section, 'urls'): + for url in my_config.get(section, 'urls').split(','): + if my_config.has_option(section, url + '.pattern'): + try: + data[section + '.' + url] = \ + my_config.get(section, url + '.pattern', + False, qfields) + except Exception, e: + errors['%s.%s.pattern' % (section, url)] = \ + [my_config.get(section, '%s.pattern' % url, + True), str(e)] + return {'data' : data, 'errors' : errors} diff --git a/ddportfolioservice/templates/showform.mako b/ddportfolioservice/templates/showform.mako index 55c83a4..9d46f08 100644 --- a/ddportfolioservice/templates/showform.mako +++ b/ddportfolioservice/templates/showform.mako @@ -27,6 +27,8 @@ % endif
${h.text_field('username', value=request.params.get('username', None))}
+
+ ${_('HTML')} ${h.radio_button('mode', 'html', checked=(request.params.get('mode', 'html') == 'html'))} ${_('JSON')} ${h.radio_button('mode', 'json', checked=(request.params.get('mode', 'html') == 'json'))}
${h.submit(value=_('Build DD Portfolio URLs'))} ${h.end_form()} diff --git a/ddportfolioservice/templates/showurls.mako b/ddportfolioservice/templates/showurls.mako new file mode 100644 index 0000000..2df852c --- /dev/null +++ b/ddportfolioservice/templates/showurls.mako @@ -0,0 +1,34 @@ + + + + ${_('Debian Developer Portfolio')} + ${h.stylesheet_link_tag('style')} + + + % if c.urldata['data']: +
+ ${_('Debian Developer Portfolio')} + +
+ % endif + % if c.urldata['errors']: +
+ ${_('Errors during URL creation')} + +
+ % endif +

${h.link_to(_('Restart'), h.url_for(action='index'))}

+ +