From c3afa110131105ccb55f77e6d1f8e962c9b17950 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Thu, 3 Jun 2010 21:49:34 +0200 Subject: [PATCH 1/7] accept extra fields forumsid and wikihomepage --- ddportfolioservice/controllers/ddportfolio.py | 5 +++-- ddportfolioservice/model/form.py | 4 +++- ddportfolioservice/model/urlbuilder.py | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ddportfolioservice/controllers/ddportfolio.py b/ddportfolioservice/controllers/ddportfolio.py index 2b613f9..fa126f3 100644 --- a/ddportfolioservice/controllers/ddportfolio.py +++ b/ddportfolioservice/controllers/ddportfolio.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # # DDPortfolio service DdportfolioController -# Copyright (c) 2009 Jan Dittberner +# Copyright © 2009, 2010 Jan Dittberner # # This file is part of DDPortfolio service. # @@ -156,7 +156,8 @@ developer name on all bug logs)'), except formencode.validators.Invalid, error: c.messages = { 'errors' : error.unpack_errors() } return render('/showform.mako') - data = build_urls(rp) + data = build_urls(form_result) + log.debug("data %r", data) if 'mode' in rp and rp['mode'] == 'json': response.headers['Content-Type'] = 'text/javascript' return simplejson.dumps( diff --git a/ddportfolioservice/model/form.py b/ddportfolioservice/model/form.py index b88640c..f7b49b0 100644 --- a/ddportfolioservice/model/form.py +++ b/ddportfolioservice/model/form.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # # DDPortfolio service form handling model -# Copyright (c) 2009 Jan Dittberner +# Copyright © 2009, 2010 Jan Dittberner # # This file is part of DDPortfolio service. # @@ -35,6 +35,8 @@ class DeveloperData(formencode.Schema): nonddemail = formencode.validators.Email() aliothusername = formencode.validators.PlainText() mode = formencode.validators.OneOf([u'json', u'html'], not_empty=True) + forumsid = formencode.validators.Int(if_missing=None) + wikihomepage = formencode.validators.String(if_missing=None) class DDDataRequest(formencode.Schema): """Validation schema for DDData request.""" diff --git a/ddportfolioservice/model/urlbuilder.py b/ddportfolioservice/model/urlbuilder.py index ee3902b..7b001fd 100644 --- a/ddportfolioservice/model/urlbuilder.py +++ b/ddportfolioservice/model/urlbuilder.py @@ -51,7 +51,8 @@ def build_urls(fields): fields.""" data = [] qfields = dict([(key, quote_plus(fields[key].encode('utf8'))) \ - for key in fields if fields[key] is not None]) + for key in fields \ + if fields[key] is not None and isinstance(fields[key], unicode)]) if 'gpgfp' not in qfields: fpr = keyfinder.getFingerprintByEmail(fields['email'].encode('utf8')) if fpr: From 19e6e0f19134ca7c8402056e1b87d0f8c9a1bab6 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Thu, 3 Jun 2010 21:58:44 +0200 Subject: [PATCH 2/7] improve handling of missing fields --- ddportfolioservice/model/urlbuilder.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ddportfolioservice/model/urlbuilder.py b/ddportfolioservice/model/urlbuilder.py index 7b001fd..462f241 100644 --- a/ddportfolioservice/model/urlbuilder.py +++ b/ddportfolioservice/model/urlbuilder.py @@ -71,7 +71,11 @@ def build_urls(fields): my_config.get(section, url + '.pattern', False, qfields)]) except InterpolationMissingOptionError, e: - data.append(['error', section, url, - _('Missing input: %s') % \ - _(_FIELDNAMES_MAP[e.reference])]) + if e.reference in _FIELDNAMES_MAP: + data.append(['error', section, url, + _('Missing input: %s') % \ + _(_FIELDNAMES_MAP[e.reference])]) + else: + data.append(['error', section, url, + _('Missing input: %s') % e.reference]) return data From ce83914398813783319abeea86b17af16f5e530d Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Thu, 3 Jun 2010 21:59:54 +0200 Subject: [PATCH 3/7] add new patterns for wiki and forum --- ddportfolioservice/model/ddportfolio.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ddportfolioservice/model/ddportfolio.ini b/ddportfolioservice/model/ddportfolio.ini index a50576e..939de89 100644 --- a/ddportfolioservice/model/ddportfolio.ini +++ b/ddportfolioservice/model/ddportfolio.ini @@ -72,10 +72,12 @@ people.pattern=http://people.debian.org/~%(username)s/ alioth.pattern=http://alioth.debian.org/~%(aliothusername)s/ [membership] -urls=nm,db,alioth +urls=nm,db,alioth,wiki,forum nm.pattern=https://nm.debian.org/nmstatus.php?email=%(nonddemail)s db.pattern=http://db.debian.org/search.cgi?uid=%(username)s&dosearch=Search alioth.pattern=http://alioth.debian.org/users/%(aliothusername)s/ +wiki.pattern=http://wiki.debian.org/%(wikihomepage)s +forum.pattern=http://forums.debian.net/memberlist.php?mode=viewprofile&u=%(forumsid)d [miscellaneous] urls=debtags,links,website,search From cce0d82f568430947172cce070ed89153cdb3a14 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Thu, 3 Jun 2010 22:25:46 +0200 Subject: [PATCH 4/7] support non unicode fields --- ddportfolioservice/model/urlbuilder.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ddportfolioservice/model/urlbuilder.py b/ddportfolioservice/model/urlbuilder.py index 462f241..72db643 100644 --- a/ddportfolioservice/model/urlbuilder.py +++ b/ddportfolioservice/model/urlbuilder.py @@ -50,9 +50,16 @@ def build_urls(fields): """Build personalized URLs using the developer information in fields.""" data = [] - qfields = dict([(key, quote_plus(fields[key].encode('utf8'))) \ - for key in fields \ - if fields[key] is not None and isinstance(fields[key], unicode)]) + qfields = {} + for key, value in fields.iteritems(): + if value is not None: + if isinstance(value, unicode): + qfields[key] = quote_plus(value.encode('utf8')) + elif isinstance(value, str): + qfields[key] = quote_plus(value) + else: + qfields[key] = value + if 'gpgfp' not in qfields: fpr = keyfinder.getFingerprintByEmail(fields['email'].encode('utf8')) if fpr: From 3a28db943932572c3a9e32eb22b359cada104734 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Thu, 3 Jun 2010 22:35:37 +0200 Subject: [PATCH 5/7] add support for optional patterns --- ddportfolioservice/model/ddportfolio.ini | 1 + ddportfolioservice/model/urlbuilder.py | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ddportfolioservice/model/ddportfolio.ini b/ddportfolioservice/model/ddportfolio.ini index 939de89..d4af662 100644 --- a/ddportfolioservice/model/ddportfolio.ini +++ b/ddportfolioservice/model/ddportfolio.ini @@ -78,6 +78,7 @@ db.pattern=http://db.debian.org/search.cgi?uid=%(username)s&dosearch=Search alioth.pattern=http://alioth.debian.org/users/%(aliothusername)s/ wiki.pattern=http://wiki.debian.org/%(wikihomepage)s forum.pattern=http://forums.debian.net/memberlist.php?mode=viewprofile&u=%(forumsid)d +forum.optional=true [miscellaneous] urls=debtags,links,website,search diff --git a/ddportfolioservice/model/urlbuilder.py b/ddportfolioservice/model/urlbuilder.py index 72db643..4c398b1 100644 --- a/ddportfolioservice/model/urlbuilder.py +++ b/ddportfolioservice/model/urlbuilder.py @@ -2,7 +2,7 @@ # -*- coding: utf8 -*- # # DDPortfolio service url builder -# Copyright (c) 2009 Jan Dittberner +# Copyright © 2009, 2010 Jan Dittberner # # This file is part of DDPortfolio service. # @@ -72,17 +72,20 @@ def build_urls(fields): if my_config.has_option(section, 'urls'): for url in my_config.get(section, 'urls').split(','): if my_config.has_option(section, url + '.pattern'): + optional = my_config.has_option(section, url + '.optional') \ + and my_config.getboolean(section, url + '.optional') or False try: data.append( ['url', section, url, my_config.get(section, url + '.pattern', False, qfields)]) except InterpolationMissingOptionError, e: - if e.reference in _FIELDNAMES_MAP: - data.append(['error', section, url, - _('Missing input: %s') % \ - _(_FIELDNAMES_MAP[e.reference])]) - else: - data.append(['error', section, url, - _('Missing input: %s') % e.reference]) + if not optional: + if e.reference in _FIELDNAMES_MAP: + data.append(['error', section, url, + _('Missing input: %s') % \ + _(_FIELDNAMES_MAP[e.reference])]) + else: + data.append(['error', section, url, + _('Missing input: %s') % e.reference]) return data From 44f5ffa8c3f757c1a7fc5fc7de1ed100a9bc3938 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Thu, 3 Jun 2010 22:39:13 +0200 Subject: [PATCH 6/7] add translations for new pattern labels --- ddportfolioservice/controllers/ddportfolio.py | 2 ++ .../i18n/ddportfolioservice.pot | 29 ++++++++++++------ .../i18n/de/LC_MESSAGES/ddportfolioservice.mo | Bin 5955 -> 6009 bytes .../i18n/de/LC_MESSAGES/ddportfolioservice.po | 28 +++++++++++------ 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/ddportfolioservice/controllers/ddportfolio.py b/ddportfolioservice/controllers/ddportfolio.py index fa126f3..230808c 100644 --- a/ddportfolioservice/controllers/ddportfolio.py +++ b/ddportfolioservice/controllers/ddportfolio.py @@ -90,6 +90,8 @@ developer name on all bug logs)'), 'nm' : N_('NM'), 'db' : N_('DB'), 'alioth' : N_('Alioth'), + 'wiki' : N_('Wiki'), + 'forum' : N_('Forum'), }, 'miscellaneous' : { 'label' : N_('Miscellaneous'), diff --git a/ddportfolioservice/i18n/ddportfolioservice.pot b/ddportfolioservice/i18n/ddportfolioservice.pot index 7c84627..e2b3852 100644 --- a/ddportfolioservice/i18n/ddportfolioservice.pot +++ b/ddportfolioservice/i18n/ddportfolioservice.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: ddportfolioservice 0.1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2010-05-10 21:18+0200\n" +"POT-Creation-Date: 2010-06-03 22:38+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -162,31 +162,39 @@ msgstr "" msgid "DB" msgstr "" -#: ddportfolioservice/controllers/ddportfolio.py:95 -msgid "Miscellaneous" +#: ddportfolioservice/controllers/ddportfolio.py:93 +msgid "Wiki" msgstr "" -#: ddportfolioservice/controllers/ddportfolio.py:96 -msgid "debtags" +#: ddportfolioservice/controllers/ddportfolio.py:94 +msgid "Forum" msgstr "" #: ddportfolioservice/controllers/ddportfolio.py:97 -msgid "links" +msgid "Miscellaneous" msgstr "" #: ddportfolioservice/controllers/ddportfolio.py:98 -msgid "Debian website" +msgid "debtags" msgstr "" #: ddportfolioservice/controllers/ddportfolio.py:99 +msgid "links" +msgstr "" + +#: ddportfolioservice/controllers/ddportfolio.py:100 +msgid "Debian website" +msgstr "" + +#: ddportfolioservice/controllers/ddportfolio.py:101 msgid "Debian search" msgstr "" -#: ddportfolioservice/controllers/ddportfolio.py:102 +#: ddportfolioservice/controllers/ddportfolio.py:104 msgid "Ubuntu" msgstr "" -#: ddportfolioservice/controllers/ddportfolio.py:103 +#: ddportfolioservice/controllers/ddportfolio.py:105 msgid "Available patches from Ubuntu" msgstr "" @@ -214,7 +222,8 @@ msgstr "" msgid "Alioth user name" msgstr "" -#: ddportfolioservice/model/urlbuilder.py:74 +#: ddportfolioservice/model/urlbuilder.py:86 +#: ddportfolioservice/model/urlbuilder.py:90 #, python-format msgid "Missing input: %s" msgstr "" diff --git a/ddportfolioservice/i18n/de/LC_MESSAGES/ddportfolioservice.mo b/ddportfolioservice/i18n/de/LC_MESSAGES/ddportfolioservice.mo index 8a05c8d4aa44ac4d238dca7e9be95255f9ce82ae..29596ad037b60565e6421021e548262e39e1fc8b 100644 GIT binary patch delta 1286 zcmYMzPe@cz6vy%7IFqJnI+{}cEz{_amJUVshoAvV(FhBtMKOf5(9x_UB#0igkfcS5 z6$U0ng+i^Gzyx(+n~JDFkt7fzT-C}J{oC~YITspc-sj%;?z`vQbML&W`d#HM2K{%8 zPXoU~ejPsb{(mO@W>s{jFc-h$DohHPWnn62<9aN@?Z^spVjti*7PgA}EY{%W$ zi+MPSo&wL(*pHu46X&l!9T{sLs+6~on06nx;4{>zpF>r08I|B4)Y;G_ z2tm|Vl{>eg=G*Df(1Zt3C2B+kZb7XmhI;WlYT|Cx-{}f!4+l{1kD*FGj#|JBYC-e( zgpz;7JnZA4&eQ{fsN&vZ*LaGW;5jPb6zb5-U^6b_L#*Z~GndU`H7?;1%qJTq7DZK} z2OH2sCH~g=5f9OyPxKF49&b@CD@5%{C8`p&&M+#mCe)!ig(}@y_q;29&)?|_)OB6D v+!+s~G$#8aZLzla@w5eB+Mdc?q0*X~eWAVaP{wew8}vSF+6}sy`_lIh{eOI+ delta 1231 zcmYMzPe{{Y9LMo*+iJBrQ!|ZLRx6X?9Bw2uL)JfNxh{o}u#gS~5=f{~62`DY5!gX0 z$WTa1SeJ?|iijYJ@RD?jIz>Aa9y*m!Lx|p=e4w%I^*q1*e$V&M^Q;no6VHFH^W8FD z89tl%obYJ&|25?^i!+_ZdVGhgu#7dhfVEh`%@|y1#?Ye3+v0pR;x62QM^GUKm*;sq z$6zBDCNY9fa65j)1Gt1iOcPZJW-)~Qs07ZV61a-hIO%>bxcO7u!u7YPIA4(^&HQF- zEl)KJv`_;o^A=|e6)1rLOuKnEDqt_Fk~66122cwRp*l5!>+w1&v3s~0i>T*cpr80Q z&*1n9vkw@=wl!v6uBV7fvexB1hzgL!b$ArDZKv@vKE!_s)2=Y{G4b&Nm(FS!S zhbnBan*OVj5iY1@Z zI#t}P&V*6%n)3`)Nhj*TE>y+)QGc5ZYVS^>7Px?F`4v>+6R1jNah6sWu>pJeQD^8Z zQPk>T=S9@>W2iHdA7^lkK>=rQ30cFY*{B3Q!b4a_B@`taRlX0q@h~dko6b9!W`5Vr zzaYiiH`EsVLUq8)Vi>Uy17*~RIz$mv%UYLjuvF=}Z@^QE`Lo{AXyB74(9xD?-\n" "Language-Team: de \n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -174,32 +174,39 @@ msgstr "NM" msgid "DB" msgstr "DB" -#: ddportfolioservice/controllers/ddportfolio.py:95 +#: ddportfolioservice/controllers/ddportfolio.py:93 +msgid "Wiki" +msgstr "Wiki" + +#: ddportfolioservice/controllers/ddportfolio.py:94 +msgid "Forum" +msgstr "Forum" + +#: ddportfolioservice/controllers/ddportfolio.py:97 msgid "Miscellaneous" msgstr "Sonstiges" -#: ddportfolioservice/controllers/ddportfolio.py:96 +#: ddportfolioservice/controllers/ddportfolio.py:98 msgid "debtags" msgstr "debtags" -#: ddportfolioservice/controllers/ddportfolio.py:97 +#: ddportfolioservice/controllers/ddportfolio.py:99 msgid "links" msgstr "Links" -#: ddportfolioservice/controllers/ddportfolio.py:98 +#: ddportfolioservice/controllers/ddportfolio.py:100 msgid "Debian website" msgstr "Debian Webseite" -#: ddportfolioservice/controllers/ddportfolio.py:99 -#| msgid "Debian user name" +#: ddportfolioservice/controllers/ddportfolio.py:101 msgid "Debian search" msgstr "Debian-Suche" -#: ddportfolioservice/controllers/ddportfolio.py:102 +#: ddportfolioservice/controllers/ddportfolio.py:104 msgid "Ubuntu" msgstr "Ubuntu" -#: ddportfolioservice/controllers/ddportfolio.py:103 +#: ddportfolioservice/controllers/ddportfolio.py:105 msgid "Available patches from Ubuntu" msgstr "Verfügbare Patches aus Ubuntu" @@ -227,7 +234,8 @@ msgstr "Nicht-DD E-Mailadresse:" msgid "Alioth user name" msgstr "Alioth-Benutzername" -#: ddportfolioservice/model/urlbuilder.py:74 +#: ddportfolioservice/model/urlbuilder.py:86 +#: ddportfolioservice/model/urlbuilder.py:90 #, python-format msgid "Missing input: %s" msgstr "Fehlende Eingabe: %s" From bbd6ae901723663914d8cb084e8bcd88e90ed7ed Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Thu, 3 Jun 2010 22:58:34 +0200 Subject: [PATCH 7/7] generate wikihomepage from name if parameter is missing --- ddportfolioservice/controllers/ddportfolio.py | 9 +++++---- ddportfolioservice/model/form.py | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ddportfolioservice/controllers/ddportfolio.py b/ddportfolioservice/controllers/ddportfolio.py index 230808c..a84d3a0 100644 --- a/ddportfolioservice/controllers/ddportfolio.py +++ b/ddportfolioservice/controllers/ddportfolio.py @@ -146,8 +146,6 @@ developer name on all bug logs)'), ('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'] = 'html' schema = DeveloperData() try: @@ -158,9 +156,12 @@ developer name on all bug logs)'), except formencode.validators.Invalid, error: c.messages = { 'errors' : error.unpack_errors() } return render('/showform.mako') + if form_result['wikihomepage'] is None: + log.debug('generate wikihomepage from name') + form_result['wikihomepage'] = "".join( + [part.capitalize() for part in form_result['name'].split()]) data = build_urls(form_result) - log.debug("data %r", data) - if 'mode' in rp and rp['mode'] == 'json': + if form_result['mode'] == 'json': response.headers['Content-Type'] = 'text/javascript' return simplejson.dumps( dict([("%s.%s" % \ diff --git a/ddportfolioservice/model/form.py b/ddportfolioservice/model/form.py index f7b49b0..3f672fb 100644 --- a/ddportfolioservice/model/form.py +++ b/ddportfolioservice/model/form.py @@ -34,10 +34,11 @@ class DeveloperData(formencode.Schema): username = formencode.validators.PlainText() nonddemail = formencode.validators.Email() aliothusername = formencode.validators.PlainText() - mode = formencode.validators.OneOf([u'json', u'html'], not_empty=True) + mode = formencode.validators.OneOf([u'json', u'html'], if_missing=u'html') forumsid = formencode.validators.Int(if_missing=None) wikihomepage = formencode.validators.String(if_missing=None) + class DDDataRequest(formencode.Schema): """Validation schema for DDData request.""" allow_extra_fields = True