rename package directory

This commit is contained in:
Jan Dittberner 2014-02-08 17:47:47 +01:00
parent 8299b9aca0
commit dd64ba59b4
47 changed files with 0 additions and 0 deletions

View file

@ -0,0 +1,22 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service package
# Copyright (c) 2009 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#

View file

@ -0,0 +1,22 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service config package
# Copyright © 2009, 2010 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#

View file

@ -0,0 +1,60 @@
#
# ddportfolioservice - Pylons configuration
#
# The %(here)s variable will be replaced with the parent directory of this file
#
[DEFAULT]
debug = true
email_to = you@yourdomain.com
smtp_server = localhost
error_email_from = paste@localhost
[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000
[app:main]
use = egg:ddportfolioservice
full_stack = true
static_files = true
cache_dir = %(here)s/data
beaker.session.key = ddportfolioservice
beaker.session.secret = ${app_instance_secret}
app_instance_uuid = ${app_instance_uuid}
# If you'd like to fine-tune the individual locations of the cache data dirs
# for the Cache data, or the Session saves, un-comment the desired settings
# here:
#beaker.cache.data_dir = %(here)s/data/cache
#beaker.session.data_dir = %(here)s/data/sessions
# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
# Debug mode will enable the interactive debugging tool, allowing ANYONE to
# execute malicious code after an exception is raised.
set debug = false
# Logging configuration
[loggers]
keys = root
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = INFO
handlers = console
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s] [%(threadName)s] %(message)s

View file

@ -0,0 +1,71 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service environment configuration
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""Pylons environment configuration"""
import os
from mako.lookup import TemplateLookup
from pylons.configuration import PylonsConfig
from pylons.error import handle_mako_error
import ddportfolioservice.lib.app_globals as app_globals
import ddportfolioservice.lib.helpers
from ddportfolioservice.config.routing import make_map
def load_environment(global_conf, app_conf):
"""
Configure the Pylons environment via the ``pylons.config`` object
"""
config = PylonsConfig()
# Pylons paths
root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
paths = dict(root=root,
controllers=os.path.join(root, 'controllers'),
static_files=os.path.join(root, 'public'),
templates=[os.path.join(root, 'templates')])
# Initialize config with the basic options
config.init_app(
global_conf, app_conf, package='ddportfolioservice', paths=paths)
config['routes.map'] = make_map(config)
config['pylons.app_globals'] = app_globals.Globals(config)
config['pylons.h'] = ddportfolioservice.lib.helpers
# Setup cache object as early as possible
import pylons
pylons.cache._push_object(config['pylons.app_globals'].cache)
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
# CONFIGURATION OPTIONS HERE (note: all config options will override
# any Pylons config options)
return config

View file

@ -0,0 +1,90 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service middleware configuration
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""Pylons middleware initialization"""
from beaker.middleware import SessionMiddleware
from paste.cascade import Cascade
from paste.registry import RegistryManager
from paste.urlparser import StaticURLParser
from paste.deploy.converters import asbool
from pylons.middleware import ErrorHandler, StatusCodeRedirect
from pylons.wsgiapp import PylonsApp
from routes.middleware import RoutesMiddleware
from ddportfolioservice.config.environment import load_environment
def make_app(global_conf, full_stack=True, static_files=True, **app_conf):
"""Create a Pylons WSGI application and return it
``global_conf``
The inherited configuration for this application. Normally from
the [DEFAULT] section of the Paste ini file.
``full_stack``
Whether this application provides a full WSGI stack (by default,
meaning it handles its own exceptions and errors). Disable
full_stack when this application is "managed" by another WSGI
middleware.
``static_files``
Whether this application serves its own static files; disable
when another web server is responsible for serving them.
``app_conf``
The application's local configuration. Normally specified in
the [app:<name>] section of the Paste ini file (where <name>
defaults to main).
"""
# Configure the Pylons environment
config = load_environment(global_conf, app_conf)
# The Pylons WSGI app
app = PylonsApp(config=config)
# Routing/Session/Cache Middleware
app = RoutesMiddleware(app, config['routes.map'])
app = SessionMiddleware(app, config)
# CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
if asbool(full_stack):
# Handle Python exceptions
app = ErrorHandler(app, global_conf, **config['pylons.errorware'])
# Display error documents for 401, 403, 404 status codes (and
# 500 when debug is disabled)
if asbool(config['debug']):
app = StatusCodeRedirect(app)
else:
app = StatusCodeRedirect(app, [400, 401, 403, 404, 500])
# Establish the Registry for this application
app = RegistryManager(app)
if asbool(static_files):
# Serve static files
static_app = StaticURLParser(config['pylons.paths']['static_files'])
app = Cascade([static_app, app])
app.config = config
return app

View file

@ -0,0 +1,52 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service routing configuration
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""Routes configuration
The more specific and detailed routes should be defined first so they
may take precedent over the more generic routes. For more information
refer to the routes manual at http://routes.groovie.org/docs/
"""
from routes import Mapper
def make_map(config):
"""Create, configure and return the routes Mapper"""
map = Mapper(directory=config['pylons.paths']['controllers'],
always_scan=config['debug'], explicit=True)
map.minimization = False
# The ErrorController route (handles 404/500 error pages); it should
# likely stay at the top, ensuring it can always be resolved
map.connect('/error/{action}', controller='error')
map.connect('/error/{action}/{id}', controller='error')
# CUSTOM ROUTES HERE
map.connect('/', controller='ddportfolio', action='index')
map.connect('/result', controller='ddportfolio', action='urllist')
map.connect('/htmlformhelper.js', controller='showformscripts',
action='index')
map.connect('/{controller}/{action}')
map.connect('/{controller}/{action}/{id}')
return map

View file

@ -0,0 +1,22 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service controllers package
# Copyright © 2009, 2010 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#

View file

@ -0,0 +1,197 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Debian Member Portfolio Service DdportfolioController
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
#
# This file is part of Debian Member Portfolio Service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
#
import logging
import simplejson
from pylons import request, response, tmpl_context as c
from pylons.i18n import N_, _
import formencode.api
import formencode.validators
from ddportfolioservice.lib.base import BaseController, render
from ddportfolioservice.model.form import DDDataRequest, DeveloperData
from ddportfolioservice.model.urlbuilder import build_urls
from ddportfolioservice.model import dddatabuilder
log = logging.getLogger(__name__)
class DdportfolioController(BaseController):
"""
Main controller for the Debian Member portfolio service.
"""
_LABELS = {
'overview': {
'label': N_('Overview'),
'ddpo': N_("Debian Member's Package Overview"),
'alladdresses': N_("""Debian Member's Package Overview
... showing all email addresses"""),
},
'bugs': {
'label': N_('Bugs'),
'received': N_('''bugs received
(note: co-maintainers not listed, see \
<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?\
bug=430986">#430986</a>)'''),
'reported': N_('bugs reported'),
'usertags': N_('user tags'),
'searchall': N_('all messages (i.e., full text search for \
developer name on all bug logs)'),
'wnpp': N_('<a href="http://wiki.debian.org/WNPP">WNPP</a>'),
'correspondent': N_('correspondent for bugs'),
'graph': N_('one year open bug history graph'),
},
'build': {
'label': N_('Build'),
'buildd': N_('buildd.d.o'),
'igloo': N_('igloo'),
},
'qa': {
'label': N_('Quality Assurance'),
'dmd': N_('maintainer dashboard'),
'lintian': N_('lintian reports'),
'lintianfull': N_('full lintian reports (i.e. including \
"info"-level messages)'),
'piuparts': N_('piuparts'),
'patchtracker': N_('Debian patch tracking system'),
'duck': N_('Debian Url ChecKer'),
},
'lists': {
'label': N_('Mailing Lists'),
'dolists': N_('lists.d.o'),
'adolists': N_('lists.a.d.o'),
'gmane': N_('gmane'),
},
'files': {
'label': N_('Files'),
'people': N_('people.d.o'),
'oldpeople': N_('oldpeople'),
'alioth': N_('Alioth'),
},
'membership': {
'label': N_('Membership'),
'nm': N_('NM'),
'dbfinger': N_('DB information via finger'),
'db': N_('DB information via HTTP'),
'webid': N_('FOAF profile'),
'alioth': N_('Alioth'),
'wiki': N_('Wiki'),
'forum': N_('Forum'),
},
'miscellaneous': {
'label': N_('Miscellaneous'),
'debtags': N_('debtags'),
'planetname': N_('Planet Debian (name)'),
'planetuser': N_('Planet Debian (username)'),
'links': N_('links'),
'website': N_('Debian website'),
'search': N_('Debian search'),
'gpgfinger': N_('GPG public key via finger'),
'gpgweb': N_('GPG public key via HTTP'),
'nm': N_('NM, AM participation'),
'contrib': N_('Contribution information'),
},
'ssh': {
'label': N_('Information reachable via ssh (for Debian Members)'),
'owndndoms': N_('owned debian.net domains'),
'miainfo': N_('<a href="http://wiki.debian.org/qa.debian.org/'
'MIATeam">MIA</a> database information'),
'groupinfo': N_('Group membership information'),
},
'ubuntu': {
'label': N_('Ubuntu'),
'ubuntudiff': N_('Available patches from Ubuntu'),
},
}
def _get_label(self, section, url=None):
if section in self._LABELS:
if url:
if url in self._LABELS[section]:
return self._LABELS[section][url]
elif 'label' in self._LABELS[section]:
return self._LABELS[section]['label']
if url:
return "%s.%s" % (section, url)
return section
def index(self):
"""
Render the input form.
"""
return render('/showform.mako')
def urllist(self):
"""Handle the actual data."""
schema = DDDataRequest()
try:
formencode.api.set_stdtranslation(
domain="FormEncode",
languages=[lang[0:2] for lang in request.languages])
form_result = schema.to_python(request.params)
except formencode.validators.Invalid, error:
c.messages = {'errors': error.unpack_errors()}
return render('/showform.mako')
fields = dddatabuilder.build_data(form_result['email'])
rp = request.params.copy()
DM_TUPLES = (('name', 'name'),
('gpgfp', 'gpgfp'),
('nonddemail', 'email'))
DD_TUPLES = (('username', 'username'),
('aliothusername', 'username'))
if fields['type'] in (dddatabuilder.TYPE_DD, dddatabuilder.TYPE_DM):
for tuple in DM_TUPLES:
if not tuple[0] in rp or not rp[tuple[0]]:
rp[tuple[0]] = fields[tuple[1]]
if fields['type'] == dddatabuilder.TYPE_DD:
for tuple in DD_TUPLES:
if not tuple[0] in rp or not rp[tuple[0]]:
rp[tuple[0]] = fields[tuple[1]]
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')
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)
if form_result['mode'] == 'json':
response.headers['Content-Type'] = 'text/javascript'
return simplejson.dumps(
dict([("%s.%s" % (entry[1], entry[2].name), entry[3])
for entry in data if entry[0] == 'url']))
for entry in data:
if entry[0] in ('url', 'error'):
entry.append(_(self._get_label(entry[1], entry[2].name)))
elif entry[0] == 'section':
entry.append(_(self._get_label(entry[1])))
c.urldata = data
return render('/showurls.mako')

View file

@ -0,0 +1,70 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service ErrorController
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
import cgi
from paste.urlparser import PkgResourcesParser
from pylons import request
from pylons.controllers.util import forward
from pylons.middleware import error_document_template
from webhelpers.html.builder import literal
from ddportfolioservice.lib.base import BaseController
class ErrorController(BaseController):
"""Generates error documents as and when they are required.
The ErrorDocuments middleware forwards to ErrorController when error
related status codes are returned from the application.
This behaviour can be altered by changing the parameters to the
ErrorDocuments middleware in your config/middleware.py file.
"""
def document(self):
"""Render the error document"""
resp = request.environ.get('pylons.original_response')
content = literal(resp.body) or cgi.escape(
request.GET.get('message', ''))
page = error_document_template % \
dict(prefix=request.environ.get('SCRIPT_NAME', ''),
code=cgi.escape(
request.GET.get('code', str(resp.status_int))),
message=content)
return page
def img(self, id):
"""Serve Pylons' stock images"""
return self._serve_file('/'.join(['media/img', id]))
def style(self, id):
"""Serve Pylons' stock stylesheets"""
return self._serve_file('/'.join(['media/style', id]))
def _serve_file(self, path):
"""
Call Paste's FileApp (a WSGI application) to serve the file at
the specified path
"""
request.environ['PATH_INFO'] = '/%s' % path
return forward(PkgResourcesParser('pylons', 'pylons'))

View file

@ -0,0 +1,69 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service ShowformscriptController.
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
import logging
import simplejson
from pylons import request, response
from pylons.controllers.util import abort
import formencode.api
import formencode.validators
from ddportfolioservice.lib.base import BaseController, render
from ddportfolioservice.model.form import DDDataRequest
from ddportfolioservice.model import dddatabuilder
log = logging.getLogger(__name__)
class ShowformscriptsController(BaseController):
"""This controller is used to support data entry in showform.
It provides code for generating JavaScript as well as JSON
responses for autocompletion of fields."""
def index(self):
"""
This action generates the helper script for the showform page.
"""
response.headers['Content-Type'] = 'text/javascript; charset=utf-8'
return render('/showformscript.mako')
def fetchdddata(self):
"""
This action fetches the data for a given mail address and
returns them as JSON.
"""
schema = DDDataRequest()
try:
formencode.api.set_stdtranslation(
domain="FormEncode",
languages=[lang[0:2] for lang in request.languages])
form_result = schema.to_python(request.params)
except formencode.validators.Invalid, error:
errors = error.unpack_errors()
abort(400, "\n".join(
["%s: %s" % (key, errors[key]) for key in errors]))
fields = dddatabuilder.build_data(form_result['email'])
log.debug(fields)
response.headers['Content-Type'] = 'text/plain'
return simplejson.dumps(fields)

View file

@ -0,0 +1,50 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service TemplateController
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
from ddportfolioservice.lib.base import BaseController
class TemplateController(BaseController):
def view(self, url):
"""By default, the final controller tried to fulfill the request
when no other routes match. It may be used to display a template
when all else fails, e.g.::
def view(self, url):
return render('/%s' % url)
Or if you're using Mako and want to explicitly send a 404 (Not
Found) response code when the requested template doesn't exist::
import mako.exceptions
def view(self, url):
try:
return render('/%s' % url)
except mako.exceptions.TopLevelLookupException:
abort(404)
By default this controller aborts the request with a 404 (Not
Found)
"""
abort(404)

View file

@ -0,0 +1,391 @@
# Translations template for ddportfolioservice.
# Copyright (C) 2014 ORGANIZATION
# This file is distributed under the same license as the ddportfolioservice
# project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: ddportfolioservice 0.2.20\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2014-01-11 00:25+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
#: ddportfolioservice/controllers/ddportfolio.py:45
msgid "Overview"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:46
msgid "Debian Member's Package Overview"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:47
msgid ""
"Debian Member's Package Overview\n"
"... showing all email addresses"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:51
msgid "Bugs"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:52
msgid ""
"bugs received\n"
"(note: co-maintainers not listed, see <a href=\"http://bugs.debian.org/cgi-"
"bin/bugreport.cgi?bug=430986\">#430986</a>)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:56
msgid "bugs reported"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:57
msgid "user tags"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:58
msgid "all messages (i.e., full text search for developer name on all bug logs)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:60
msgid "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:61
msgid "correspondent for bugs"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:62
msgid "one year open bug history graph"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:65
msgid "Build"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:66
msgid "buildd.d.o"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:67
msgid "igloo"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:70
msgid "Quality Assurance"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:71
msgid "maintainer dashboard"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:72
msgid "lintian reports"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:73
msgid "full lintian reports (i.e. including \"info\"-level messages)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:75
msgid "piuparts"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:76
msgid "Debian patch tracking system"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:77
msgid "Debian Url ChecKer"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:80
msgid "Mailing Lists"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:81
msgid "lists.d.o"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:82
msgid "lists.a.d.o"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:83
msgid "gmane"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:86
msgid "Files"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:87
msgid "people.d.o"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:88
msgid "oldpeople"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:89
#: ddportfolioservice/controllers/ddportfolio.py:97
msgid "Alioth"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:92
msgid "Membership"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:93
msgid "NM"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:94
msgid "DB information via finger"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:95
msgid "DB information via HTTP"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:96
msgid "FOAF profile"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:98
msgid "Wiki"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:99
msgid "Forum"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:102
msgid "Miscellaneous"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:103
msgid "debtags"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:104
msgid "Planet Debian (name)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:105
msgid "Planet Debian (username)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:106
msgid "links"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:107
msgid "Debian website"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:108
msgid "Debian search"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:109
msgid "GPG public key via finger"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:110
msgid "GPG public key via HTTP"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:111
msgid "NM, AM participation"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:112
msgid "Contribution information"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:115
msgid "Information reachable via ssh (for Debian Members)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:116
msgid "owned debian.net domains"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:117
msgid ""
"<a href=\"http://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> database "
"information"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:119
msgid "Group membership information"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:122
msgid "Ubuntu"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:123
msgid "Available patches from Ubuntu"
msgstr ""
#: ddportfolioservice/model/urlbuilder.py:40
msgid "Email address"
msgstr ""
#: ddportfolioservice/model/urlbuilder.py:41
msgid "Name"
msgstr ""
#: ddportfolioservice/model/urlbuilder.py:42
msgid "GPG fingerprint"
msgstr ""
#: ddportfolioservice/model/urlbuilder.py:43
msgid "Debian user name"
msgstr ""
#: ddportfolioservice/model/urlbuilder.py:44
msgid "Non Debian email address"
msgstr ""
#: ddportfolioservice/model/urlbuilder.py:45
msgid "Alioth user name"
msgstr ""
#: ddportfolioservice/model/urlbuilder.py:97
#: ddportfolioservice/model/urlbuilder.py:101
#, python-format
msgid "Missing input: %s"
msgstr ""
#: ddportfolioservice/templates/base.mako:25
#: ddportfolioservice/templates/base.mako:33
msgid "Debian Member Portfolio Service"
msgstr ""
#: ddportfolioservice/templates/base.mako:31
msgid "Debian Logo"
msgstr ""
#: ddportfolioservice/templates/base.mako:34
msgid ""
"This service has been inspired by Stefano Zacchiroli's <a "
"href=\"http://wiki.debian.org/DDPortfolio\">DDPortfolio page in the Debian "
"Wiki</a>. You can create a set of customized links leading to a Debian "
"Member's or package maintainer's information regarding Debian."
msgstr ""
#: ddportfolioservice/templates/base.mako:41
msgid "AGPL - Free Software"
msgstr ""
#: ddportfolioservice/templates/base.mako:43
#, python-format
msgid ""
"The service is available under the terms of the <a "
"href=\"http://www.gnu.org/licenses/agpl.html\">GNU Affero General Public "
"License</a> as published by the Free Software Foundation, either version 3 of"
" the License, or (at your option) any later version. You can <a "
"href=\"%(browseurl)s\" title=\"Gitweb repository browser URL\">browse the "
"source code</a> or clone it from <a href=\"%(cloneurl)s\" title=\"git clone "
"URL\">%(cloneurl)s</a> using <a href=\"http://git-scm.com/\">git</a>. If you "
"want to translate this service to your language you can contribute at <a "
"href=\"%(transifexurl)s\" title=\"Debian Member Portfolio Service at "
"Transifex\">Transifex</a>."
msgstr ""
#: ddportfolioservice/templates/base.mako:44
msgid "Copyright © 2009-2014 Jan Dittberner"
msgstr ""
#: ddportfolioservice/templates/showform.mako:24
msgid "Enter your personal information"
msgstr ""
#: ddportfolioservice/templates/showform.mako:30
#: ddportfolioservice/templates/showurls.mako:28
msgid "Debian Member Portfolio"
msgstr ""
#: ddportfolioservice/templates/showform.mako:36
msgid "Email address:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:47
msgid "Show all form fields"
msgstr ""
#: ddportfolioservice/templates/showform.mako:54
msgid "Name:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:64
msgid "GPG fingerprint:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:79
msgid "Debian user name:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:94
msgid "Non Debian email address:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:109
msgid "Alioth user name:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:125
msgid "Wiki user name:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:140
msgid "Forum user id:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:151
msgid "Output format:"
msgstr ""
#: ddportfolioservice/templates/showform.mako:157
msgid "HTML"
msgstr ""
#: ddportfolioservice/templates/showform.mako:159
msgid "JSON"
msgstr ""
#: ddportfolioservice/templates/showform.mako:161
msgid "Build Debian Member Portfolio URLs"
msgstr ""
#: ddportfolioservice/templates/showurls.mako:24
msgid "Your personal links"
msgstr ""
#: ddportfolioservice/templates/showurls.mako:31
msgid "Usage"
msgstr ""
#: ddportfolioservice/templates/showurls.mako:31
msgid "URL"
msgstr ""
#: ddportfolioservice/templates/showurls.mako:41
msgid "Error during URL creation:"
msgstr ""
#: ddportfolioservice/templates/showurls.mako:68
msgid "Restart"
msgstr ""

View file

@ -0,0 +1,419 @@
# German translations for ddportfolioservice.
# Copyright (C) 2009, 2010, 2011, 2012 Jan Dittberner
# This file is distributed under the same license as the ddportfolioservice
# project.
# Jan Dittberner <jan@dittberner.info>, 2009, 2010, 2011, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: ddportfolioservice 0.2.1\n"
"Report-Msgid-Bugs-To: jan@dittberner.info\n"
"POT-Creation-Date: 2014-01-11 00:25+0000\n"
"PO-Revision-Date: 2014-01-11 01:37+0100\n"
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
"Language-Team: de <de@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.5.4\n"
"Language: de\n"
#: ddportfolioservice/controllers/ddportfolio.py:45
msgid "Overview"
msgstr "Überblick"
#: ddportfolioservice/controllers/ddportfolio.py:46
msgid "Debian Member's Package Overview"
msgstr "Paketübersicht des Debian-Mitglieds"
#: ddportfolioservice/controllers/ddportfolio.py:47
msgid ""
"Debian Member's Package Overview\n"
"... showing all email addresses"
msgstr ""
"Paketübersicht des Debian-Mitglieds\n"
"... mit allen E-Mailadressen"
#: ddportfolioservice/controllers/ddportfolio.py:51
msgid "Bugs"
msgstr "Fehler"
#: ddportfolioservice/controllers/ddportfolio.py:52
msgid ""
"bugs received\n"
"(note: co-maintainers not listed, see <a href=\"http://bugs.debian.org/cgi-"
"bin/bugreport.cgi?bug=430986\">#430986</a>)"
msgstr ""
"Erhaltene Fehlerberichte\n"
"(Anmerkung: Co-Maintainer werden nicht aufgeführt, siehe <a href=\"http://"
"bugs.debian.org/cgi-bin/bugreport.cgi?bug=430986\">#430986</a>)"
#: ddportfolioservice/controllers/ddportfolio.py:56
msgid "bugs reported"
msgstr "Berichtete Fehler"
#: ddportfolioservice/controllers/ddportfolio.py:57
msgid "user tags"
msgstr "User Tags"
#: ddportfolioservice/controllers/ddportfolio.py:58
msgid ""
"all messages (i.e., full text search for developer name on all bug logs)"
msgstr ""
"Alle Nachrichten (d.h. Volltextsuche nach dem Entwicklernamen in allen "
"Fehlerlogs)"
#: ddportfolioservice/controllers/ddportfolio.py:60
msgid "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
msgstr "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
#: ddportfolioservice/controllers/ddportfolio.py:61
msgid "correspondent for bugs"
msgstr "Beitragender zu Fehlern"
#: ddportfolioservice/controllers/ddportfolio.py:62
msgid "one year open bug history graph"
msgstr "Graph der Entwicklung offener Fehlerberichte über ein Jahr"
#: ddportfolioservice/controllers/ddportfolio.py:65
msgid "Build"
msgstr "Build"
#: ddportfolioservice/controllers/ddportfolio.py:66
msgid "buildd.d.o"
msgstr "buildd.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:67
msgid "igloo"
msgstr "Igloo"
#: ddportfolioservice/controllers/ddportfolio.py:70
msgid "Quality Assurance"
msgstr "Qualitätssicherung"
#: ddportfolioservice/controllers/ddportfolio.py:71
msgid "maintainer dashboard"
msgstr "Maintainer Dashboard"
#: ddportfolioservice/controllers/ddportfolio.py:72
msgid "lintian reports"
msgstr "Lintian-Berichte"
#: ddportfolioservice/controllers/ddportfolio.py:73
msgid "full lintian reports (i.e. including \"info\"-level messages)"
msgstr ""
"vollständige Lintian-Berichte (d.h. inklusive Meldungen der Stufe \"info\")"
#: ddportfolioservice/controllers/ddportfolio.py:75
msgid "piuparts"
msgstr "piuparts"
#: ddportfolioservice/controllers/ddportfolio.py:76
msgid "Debian patch tracking system"
msgstr "Debian Nachverfolgungssystem für Patches"
#: ddportfolioservice/controllers/ddportfolio.py:77
msgid "Debian Url ChecKer"
msgstr "Debian URL-Prüfer"
#: ddportfolioservice/controllers/ddportfolio.py:80
msgid "Mailing Lists"
msgstr "Mailinglisten"
#: ddportfolioservice/controllers/ddportfolio.py:81
msgid "lists.d.o"
msgstr "lists.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:82
msgid "lists.a.d.o"
msgstr "lists.a.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:83
msgid "gmane"
msgstr "Gmane"
#: ddportfolioservice/controllers/ddportfolio.py:86
msgid "Files"
msgstr "Dateien"
#: ddportfolioservice/controllers/ddportfolio.py:87
msgid "people.d.o"
msgstr "people.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:88
msgid "oldpeople"
msgstr "oldpeople"
#: ddportfolioservice/controllers/ddportfolio.py:89
#: ddportfolioservice/controllers/ddportfolio.py:97
msgid "Alioth"
msgstr "Alioth"
#: ddportfolioservice/controllers/ddportfolio.py:92
msgid "Membership"
msgstr "Mitgliedschaft"
#: ddportfolioservice/controllers/ddportfolio.py:93
msgid "NM"
msgstr "NM"
#: ddportfolioservice/controllers/ddportfolio.py:94
msgid "DB information via finger"
msgstr "DB-Informationen per finger"
#: ddportfolioservice/controllers/ddportfolio.py:95
msgid "DB information via HTTP"
msgstr "DB-Informationen per HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:96
msgid "FOAF profile"
msgstr "FOAF-Profil"
#: ddportfolioservice/controllers/ddportfolio.py:98
msgid "Wiki"
msgstr "Wiki"
#: ddportfolioservice/controllers/ddportfolio.py:99
msgid "Forum"
msgstr "Forum"
#: ddportfolioservice/controllers/ddportfolio.py:102
msgid "Miscellaneous"
msgstr "Sonstiges"
#: ddportfolioservice/controllers/ddportfolio.py:103
msgid "debtags"
msgstr "debtags"
#: ddportfolioservice/controllers/ddportfolio.py:104
msgid "Planet Debian (name)"
msgstr "Planet Debian (Name)"
#: ddportfolioservice/controllers/ddportfolio.py:105
#| msgid "Debian user name"
msgid "Planet Debian (username)"
msgstr "Planet Debian (Benutzername)"
#: ddportfolioservice/controllers/ddportfolio.py:106
msgid "links"
msgstr "Links"
#: ddportfolioservice/controllers/ddportfolio.py:107
msgid "Debian website"
msgstr "Debian Webseite"
#: ddportfolioservice/controllers/ddportfolio.py:108
msgid "Debian search"
msgstr "Debian-Suche"
#: ddportfolioservice/controllers/ddportfolio.py:109
msgid "GPG public key via finger"
msgstr "öffentlicher GPG-Schlüssel per finger"
#: ddportfolioservice/controllers/ddportfolio.py:110
msgid "GPG public key via HTTP"
msgstr "öffentlicher GPG-Schlüssel per HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:111
msgid "NM, AM participation"
msgstr "NM-, AM-Mitwirkung"
#: ddportfolioservice/controllers/ddportfolio.py:112
#| msgid "Enter your personal information"
msgid "Contribution information"
msgstr "Debian Contributor-Informationen"
#: ddportfolioservice/controllers/ddportfolio.py:115
msgid "Information reachable via ssh (for Debian Members)"
msgstr "Per ssh erreichbare Informationen (für Debian Mitglieder)"
#: ddportfolioservice/controllers/ddportfolio.py:116
msgid "owned debian.net domains"
msgstr "Besitz von debian.net-Domains"
#: ddportfolioservice/controllers/ddportfolio.py:117
msgid ""
"<a href=\"http://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> database "
"information"
msgstr ""
"Informationen in der <a href=\"http://wiki.debian.org/qa.debian.org/MIATeam"
"\">MIA</a>-Datenbank"
#: ddportfolioservice/controllers/ddportfolio.py:119
msgid "Group membership information"
msgstr "Information über Gruppenmitgliedschaften"
#: ddportfolioservice/controllers/ddportfolio.py:122
msgid "Ubuntu"
msgstr "Ubuntu"
#: ddportfolioservice/controllers/ddportfolio.py:123
msgid "Available patches from Ubuntu"
msgstr "Verfügbare Patches aus Ubuntu"
#: ddportfolioservice/model/urlbuilder.py:40
msgid "Email address"
msgstr "E-Mailadresse"
#: ddportfolioservice/model/urlbuilder.py:41
msgid "Name"
msgstr "Name"
#: ddportfolioservice/model/urlbuilder.py:42
msgid "GPG fingerprint"
msgstr "GPG-Fingerabdruck"
#: ddportfolioservice/model/urlbuilder.py:43
msgid "Debian user name"
msgstr "Debian-Benutzername"
#: ddportfolioservice/model/urlbuilder.py:44
msgid "Non Debian email address"
msgstr "Nicht-Debian-E-Mailadresse"
#: ddportfolioservice/model/urlbuilder.py:45
msgid "Alioth user name"
msgstr "Alioth-Benutzername"
#: ddportfolioservice/model/urlbuilder.py:97
#: ddportfolioservice/model/urlbuilder.py:101
#, python-format
msgid "Missing input: %s"
msgstr "Fehlende Eingabe: %s"
#: ddportfolioservice/templates/base.mako:25
#: ddportfolioservice/templates/base.mako:33
msgid "Debian Member Portfolio Service"
msgstr "Debian-Mitglieder-Portfolioservice"
#: ddportfolioservice/templates/base.mako:31
msgid "Debian Logo"
msgstr "Debian-Logo"
#: ddportfolioservice/templates/base.mako:34
msgid ""
"This service has been inspired by Stefano Zacchiroli's <a href=\"http://wiki."
"debian.org/DDPortfolio\">DDPortfolio page in the Debian Wiki</a>. You can "
"create a set of customized links leading to a Debian Member's or package "
"maintainer's information regarding Debian."
msgstr ""
"Dieser Dienst wurde durch Stefano Zacchirolis <a href=\"http://wiki.debian."
"org/DDPortfolio\">DDPortfolio-Seite im Debian Wiki</a> inspiriert. Mit dem "
"Dienst können personalisierte Links zu Informationen im Bezug auf Debian für "
"Debian-Mitglieder und Paketbetreuer erzeugt werden."
#: ddportfolioservice/templates/base.mako:41
msgid "AGPL - Free Software"
msgstr "AGPL - Freie Software"
#: ddportfolioservice/templates/base.mako:43
#, python-format
msgid ""
"The service is available under the terms of the <a href=\"http://www.gnu.org/"
"licenses/agpl.html\">GNU Affero General Public License</a> as published by "
"the Free Software Foundation, either version 3 of the License, or (at your "
"option) any later version. You can <a href=\"%(browseurl)s\" title=\"Gitweb "
"repository browser URL\">browse the source code</a> or clone it from <a href="
"\"%(cloneurl)s\" title=\"git clone URL\">%(cloneurl)s</a> using <a href="
"\"http://git-scm.com/\">git</a>. If you want to translate this service to "
"your language you can contribute at <a href=\"%(transifexurl)s\" title="
"\"Debian Member Portfolio Service at Transifex\">Transifex</a>."
msgstr ""
"Dieser Dienst wird unter den Bedingungen der <a href=\"http://www.gnu.org/"
"licenses/agpl.html\">GNU Affero General Public License</a>, so wie sie von "
"der Free Software Foundation veröffentlicht ist, bereitgestellt. Sie können "
"entweder Version 3 oder (auf Ihren Wunsch hin) jede spätere Version der "
"Lizenz verwenden. Sie können sich <a href=\"%(browseurl)s\" title=\"Gitweb "
"Repository-Browser-URL\">den Quelltext ansehen</a> oder mit <a href=\"http://"
"git-scm.com\">git</a> von <a href=\"%(cloneurl)s\" title=\"Git Clone-URL\">"
"%(cloneurl)s</a> klonen. Wenn Sie diesen Service in Ihre Sprache übersetzen "
"möchten, können Sie auf <a href=\"%(transifexurl)s\" title=\"Debian Member "
"Portfolio Service bei Transifex\">Transifex</a> dazu beitragen."
#: ddportfolioservice/templates/base.mako:44
#| msgid "Copyright © 2009, 2010, 2011, 2012 Jan Dittberner"
msgid "Copyright © 2009-2014 Jan Dittberner"
msgstr "Copyright © 2009-2014 Jan Dittberner"
#: ddportfolioservice/templates/showform.mako:24
msgid "Enter your personal information"
msgstr "Eingabe der persönlichen Informationen"
#: ddportfolioservice/templates/showform.mako:30
#: ddportfolioservice/templates/showurls.mako:28
msgid "Debian Member Portfolio"
msgstr "Debian-Mitgliederportfolio"
#: ddportfolioservice/templates/showform.mako:36
msgid "Email address:"
msgstr "E-Mailadresse:"
#: ddportfolioservice/templates/showform.mako:47
msgid "Show all form fields"
msgstr "Alle Formularfelder anzeigen"
#: ddportfolioservice/templates/showform.mako:54
msgid "Name:"
msgstr "Name:"
#: ddportfolioservice/templates/showform.mako:64
msgid "GPG fingerprint:"
msgstr "GPG-Fingerabdruck:"
#: ddportfolioservice/templates/showform.mako:79
msgid "Debian user name:"
msgstr "Debian-Benutzername:"
#: ddportfolioservice/templates/showform.mako:94
msgid "Non Debian email address:"
msgstr "Nicht-Debian-E-Mailadresse"
#: ddportfolioservice/templates/showform.mako:109
msgid "Alioth user name:"
msgstr "Alioth-Benutzername:"
#: ddportfolioservice/templates/showform.mako:125
msgid "Wiki user name:"
msgstr "Wiki-Benutzername:"
#: ddportfolioservice/templates/showform.mako:140
msgid "Forum user id:"
msgstr "Forumsbenutzernummer:"
#: ddportfolioservice/templates/showform.mako:151
msgid "Output format:"
msgstr "Ausgabeformat:"
#: ddportfolioservice/templates/showform.mako:157
msgid "HTML"
msgstr "HTML"
#: ddportfolioservice/templates/showform.mako:159
msgid "JSON"
msgstr "JSON"
#: ddportfolioservice/templates/showform.mako:161
msgid "Build Debian Member Portfolio URLs"
msgstr "Debian-Mitgliedsportfolio-URLs bauen"
#: ddportfolioservice/templates/showurls.mako:24
msgid "Your personal links"
msgstr "Ihre personalisierten Links"
#: ddportfolioservice/templates/showurls.mako:31
msgid "Usage"
msgstr "Verwendung"
#: ddportfolioservice/templates/showurls.mako:31
msgid "URL"
msgstr "URL"
#: ddportfolioservice/templates/showurls.mako:41
msgid "Error during URL creation:"
msgstr "Fehler bei der URL-Erzeugung:"
#: ddportfolioservice/templates/showurls.mako:68
msgid "Restart"
msgstr "Neu beginnen"

View file

@ -0,0 +1,419 @@
# French translations for ddportfolioservice.
# This file is distributed under the same license as the ddportfolioservice
# project.
#
# Translators:
# Stéphane Aulery <lkppo@free.fr>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Debian Member Portfolio Service\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2014-01-11 00:25+0000\n"
"PO-Revision-Date: 2014-01-11 01:29+0100\n"
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
"Language-Team: French (http://www.transifex.net/projects/p/"
"debportfolioservice/language/fr/)\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.5.4\n"
"Language: fr\n"
#: ddportfolioservice/controllers/ddportfolio.py:45
msgid "Overview"
msgstr "Vue d'ensemble"
#: ddportfolioservice/controllers/ddportfolio.py:46
msgid "Debian Member's Package Overview"
msgstr "Vue d'ensemble des paquets du membre Debian"
#: ddportfolioservice/controllers/ddportfolio.py:47
msgid ""
"Debian Member's Package Overview\n"
"... showing all email addresses"
msgstr ""
"Vue d'ensemble des paquets du membre Debian\n"
"... affichage de tous les courriels"
#: ddportfolioservice/controllers/ddportfolio.py:51
msgid "Bugs"
msgstr "Bogues"
#: ddportfolioservice/controllers/ddportfolio.py:52
msgid ""
"bugs received\n"
"(note: co-maintainers not listed, see <a href=\"http://bugs.debian.org/cgi-"
"bin/bugreport.cgi?bug=430986\">#430986</a>)"
msgstr ""
"Bogues reçus\n"
"(note : co-responsables non listés, voir <a href=\"http://bugs.debian.org/"
"cgi-bin/bugreport.cgi?bug=430986\">#430986</a>)"
#: ddportfolioservice/controllers/ddportfolio.py:56
msgid "bugs reported"
msgstr "Bogues rapportés"
#: ddportfolioservice/controllers/ddportfolio.py:57
msgid "user tags"
msgstr "Tags utilisateur"
#: ddportfolioservice/controllers/ddportfolio.py:58
msgid ""
"all messages (i.e., full text search for developer name on all bug logs)"
msgstr ""
"Tous les messages (c-à-d, recherche plein texte sur le nom du développeur "
"dans tous les journaux de bogue)"
#: ddportfolioservice/controllers/ddportfolio.py:60
msgid "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
msgstr "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
#: ddportfolioservice/controllers/ddportfolio.py:61
msgid "correspondent for bugs"
msgstr "Correspondant pour les bogues"
#: ddportfolioservice/controllers/ddportfolio.py:62
msgid "one year open bug history graph"
msgstr "Graphique de l'évolution des bogues ouverts sur l'année écoulée"
#: ddportfolioservice/controllers/ddportfolio.py:65
msgid "Build"
msgstr "Build"
#: ddportfolioservice/controllers/ddportfolio.py:66
msgid "buildd.d.o"
msgstr "buildd.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:67
msgid "igloo"
msgstr "igloo"
#: ddportfolioservice/controllers/ddportfolio.py:70
msgid "Quality Assurance"
msgstr "Assurance qualité"
#: ddportfolioservice/controllers/ddportfolio.py:71
msgid "maintainer dashboard"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:72
msgid "lintian reports"
msgstr "Rapports lintian"
#: ddportfolioservice/controllers/ddportfolio.py:73
msgid "full lintian reports (i.e. including \"info\"-level messages)"
msgstr ""
"Rapports lintian complets (c-à-d incluant les messages de niveau \"info\")"
#: ddportfolioservice/controllers/ddportfolio.py:75
msgid "piuparts"
msgstr "Piuparts"
#: ddportfolioservice/controllers/ddportfolio.py:76
msgid "Debian patch tracking system"
msgstr "Système de suivi des patchs de Debian"
#: ddportfolioservice/controllers/ddportfolio.py:77
msgid "Debian Url ChecKer"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:80
msgid "Mailing Lists"
msgstr "Listes de diffusion"
#: ddportfolioservice/controllers/ddportfolio.py:81
msgid "lists.d.o"
msgstr "lists.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:82
msgid "lists.a.d.o"
msgstr "lists.a.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:83
msgid "gmane"
msgstr "Gmane"
#: ddportfolioservice/controllers/ddportfolio.py:86
msgid "Files"
msgstr "Fichiers"
#: ddportfolioservice/controllers/ddportfolio.py:87
msgid "people.d.o"
msgstr "people.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:88
msgid "oldpeople"
msgstr "oldpeople"
#: ddportfolioservice/controllers/ddportfolio.py:89
#: ddportfolioservice/controllers/ddportfolio.py:97
msgid "Alioth"
msgstr "Alioth"
#: ddportfolioservice/controllers/ddportfolio.py:92
msgid "Membership"
msgstr "Adhésion"
#: ddportfolioservice/controllers/ddportfolio.py:93
msgid "NM"
msgstr "NM"
#: ddportfolioservice/controllers/ddportfolio.py:94
msgid "DB information via finger"
msgstr "BD d'informations via finger"
#: ddportfolioservice/controllers/ddportfolio.py:95
msgid "DB information via HTTP"
msgstr "BD d'informations via HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:96
msgid "FOAF profile"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:98
msgid "Wiki"
msgstr "Wiki"
#: ddportfolioservice/controllers/ddportfolio.py:99
msgid "Forum"
msgstr "Forum"
#: ddportfolioservice/controllers/ddportfolio.py:102
msgid "Miscellaneous"
msgstr "Divers"
#: ddportfolioservice/controllers/ddportfolio.py:103
msgid "debtags"
msgstr "Debtags"
#: ddportfolioservice/controllers/ddportfolio.py:104
msgid "Planet Debian (name)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:105
#, fuzzy
#| msgid "Debian user name"
msgid "Planet Debian (username)"
msgstr "Nom d'utilisateur Debian"
#: ddportfolioservice/controllers/ddportfolio.py:106
msgid "links"
msgstr "Liens"
#: ddportfolioservice/controllers/ddportfolio.py:107
msgid "Debian website"
msgstr "Site web de Debian"
#: ddportfolioservice/controllers/ddportfolio.py:108
msgid "Debian search"
msgstr "Recherche Debian"
#: ddportfolioservice/controllers/ddportfolio.py:109
msgid "GPG public key via finger"
msgstr "Clef GPG publique via finger"
#: ddportfolioservice/controllers/ddportfolio.py:110
msgid "GPG public key via HTTP"
msgstr "Clef GPG publique via HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:111
msgid "NM, AM participation"
msgstr "NM, AM participation"
#: ddportfolioservice/controllers/ddportfolio.py:112
#, fuzzy
#| msgid "Enter your personal information"
msgid "Contribution information"
msgstr "Saisissez vos informations personnelles"
#: ddportfolioservice/controllers/ddportfolio.py:115
msgid "Information reachable via ssh (for Debian Members)"
msgstr "Informations accessibles via ssh (pour les membres de Debian)"
#: ddportfolioservice/controllers/ddportfolio.py:116
msgid "owned debian.net domains"
msgstr "Propriété des domaines debian.net"
#: ddportfolioservice/controllers/ddportfolio.py:117
msgid ""
"<a href=\"http://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> database "
"information"
msgstr ""
"Informations de la base de données <a href=\"http://wiki.debian.org/qa."
"debian.org/MIATeam\">MIA</a>"
#: ddportfolioservice/controllers/ddportfolio.py:119
msgid "Group membership information"
msgstr "Information sur l'adhésion de groupe"
#: ddportfolioservice/controllers/ddportfolio.py:122
msgid "Ubuntu"
msgstr "Ubuntu"
#: ddportfolioservice/controllers/ddportfolio.py:123
msgid "Available patches from Ubuntu"
msgstr "Patchs disponibles pour Ubuntu"
#: ddportfolioservice/model/urlbuilder.py:40
msgid "Email address"
msgstr "Courriel"
#: ddportfolioservice/model/urlbuilder.py:41
msgid "Name"
msgstr "Nom"
#: ddportfolioservice/model/urlbuilder.py:42
msgid "GPG fingerprint"
msgstr "Empreinte GPG"
#: ddportfolioservice/model/urlbuilder.py:43
msgid "Debian user name"
msgstr "Nom d'utilisateur Debian"
#: ddportfolioservice/model/urlbuilder.py:44
msgid "Non Debian email address"
msgstr "Courriel hors Debian"
#: ddportfolioservice/model/urlbuilder.py:45
msgid "Alioth user name"
msgstr "Nom d'utilisateur Alioth"
#: ddportfolioservice/model/urlbuilder.py:97
#: ddportfolioservice/model/urlbuilder.py:101
#, python-format
msgid "Missing input: %s"
msgstr "Entrée manquante : %s"
#: ddportfolioservice/templates/base.mako:25
#: ddportfolioservice/templates/base.mako:33
msgid "Debian Member Portfolio Service"
msgstr "Service de portefeuille des membres de Debian"
#: ddportfolioservice/templates/base.mako:31
msgid "Debian Logo"
msgstr "Logo Debian"
#: ddportfolioservice/templates/base.mako:34
msgid ""
"This service has been inspired by Stefano Zacchiroli's <a href=\"http://wiki."
"debian.org/DDPortfolio\">DDPortfolio page in the Debian Wiki</a>. You can "
"create a set of customized links leading to a Debian Member's or package "
"maintainer's information regarding Debian."
msgstr ""
"Ce service a été inspiré par <a href=\"http://wiki.debian.org/DDPortfolio"
"\">la page DDPortfolio du Wiki de Debian</a> de Stefano Zacchiroli. Vous "
"pouvez créer un ensemble personnalisé de liens fournissant des informations "
"sur un membre ou un mainteneur de paquet de Debian."
#: ddportfolioservice/templates/base.mako:41
msgid "AGPL - Free Software"
msgstr "AGPL - Logiciel libre"
#: ddportfolioservice/templates/base.mako:43
#, fuzzy, python-format
msgid ""
"The service is available under the terms of the <a href=\"http://www.gnu.org/"
"licenses/agpl.html\">GNU Affero General Public License</a> as published by "
"the Free Software Foundation, either version 3 of the License, or (at your "
"option) any later version. You can <a href=\"%(browseurl)s\" title=\"Gitweb "
"repository browser URL\">browse the source code</a> or clone it from <a href="
"\"%(cloneurl)s\" title=\"git clone URL\">%(cloneurl)s</a> using <a href="
"\"http://git-scm.com/\">git</a>. If you want to translate this service to "
"your language you can contribute at <a href=\"%(transifexurl)s\" title="
"\"Debian Member Portfolio Service at Transifex\">Transifex</a>."
msgstr ""
"Ce service est disponible sous les termes de la licence <a href=\"http://www."
"gnu.org/licenses/agpl.html\">GNU Affero General Public License</a> telle que "
"publiée par la Free Software Foundation, soit la version 3 de la licence, ou "
"(à votre choix) toute version ultérieure. Vous pouvez <a href=\"%(browseurl)s"
"\" title=\"Gitweb repository browser URL\">parcourir le code source</a> ou "
"le cloner depuis <a href=\"%(cloneurl)s\" title=\"git clone URL\">"
"%(cloneurl)s</a> en utilisant <a href=\"http://git-scm.com/\">git</a>."
#: ddportfolioservice/templates/base.mako:44
#| msgid "Copyright © 2009, 2010, 2011, 2012 Jan Dittberner"
msgid "Copyright © 2009-2014 Jan Dittberner"
msgstr "Copyright © 2009-2014 Jan Dittberner"
#: ddportfolioservice/templates/showform.mako:24
msgid "Enter your personal information"
msgstr "Saisissez vos informations personnelles"
#: ddportfolioservice/templates/showform.mako:30
#: ddportfolioservice/templates/showurls.mako:28
msgid "Debian Member Portfolio"
msgstr "Portefeuille d'un Membre de Debian"
#: ddportfolioservice/templates/showform.mako:36
msgid "Email address:"
msgstr "Courriel :"
#: ddportfolioservice/templates/showform.mako:47
msgid "Show all form fields"
msgstr "Afficher tous les champs du formulaire"
#: ddportfolioservice/templates/showform.mako:54
msgid "Name:"
msgstr "Nom :"
#: ddportfolioservice/templates/showform.mako:64
msgid "GPG fingerprint:"
msgstr "Empreinte GPG :"
#: ddportfolioservice/templates/showform.mako:79
msgid "Debian user name:"
msgstr "Nom d'utilisateur Debian :"
#: ddportfolioservice/templates/showform.mako:94
msgid "Non Debian email address:"
msgstr "Courriel hors Debian :"
#: ddportfolioservice/templates/showform.mako:109
msgid "Alioth user name:"
msgstr "Nom d'utilisateur Alioth :"
#: ddportfolioservice/templates/showform.mako:125
msgid "Wiki user name:"
msgstr "Nom d'utilisateur Wiki :"
#: ddportfolioservice/templates/showform.mako:140
msgid "Forum user id:"
msgstr "Numéro d'utilisateur Forum :"
#: ddportfolioservice/templates/showform.mako:151
msgid "Output format:"
msgstr "Format de sortie :"
#: ddportfolioservice/templates/showform.mako:157
msgid "HTML"
msgstr "HTML"
#: ddportfolioservice/templates/showform.mako:159
msgid "JSON"
msgstr "JSON"
#: ddportfolioservice/templates/showform.mako:161
msgid "Build Debian Member Portfolio URLs"
msgstr "Construire les URLs du portefeuille du membre de Debian"
#: ddportfolioservice/templates/showurls.mako:24
msgid "Your personal links"
msgstr "Vos liens personnels"
#: ddportfolioservice/templates/showurls.mako:31
msgid "Usage"
msgstr "Utilisation"
#: ddportfolioservice/templates/showurls.mako:31
msgid "URL"
msgstr "URL"
#: ddportfolioservice/templates/showurls.mako:41
msgid "Error during URL creation:"
msgstr "Erreur durant la création de l'URL :"
#: ddportfolioservice/templates/showurls.mako:68
msgid "Restart"
msgstr "Recommencer"

View file

@ -0,0 +1,419 @@
# Indonesian translations for ddportfolioservice.
# Copyright (C) 2012 Izharul Haq
# This file is distributed under the same license as the ddportfolioservice
# project.
#
# Translators:
# Izharul Haq <atoz.chevara@yahoo.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Debian Member Portfolio Service\n"
"Report-Msgid-Bugs-To: atoz.chevara@yahoo.com\n"
"POT-Creation-Date: 2014-01-11 00:25+0000\n"
"PO-Revision-Date: 2014-01-11 01:28+0100\n"
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
"Language-Team: Indonesian (http://www.transifex.com/projects/p/"
"debportfolioservice/language/id/)\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"Language: id\n"
"X-Generator: Poedit 1.5.4\n"
#: ddportfolioservice/controllers/ddportfolio.py:45
msgid "Overview"
msgstr "Gambaran Umum"
#: ddportfolioservice/controllers/ddportfolio.py:46
msgid "Debian Member's Package Overview"
msgstr "Gambaran Umum Paket Anggota Debian"
#: ddportfolioservice/controllers/ddportfolio.py:47
msgid ""
"Debian Member's Package Overview\n"
"... showing all email addresses"
msgstr ""
"Gambaran Umum Paket Anggota Debian\n"
"... tampilkan semua alamat email"
#: ddportfolioservice/controllers/ddportfolio.py:51
msgid "Bugs"
msgstr "Bugs"
#: ddportfolioservice/controllers/ddportfolio.py:52
msgid ""
"bugs received\n"
"(note: co-maintainers not listed, see <a href=\"http://bugs.debian.org/cgi-"
"bin/bugreport.cgi?bug=430986\">#430986</a>)"
msgstr ""
"bugs diterima\n"
"(catatan: co-maintainers tidak tercantum, lihat <a href=\"http://bugs.debian."
"org/cgi-bin/bugreport.cgi?bug=430986\">#430986</a>)"
#: ddportfolioservice/controllers/ddportfolio.py:56
msgid "bugs reported"
msgstr "melaporkan bug"
#: ddportfolioservice/controllers/ddportfolio.py:57
msgid "user tags"
msgstr "label pengguna"
#: ddportfolioservice/controllers/ddportfolio.py:58
msgid ""
"all messages (i.e., full text search for developer name on all bug logs)"
msgstr ""
"semua pesan (yaitu, pencarian teks lengkap untuk nama pengembang pada semua "
"catatan bug)"
#: ddportfolioservice/controllers/ddportfolio.py:60
msgid "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
msgstr "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
#: ddportfolioservice/controllers/ddportfolio.py:61
msgid "correspondent for bugs"
msgstr "koresponden untuk bug"
#: ddportfolioservice/controllers/ddportfolio.py:62
msgid "one year open bug history graph"
msgstr "grafik perkembangan laporan bug terbuka lebih dari setahun"
#: ddportfolioservice/controllers/ddportfolio.py:65
msgid "Build"
msgstr "Bangun"
#: ddportfolioservice/controllers/ddportfolio.py:66
msgid "buildd.d.o"
msgstr "buildd.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:67
msgid "igloo"
msgstr "igloo"
#: ddportfolioservice/controllers/ddportfolio.py:70
msgid "Quality Assurance"
msgstr "Jaminan Mutu"
#: ddportfolioservice/controllers/ddportfolio.py:71
msgid "maintainer dashboard"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:72
msgid "lintian reports"
msgstr "laporan lintian"
#: ddportfolioservice/controllers/ddportfolio.py:73
msgid "full lintian reports (i.e. including \"info\"-level messages)"
msgstr "seluruh pesan lintian (i.e. termasuk pesan \"info\"-level)"
#: ddportfolioservice/controllers/ddportfolio.py:75
msgid "piuparts"
msgstr "piuparts"
#: ddportfolioservice/controllers/ddportfolio.py:76
msgid "Debian patch tracking system"
msgstr "sistem pelacakan patch Debian"
#: ddportfolioservice/controllers/ddportfolio.py:77
msgid "Debian Url ChecKer"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:80
msgid "Mailing Lists"
msgstr "Milis"
#: ddportfolioservice/controllers/ddportfolio.py:81
msgid "lists.d.o"
msgstr "lists.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:82
msgid "lists.a.d.o"
msgstr "lists.a.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:83
msgid "gmane"
msgstr "gmane"
#: ddportfolioservice/controllers/ddportfolio.py:86
msgid "Files"
msgstr "Berkas-berkas"
#: ddportfolioservice/controllers/ddportfolio.py:87
msgid "people.d.o"
msgstr "people.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:88
msgid "oldpeople"
msgstr "oldpeople"
#: ddportfolioservice/controllers/ddportfolio.py:89
#: ddportfolioservice/controllers/ddportfolio.py:97
msgid "Alioth"
msgstr "Alioth"
#: ddportfolioservice/controllers/ddportfolio.py:92
msgid "Membership"
msgstr "Keanggotaan"
#: ddportfolioservice/controllers/ddportfolio.py:93
msgid "NM"
msgstr "NM"
#: ddportfolioservice/controllers/ddportfolio.py:94
msgid "DB information via finger"
msgstr "informasi DB melalui finger"
#: ddportfolioservice/controllers/ddportfolio.py:95
msgid "DB information via HTTP"
msgstr "informasi DB melalui HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:96
msgid "FOAF profile"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:98
msgid "Wiki"
msgstr "Wiki"
#: ddportfolioservice/controllers/ddportfolio.py:99
msgid "Forum"
msgstr "Forum"
#: ddportfolioservice/controllers/ddportfolio.py:102
msgid "Miscellaneous"
msgstr "Lain-Lain"
#: ddportfolioservice/controllers/ddportfolio.py:103
msgid "debtags"
msgstr "debtags"
#: ddportfolioservice/controllers/ddportfolio.py:104
msgid "Planet Debian (name)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:105
#, fuzzy
#| msgid "Debian user name"
msgid "Planet Debian (username)"
msgstr "nama pengguna Debian"
#: ddportfolioservice/controllers/ddportfolio.py:106
msgid "links"
msgstr "tautan"
#: ddportfolioservice/controllers/ddportfolio.py:107
msgid "Debian website"
msgstr "website Debian"
#: ddportfolioservice/controllers/ddportfolio.py:108
msgid "Debian search"
msgstr "pencarian Debian"
#: ddportfolioservice/controllers/ddportfolio.py:109
msgid "GPG public key via finger"
msgstr "kunci publik GPG melalui finger"
#: ddportfolioservice/controllers/ddportfolio.py:110
msgid "GPG public key via HTTP"
msgstr "kunci publik GPG melalui HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:111
msgid "NM, AM participation"
msgstr "partisipasi NM, AM"
#: ddportfolioservice/controllers/ddportfolio.py:112
#, fuzzy
#| msgid "Enter your personal information"
msgid "Contribution information"
msgstr "Masukkan informasi data pribadi anda"
#: ddportfolioservice/controllers/ddportfolio.py:115
msgid "Information reachable via ssh (for Debian Members)"
msgstr "Informasi dicapai melalui ssh (untuk Anggota Debian)"
#: ddportfolioservice/controllers/ddportfolio.py:116
msgid "owned debian.net domains"
msgstr "domain debian.net sendiri"
#: ddportfolioservice/controllers/ddportfolio.py:117
msgid ""
"<a href=\"http://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> database "
"information"
msgstr ""
"informasi database <a href=\"http://wiki.debian.org/qa.debian.org/MIATeam"
"\">MIA</a>"
#: ddportfolioservice/controllers/ddportfolio.py:119
msgid "Group membership information"
msgstr "Informasi keanggotaan kelompok"
#: ddportfolioservice/controllers/ddportfolio.py:122
msgid "Ubuntu"
msgstr "Ubuntu"
#: ddportfolioservice/controllers/ddportfolio.py:123
msgid "Available patches from Ubuntu"
msgstr "Tambalan dari Ubuntu yang tersedia"
#: ddportfolioservice/model/urlbuilder.py:40
msgid "Email address"
msgstr "Alamat Email"
#: ddportfolioservice/model/urlbuilder.py:41
msgid "Name"
msgstr "Nama"
#: ddportfolioservice/model/urlbuilder.py:42
msgid "GPG fingerprint"
msgstr "sidik jari GPG"
#: ddportfolioservice/model/urlbuilder.py:43
msgid "Debian user name"
msgstr "nama pengguna Debian"
#: ddportfolioservice/model/urlbuilder.py:44
msgid "Non Debian email address"
msgstr "Selain alamat email Debian"
#: ddportfolioservice/model/urlbuilder.py:45
msgid "Alioth user name"
msgstr "nama pengguna Alioth"
#: ddportfolioservice/model/urlbuilder.py:97
#: ddportfolioservice/model/urlbuilder.py:101
#, python-format
msgid "Missing input: %s"
msgstr "Tidak ada masukan: %s"
#: ddportfolioservice/templates/base.mako:25
#: ddportfolioservice/templates/base.mako:33
msgid "Debian Member Portfolio Service"
msgstr "Layanan Portfolio Anggota Debian"
#: ddportfolioservice/templates/base.mako:31
msgid "Debian Logo"
msgstr "Logo Debian"
#: ddportfolioservice/templates/base.mako:34
msgid ""
"This service has been inspired by Stefano Zacchiroli's <a href=\"http://wiki."
"debian.org/DDPortfolio\">DDPortfolio page in the Debian Wiki</a>. You can "
"create a set of customized links leading to a Debian Member's or package "
"maintainer's information regarding Debian."
msgstr ""
"Layanan ini terinspirasi dari halaman <a href=\"http://wiki.debian.org/"
"DDPortfolio\">DDPortfolio Stefano Zacchiroli di Wiki Debian</a>. Anda dapat "
"membuat sebuah link kustom yang mengarah ke Anggota Debian atau informasi "
"mengenai pengelola paket Debian."
#: ddportfolioservice/templates/base.mako:41
msgid "AGPL - Free Software"
msgstr "AGPL - Free Software"
#: ddportfolioservice/templates/base.mako:43
#, fuzzy, python-format
msgid ""
"The service is available under the terms of the <a href=\"http://www.gnu.org/"
"licenses/agpl.html\">GNU Affero General Public License</a> as published by "
"the Free Software Foundation, either version 3 of the License, or (at your "
"option) any later version. You can <a href=\"%(browseurl)s\" title=\"Gitweb "
"repository browser URL\">browse the source code</a> or clone it from <a href="
"\"%(cloneurl)s\" title=\"git clone URL\">%(cloneurl)s</a> using <a href="
"\"http://git-scm.com/\">git</a>. If you want to translate this service to "
"your language you can contribute at <a href=\"%(transifexurl)s\" title="
"\"Debian Member Portfolio Service at Transifex\">Transifex</a>."
msgstr ""
"Layanan ini tersedia di bawah persyaratan <a href=\"http://www.gnu.org/"
"licenses/agpl.html\">GNU Affero General Public License</a> seperti yang "
"diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau "
"(dengan pilihan Anda) versi lainnya. Anda dapat <a href=\"%(browseurl)s\" "
"title=\"Gitweb repository browser URL\">menelusuri kode sumber</a> atau klon "
"dari <a href=\"%(cloneurl)s\" title=\"git clone URL\">%(cloneurl)s</a> "
"menggunakan <a href=\"http://git-scm.com/\">git</a>."
#: ddportfolioservice/templates/base.mako:44
#| msgid "Copyright © 2009, 2010, 2011, 2012 Jan Dittberner"
msgid "Copyright © 2009-2014 Jan Dittberner"
msgstr "Hak Cipta © 2009-2014 Jan Dittberner"
#: ddportfolioservice/templates/showform.mako:24
msgid "Enter your personal information"
msgstr "Masukkan informasi data pribadi anda"
#: ddportfolioservice/templates/showform.mako:30
#: ddportfolioservice/templates/showurls.mako:28
msgid "Debian Member Portfolio"
msgstr "Portfolio Anggota Debian"
#: ddportfolioservice/templates/showform.mako:36
msgid "Email address:"
msgstr "Alamat surel:"
#: ddportfolioservice/templates/showform.mako:47
msgid "Show all form fields"
msgstr "Tampilkan semua bagian formulir"
#: ddportfolioservice/templates/showform.mako:54
msgid "Name:"
msgstr "Nama:"
#: ddportfolioservice/templates/showform.mako:64
msgid "GPG fingerprint:"
msgstr "sidik jari GPG"
#: ddportfolioservice/templates/showform.mako:79
msgid "Debian user name:"
msgstr "Nama pengguna Debian:"
#: ddportfolioservice/templates/showform.mako:94
msgid "Non Debian email address:"
msgstr "Selain alamat email Debian:"
#: ddportfolioservice/templates/showform.mako:109
msgid "Alioth user name:"
msgstr "Nama pengguna Alioth:"
#: ddportfolioservice/templates/showform.mako:125
msgid "Wiki user name:"
msgstr "Nama pengguna Wiki"
#: ddportfolioservice/templates/showform.mako:140
msgid "Forum user id:"
msgstr "ID pengguna Forum:"
#: ddportfolioservice/templates/showform.mako:151
msgid "Output format:"
msgstr "Format Keluaran:"
#: ddportfolioservice/templates/showform.mako:157
msgid "HTML"
msgstr "HTML"
#: ddportfolioservice/templates/showform.mako:159
msgid "JSON"
msgstr "JSON"
#: ddportfolioservice/templates/showform.mako:161
msgid "Build Debian Member Portfolio URLs"
msgstr "Membangun URL Portfolio Anggota Debian"
#: ddportfolioservice/templates/showurls.mako:24
msgid "Your personal links"
msgstr "Tautan pribadi anda"
#: ddportfolioservice/templates/showurls.mako:31
msgid "Usage"
msgstr "Penggunaan"
#: ddportfolioservice/templates/showurls.mako:31
msgid "URL"
msgstr "URL"
#: ddportfolioservice/templates/showurls.mako:41
msgid "Error during URL creation:"
msgstr "Kesalahan selama pembuatan URL:"
#: ddportfolioservice/templates/showurls.mako:68
msgid "Restart"
msgstr "Mulai ulang"

View file

@ -0,0 +1,419 @@
# Portuguese (Brazil) translations for ddportfolioservice.
# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the ddportfolioservice
# project.
#
# Translators:
# Daniel Manzano <dzm747@hotmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: Debian Member Portfolio Service\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2014-01-11 00:25+0000\n"
"PO-Revision-Date: 2014-01-11 01:27+0100\n"
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.net/projects/p/"
"debportfolioservice/language/pt_BR/)\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
"X-Generator: Poedit 1.5.4\n"
"Language: pt_BR\n"
#: ddportfolioservice/controllers/ddportfolio.py:45
msgid "Overview"
msgstr "Visão Geral"
#: ddportfolioservice/controllers/ddportfolio.py:46
msgid "Debian Member's Package Overview"
msgstr "Visão geral de Pacote de membros Debian"
#: ddportfolioservice/controllers/ddportfolio.py:47
msgid ""
"Debian Member's Package Overview\n"
"... showing all email addresses"
msgstr ""
"Visão geral de Pacote de membros Debian\n"
"... mostrando todos os endereços de email"
#: ddportfolioservice/controllers/ddportfolio.py:51
msgid "Bugs"
msgstr "Bugs"
#: ddportfolioservice/controllers/ddportfolio.py:52
msgid ""
"bugs received\n"
"(note: co-maintainers not listed, see <a href=\"http://bugs.debian.org/cgi-"
"bin/bugreport.cgi?bug=430986\">#430986</a>)"
msgstr ""
"Bugs recebidos\n"
"(nota: co-mantenedores não listados, veja <a href=\"http://bugs.debian.org/"
"cgi-bin/bugreport.cgi?bug=430986\">#430986</a>)"
#: ddportfolioservice/controllers/ddportfolio.py:56
msgid "bugs reported"
msgstr "Bugs reportados"
#: ddportfolioservice/controllers/ddportfolio.py:57
msgid "user tags"
msgstr "Tags de usuário"
#: ddportfolioservice/controllers/ddportfolio.py:58
msgid ""
"all messages (i.e., full text search for developer name on all bug logs)"
msgstr ""
"Todas as mensagens (Ex. pesquisa completa de texto para nome de desenvovedor "
"em todos os logs de bug)"
#: ddportfolioservice/controllers/ddportfolio.py:60
msgid "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
msgstr "<a href=\"http://wiki.debian.org/WNPP\">WNPP</a>"
#: ddportfolioservice/controllers/ddportfolio.py:61
msgid "correspondent for bugs"
msgstr "correspondente para bugs"
#: ddportfolioservice/controllers/ddportfolio.py:62
msgid "one year open bug history graph"
msgstr "Gráfico histórico de bug aberto há um ano "
#: ddportfolioservice/controllers/ddportfolio.py:65
msgid "Build"
msgstr "Construção"
#: ddportfolioservice/controllers/ddportfolio.py:66
msgid "buildd.d.o"
msgstr "buildd.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:67
msgid "igloo"
msgstr "Iglu"
#: ddportfolioservice/controllers/ddportfolio.py:70
msgid "Quality Assurance"
msgstr "Garantia de qualidade"
#: ddportfolioservice/controllers/ddportfolio.py:71
msgid "maintainer dashboard"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:72
msgid "lintian reports"
msgstr "relatórios lintian"
#: ddportfolioservice/controllers/ddportfolio.py:73
msgid "full lintian reports (i.e. including \"info\"-level messages)"
msgstr "relatórios lintian completos (Ex. incluíndo mensagens \"info\"-level)"
#: ddportfolioservice/controllers/ddportfolio.py:75
msgid "piuparts"
msgstr "piuparts"
#: ddportfolioservice/controllers/ddportfolio.py:76
msgid "Debian patch tracking system"
msgstr "Sistema de patch tracking Debian"
#: ddportfolioservice/controllers/ddportfolio.py:77
msgid "Debian Url ChecKer"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:80
msgid "Mailing Lists"
msgstr "Listas de discussão"
#: ddportfolioservice/controllers/ddportfolio.py:81
msgid "lists.d.o"
msgstr "lists.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:82
msgid "lists.a.d.o"
msgstr "lists.a.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:83
msgid "gmane"
msgstr "gmane"
#: ddportfolioservice/controllers/ddportfolio.py:86
msgid "Files"
msgstr "Arquivos"
#: ddportfolioservice/controllers/ddportfolio.py:87
msgid "people.d.o"
msgstr "people.d.o"
#: ddportfolioservice/controllers/ddportfolio.py:88
msgid "oldpeople"
msgstr "oldpeople"
#: ddportfolioservice/controllers/ddportfolio.py:89
#: ddportfolioservice/controllers/ddportfolio.py:97
msgid "Alioth"
msgstr "Alioth"
#: ddportfolioservice/controllers/ddportfolio.py:92
msgid "Membership"
msgstr "Associação"
#: ddportfolioservice/controllers/ddportfolio.py:93
msgid "NM"
msgstr "NM"
#: ddportfolioservice/controllers/ddportfolio.py:94
msgid "DB information via finger"
msgstr "Infomações DB via finger"
#: ddportfolioservice/controllers/ddportfolio.py:95
msgid "DB information via HTTP"
msgstr "Informações DB via HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:96
msgid "FOAF profile"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:98
msgid "Wiki"
msgstr "Wiki"
#: ddportfolioservice/controllers/ddportfolio.py:99
msgid "Forum"
msgstr "Fórum"
#: ddportfolioservice/controllers/ddportfolio.py:102
msgid "Miscellaneous"
msgstr "Miscelânea"
#: ddportfolioservice/controllers/ddportfolio.py:103
msgid "debtags"
msgstr "debtags"
#: ddportfolioservice/controllers/ddportfolio.py:104
msgid "Planet Debian (name)"
msgstr ""
#: ddportfolioservice/controllers/ddportfolio.py:105
#, fuzzy
#| msgid "Debian user name"
msgid "Planet Debian (username)"
msgstr "Nome de usuário Debian"
#: ddportfolioservice/controllers/ddportfolio.py:106
msgid "links"
msgstr "links"
#: ddportfolioservice/controllers/ddportfolio.py:107
msgid "Debian website"
msgstr "Site do Debian"
#: ddportfolioservice/controllers/ddportfolio.py:108
msgid "Debian search"
msgstr "Pesquisa Debian"
#: ddportfolioservice/controllers/ddportfolio.py:109
msgid "GPG public key via finger"
msgstr "Chave pública GPG via finger"
#: ddportfolioservice/controllers/ddportfolio.py:110
msgid "GPG public key via HTTP"
msgstr "Chave pública GPG via HTTP"
#: ddportfolioservice/controllers/ddportfolio.py:111
msgid "NM, AM participation"
msgstr "Participação NM, AM"
#: ddportfolioservice/controllers/ddportfolio.py:112
#, fuzzy
#| msgid "Enter your personal information"
msgid "Contribution information"
msgstr "Insira suas informações pessoais"
#: ddportfolioservice/controllers/ddportfolio.py:115
msgid "Information reachable via ssh (for Debian Members)"
msgstr "Informação alcançável via ssh (para membros Debian)"
#: ddportfolioservice/controllers/ddportfolio.py:116
msgid "owned debian.net domains"
msgstr "domínios debian.net adquiridos"
#: ddportfolioservice/controllers/ddportfolio.py:117
msgid ""
"<a href=\"http://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> database "
"information"
msgstr ""
"<a href=\"http://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> informações "
"de banco de dados"
#: ddportfolioservice/controllers/ddportfolio.py:119
msgid "Group membership information"
msgstr "Informações de Grupos associados"
#: ddportfolioservice/controllers/ddportfolio.py:122
msgid "Ubuntu"
msgstr "Ubuntu"
#: ddportfolioservice/controllers/ddportfolio.py:123
msgid "Available patches from Ubuntu"
msgstr "Patches disponíveis para Ubuntu"
#: ddportfolioservice/model/urlbuilder.py:40
msgid "Email address"
msgstr "Endereços de email"
#: ddportfolioservice/model/urlbuilder.py:41
msgid "Name"
msgstr "Nome"
#: ddportfolioservice/model/urlbuilder.py:42
msgid "GPG fingerprint"
msgstr "Fingerprint GPG"
#: ddportfolioservice/model/urlbuilder.py:43
msgid "Debian user name"
msgstr "Nome de usuário Debian"
#: ddportfolioservice/model/urlbuilder.py:44
msgid "Non Debian email address"
msgstr "Endereço de email não Debian"
#: ddportfolioservice/model/urlbuilder.py:45
msgid "Alioth user name"
msgstr "Nome de usuário Alioth"
#: ddportfolioservice/model/urlbuilder.py:97
#: ddportfolioservice/model/urlbuilder.py:101
#, python-format
msgid "Missing input: %s"
msgstr "Entrada restante: %s"
#: ddportfolioservice/templates/base.mako:25
#: ddportfolioservice/templates/base.mako:33
msgid "Debian Member Portfolio Service"
msgstr "Membro do Serviço de Portfolio Debian"
#: ddportfolioservice/templates/base.mako:31
msgid "Debian Logo"
msgstr "Logo Debian"
#: ddportfolioservice/templates/base.mako:34
msgid ""
"This service has been inspired by Stefano Zacchiroli's <a href=\"http://wiki."
"debian.org/DDPortfolio\">DDPortfolio page in the Debian Wiki</a>. You can "
"create a set of customized links leading to a Debian Member's or package "
"maintainer's information regarding Debian."
msgstr ""
"Este serviço tem sido inspirado por Stefano Zacchiroli's <a href=\"http://"
"wiki.debian.org/DDPortfolio\">Página DDPortfolio na Debian Wiki</a>. Você "
"pode criar um conjunto de links customizados apontando para informações, ou "
"de membro Debian, ou de mantenedor de pacotes a respeito de Debian."
#: ddportfolioservice/templates/base.mako:41
msgid "AGPL - Free Software"
msgstr "AGPL - Sofware Livre"
#: ddportfolioservice/templates/base.mako:43
#, fuzzy, python-format
msgid ""
"The service is available under the terms of the <a href=\"http://www.gnu.org/"
"licenses/agpl.html\">GNU Affero General Public License</a> as published by "
"the Free Software Foundation, either version 3 of the License, or (at your "
"option) any later version. You can <a href=\"%(browseurl)s\" title=\"Gitweb "
"repository browser URL\">browse the source code</a> or clone it from <a href="
"\"%(cloneurl)s\" title=\"git clone URL\">%(cloneurl)s</a> using <a href="
"\"http://git-scm.com/\">git</a>. If you want to translate this service to "
"your language you can contribute at <a href=\"%(transifexurl)s\" title="
"\"Debian Member Portfolio Service at Transifex\">Transifex</a>."
msgstr ""
"O serviço está disponível sob os termos da <a href=\"http://www.gnu.org/"
"licenses/agpl.html\">Licença Pública Geral Affero GNU</a> conforme "
"publicado pela the Free Software Foundation, tanto na versão 3 da licença, "
"como (a seu critério) qualquer versão mais recente. Você pode<a href="
"\"%(browseurl)s\" title=\"Gitweb repository browser URL\">visualizar o "
"código fonte</a> ou cloná-lo<a href=\"%(cloneurl)s\" title=\"git clone URL\">"
"%(cloneurl)s</a> usando <a href=\"http://git-scm.com/\">git</a>."
#: ddportfolioservice/templates/base.mako:44
#| msgid "Copyright © 2009, 2010, 2011, 2012 Jan Dittberner"
msgid "Copyright © 2009-2014 Jan Dittberner"
msgstr "Direitos Autorais © 2009-2014 Jan Dittberner"
#: ddportfolioservice/templates/showform.mako:24
msgid "Enter your personal information"
msgstr "Insira suas informações pessoais"
#: ddportfolioservice/templates/showform.mako:30
#: ddportfolioservice/templates/showurls.mako:28
msgid "Debian Member Portfolio"
msgstr "Portfolio de Membro Debian"
#: ddportfolioservice/templates/showform.mako:36
msgid "Email address:"
msgstr "Endereço de email:"
#: ddportfolioservice/templates/showform.mako:47
msgid "Show all form fields"
msgstr "Mostrar todos os campos"
#: ddportfolioservice/templates/showform.mako:54
msgid "Name:"
msgstr "Nome:"
#: ddportfolioservice/templates/showform.mako:64
msgid "GPG fingerprint:"
msgstr "Fingerprint GPG:"
#: ddportfolioservice/templates/showform.mako:79
msgid "Debian user name:"
msgstr "Nome de usuário Debian:"
#: ddportfolioservice/templates/showform.mako:94
msgid "Non Debian email address:"
msgstr "Endereço de email não Debian:"
#: ddportfolioservice/templates/showform.mako:109
msgid "Alioth user name:"
msgstr "Nome de usuário Alioth:"
#: ddportfolioservice/templates/showform.mako:125
msgid "Wiki user name:"
msgstr "Nome de usuário Wiki:"
#: ddportfolioservice/templates/showform.mako:140
msgid "Forum user id:"
msgstr "Id de usuário do fórum:"
#: ddportfolioservice/templates/showform.mako:151
msgid "Output format:"
msgstr "Formato de saída:"
#: ddportfolioservice/templates/showform.mako:157
msgid "HTML"
msgstr "HTML"
#: ddportfolioservice/templates/showform.mako:159
msgid "JSON"
msgstr "JSON"
#: ddportfolioservice/templates/showform.mako:161
msgid "Build Debian Member Portfolio URLs"
msgstr "URLs de Portfolio de Membros Debian em Construção"
#: ddportfolioservice/templates/showurls.mako:24
msgid "Your personal links"
msgstr "Seus links pessoais"
#: ddportfolioservice/templates/showurls.mako:31
msgid "Usage"
msgstr "MOdo de uso"
#: ddportfolioservice/templates/showurls.mako:31
msgid "URL"
msgstr "URL"
#: ddportfolioservice/templates/showurls.mako:41
msgid "Error during URL creation:"
msgstr "Erro durante criação de URL:"
#: ddportfolioservice/templates/showurls.mako:68
msgid "Restart"
msgstr "Reiniciar"

View file

@ -0,0 +1,22 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service lib package
# Copyright © 2009, 2010 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#

View file

@ -0,0 +1,41 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service application Globals
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""The application's Globals object"""
from beaker.cache import CacheManager
from beaker.util import parse_cache_config_options
class Globals(object):
"""
Globals acts as a container for objects available throughout the
life of the application
"""
def __init__(self, config):
"""
One instance of Globals is created during application
initialization and is available during requests via the
'app_globals' variable
"""
self.cache = CacheManager(**parse_cache_config_options(config))

View file

@ -0,0 +1,47 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service base controller
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""The base Controller API
Provides the BaseController class for subclassing.
"""
from pylons import tmpl_context as c, request
from pylons.controllers import WSGIController
from pylons.i18n import add_fallback
from pylons.templating import render_mako as render
class BaseController(WSGIController):
def __call__(self, environ, start_response):
"""Invoke the Controller"""
# WSGIController.__call__ dispatches to the Controller method
# the request is routed to. This routing information is
# available in environ['pylons.routes_dict']
# set language environment
for lang in request.languages:
try:
add_fallback(lang.replace('-', '_'))
except:
pass
c.messages = {'errors': [], 'messages': []}
return WSGIController.__call__(self, environ, start_response)

View file

@ -0,0 +1,33 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service webhelpers
# Copyright © 2009, 2010 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""Helper functions
Consists of functions to typically be used within templates, but also
available to Controllers. This module is available to templates as 'h'.
"""
from webhelpers.html.builder import escape, literal
from webhelpers.html.tags import stylesheet_link, javascript_link, image, \
form, text, radio, submit, end_form, link_to, checkbox
from webhelpers.text import truncate
from webhelpers.textile import textile
from pylons import url

View file

@ -0,0 +1 @@
keyringcache

View file

@ -0,0 +1,26 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service model package
# Copyright (c) 2009 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""
Model classes and model related utilities for the Debian Member Portfolio
service.
"""

View file

@ -0,0 +1,54 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service DD data builder
# Copyright © 2009, 2010 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""This file contains code to build a representation of a person based
on keyring data associated to a given email address."""
import logging
from ddportfolioservice.model import keyfinder
TYPE_NO = 0
TYPE_DM = 1
TYPE_DD = 2
log = logging.getLogger(__name__)
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['type'] = TYPE_DD
elif fields['name'] and fields['gpgfp']:
fields['type'] = TYPE_DM
else:
fields['type'] = TYPE_NO
if fields['name']:
log.debug('generate wikihomepage from name')
fields['wikihomepage'] = "".join(
[part.capitalize() for part in fields['name'].split()])
return fields

View file

@ -0,0 +1,124 @@
#
# Configuration for Debian Member Portfolio Service
#
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
#
# This file is part of the Debian Member Portfolio Service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
#
[DEFAULT]
gnupghome=~/debian/gnupghome
keyring.dir=~/debian/keyring.debian.org/keyrings
urlbuilder.sections=overview,bugs,build,qa,lists,files,membership,
miscellaneous,ssh,ubuntu
[overview]
urls=ddpo,alladdresses
ddpo.pattern=http://qa.debian.org/developer.php?login=%(email)s
alladdresses.pattern=http://qa.debian.org/developer.php?login=%(name)s
[bugs]
urls=received,reported,usertags,searchall,wnpp,correspondent,graph
received.pattern=http://bugs.debian.org/%(email)s
reported.pattern=http://bugs.debian.org/from:%(email)s
usertags.pattern=http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=%(email)s
searchall.pattern=http://bugs-search.debian.org/cgi-bin/search.cgi?phrase=%(name)s;search=search
wnpp.pattern=http://qa.debian.org/developer.php?wnpp=%(email)s
correspondent.pattern=http://bugs.debian.org/cgi-bin/pkgreport.cgi?correspondent=%(email)s
graph.pattern=http://qa.debian.org/data/bts/graphs/by-maint/%(email)s.png
[build]
urls=buildd
buildd.pattern=https://buildd.debian.org/status/package.php?p=%(email)s&compact=compact&comaint=yes
[qa]
urls=lintian,lintianfull,piuparts,patchtracker,dmd,duck
dmd.pattern=http://udd.debian.org/dmd.cgi?email=%(email)s
lintian.pattern=http://lintian.debian.org/maintainer/%(email)s.html
lintianfull.pattern=http://lintian.debian.org/full/%(email)s.html
piuparts.pattern=http://piuparts.debian.org/sid/maintainer/%(firstchar)s/%(email)s.html
patchtracker.pattern=http://patch-tracker.debian.org/email/%(email)s
duck.pattern=http://duck.debian.net/?sourcepackage=%(email)s
[lists]
urls=dolists,adolists,gmane
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.*
# debconf list search has a tricky URL format
# http://lists.debconf.org/lurker/search \
# /20100510.202949.00000000@au:%(firstname)s,au:%(lastname)s.en.html
# /YYYYMMDD.HHmmss.hashcode@au:%(firstname)s,au:%(lastname)s.en.html
# maybe this could be implemented using some custom formatter function
[files]
urls=people,alioth
people.pattern=http://people.debian.org/~%(username)s/
people.optional=true
alioth.pattern=http://alioth.debian.org/~%(aliothusername)s/
alioth.optional=true
[membership]
urls=nm,dbfinger,db,webid,alioth,wiki,forum
nm.pattern=https://nm.debian.org/public/nmstatus/%(username)s
dbfinger.pattern=finger %(username)s@db.debian.org
dbfinger.type=finger
dbfinger.optional=true
db.pattern=http://db.debian.org/search.cgi?uid=%(username)s&dosearch=Search
db.optional=true
webid.pattern=http://webid.debian.net/maintainers/%(username)s
webid.optional=true
alioth.pattern=http://alioth.debian.org/users/%(aliothusername)s/
alioth.optional=true
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,planetname,planetuser,website,search,gpgfinger,gpgweb,contrib
debtags.pattern=http://debtags.debian.net/reports/maint/%(email)s
planetname.pattern=http://planet-search.debian.org/cgi-bin/search.cgi?terms=%%22%(name)s%%22
planetuser.pattern=http://planet-search.debian.org/cgi-bin/search.cgi?terms=%%22%(username)s%%22
planetuser.optional=true
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
website.pattern=http://www.google.com/search?q=site:www.debian.org+%(name)s
search.pattern=http://search.debian.org/cgi-bin/omega?P=%%22%(name)s%%22
gpgfinger.pattern=finger %(username)s/key@db.debian.org
gpgfinger.type=finger
gpgfinger.optional=true
gpgweb.pattern=http://db.debian.org/fetchkey.cgi?fingerprint=%(gpgfp)s
gpgweb.optional=true
nm.pattern=https://nm.debian.org/public/person/%(username)s
contrib.pattern=https://contributors.debian.org/contributors/contributor/%(aliothusername)s
contrib.optional=true
[ssh]
# SSH functions
urls=owndndoms,miainfo,groupinfo
# owned *.debian.net domains
owndndoms.pattern=ldapsearch -u -x -H ldap://db.debian.org -b dc=debian,dc=org uid=%(username)s dnsZoneEntry
owndndoms.type=ldapsearch
owndndoms.optional=true
# MIA information
miainfo.pattern=ssh qa.debian.org /srv/qa.debian.org/mia/mia-query %(emailnoq)s
miainfo.type=ssh
# Group information
groupinfo.pattern=ssh master.debian.org id %(username)s
groupinfo.type=ssh
groupinfo.optional=true
[ubuntu]
urls=ubuntudiff
ubuntudiff.pattern=http://ubuntudiff.debian.net/q/uploaders/%(email)s

View file

@ -0,0 +1,46 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Debian Member Portfolio Service form handling model
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
#
# This file is part of Debian Member Portfolio Service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
#
import formencode
class DeveloperData(formencode.Schema):
"""Validation schema for DeveloperData."""
allow_extra_fields = True
filter_extra_fields = True
email = formencode.validators.Email(not_empty=True)
name = formencode.validators.String(not_empty=True)
gpgfp = formencode.All(formencode.validators.PlainText(),
formencode.validators.MinLength(32),
formencode.validators.MaxLength(40))
username = formencode.validators.PlainText()
nonddemail = formencode.validators.Email()
aliothusername = formencode.validators.PlainText()
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
filter_extra_fields = False
email = formencode.validators.Email(not_empty=True)

View file

@ -0,0 +1,109 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Debian Member Portfolio Service key finder module
# Copyright (c) 2009-2014 Jan Dittberner <jan@dittberner.info>
#
# This file is part of Debian Member Portfolio Service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
#
"""
This module provides tools for finding PGP key information from a
given keyring.
"""
import logging
import time
import sys
db = None
cachetimestamp = 0
def _get_keyring_cache():
global db, cachetimestamp
if db is None or (time.time() - cachetimestamp) > 86300:
import anydbm
import pkg_resources
import os.path
filename = pkg_resources.resource_filename(__name__,
'keyringcache')
logging.debug('reading cache data from %s', filename)
assert os.path.exists(filename) and os.path.isfile(filename)
db = anydbm.open(filename, 'r')
cachetimestamp = time.time()
return db
def _get_cached(cachekey):
cache = _get_keyring_cache()
logging.debug('cache lookup for %s', cachekey)
if cachekey in cache:
logging.debug('found entry %s', cache[cachekey])
return cache[cachekey]
return None
def getFingerprintByEmail(email):
"""
Gets the fingerprints associated with the given email address if
available.
"""
return _get_cached('fpr:email:%s' % email)
def getRealnameByEmail(email):
"""
Gets the real names associated with the given email address if
available.
"""
return _get_cached('name:email:%s' % email)
def getLoginByEmail(email):
"""
Gets the logins associated with the given email address if
available.
"""
return _get_cached('login:email:%s' % email)
def getLoginByFingerprint(fpr):
"""
Gets the login associated with the given fingerprint if available.
"""
return _get_cached('login:fpr:%s' % fpr)
def _dump_cache():
cache = _get_keyring_cache()
fprs = []
for key in cache.keys():
if key.startswith('email:fpr:'):
fpr = key.replace('email:fpr:', '')
if not fpr in fprs:
fprs.append(fpr)
for fpr in fprs:
login = getLoginByFingerprint(fpr)
email = _get_cached('email:fpr:%s' % fpr)
name = _get_cached('name:fpr:%s' % fpr)
print fpr, login, ':'
print ' ', name, email
if __name__ == '__main__':
logging.basicConfig(stream=sys.stderr, level=logging.WARNING)
_dump_cache()

View file

@ -0,0 +1,182 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Debian Member Portfolio service application key ring analyzer tool
#
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
#
# This file is part of the Debian Member Portfolio service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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
# <http://www.gnu.org/licenses/>.
#
"""
This is a tool that analyzes GPG and PGP keyrings and stores the
retrieved data in a file database. The tool was inspired by Debian
qa's carnivore.
"""
import anydbm
import pkg_resources
import glob
import ConfigParser
import os
import os.path
import logging
import subprocess
import sys
import email.utils
CONFIG = ConfigParser.SafeConfigParser()
def _get_keyrings():
"""
Gets the available keyring files from the keyring directory
configured in ddportfolio.ini.
"""
keyringdir = os.path.expanduser(CONFIG.get('DEFAULT', 'keyring.dir'))
logging.debug("keyring dir is %s", keyringdir)
keyrings = glob.glob(os.path.join(keyringdir, '*.gpg'))
keyrings.extend(glob.glob(os.path.join(keyringdir, '*.pgp')))
keyrings.sort()
return keyrings
def _parse_uid(uid):
"""
Parse a uid of the form 'Real Name <email@example.com>' into email
and realname parts.
"""
# First try with the Python library, but it doesn't always catch everything
(name, mail) = email.utils.parseaddr(uid)
if (not name) and (not mail):
logging.warning("malformed uid %s", uid)
if (not name) or (not mail):
logging.debug("strange uid %s: '%s' - <%s>", uid, name, mail)
# Try and do better than the python library
if not '@' in mail:
uid = uid.strip()
# First, strip comment
s = uid.find('(')
e = uid.find(')')
if s >= 0 and e >= 0:
uid = uid[:s] + uid[e + 1:]
s = uid.find('<')
e = uid.find('>')
mail = None
if s >= 0 and e >= 0:
mail = uid[s + 1:e]
uid = uid[:s] + uid[e + 1:]
uid = uid.strip()
if not mail and uid.find('@') >= 0:
mail, uid = uid, mail
name = uid
logging.debug("corrected: '%s' - <%s>", name, mail)
return (name, mail)
resultdict = {}
def _get_canonical(key):
if not key in resultdict:
resultdict[key] = []
return key
def _add_to_result(key, newvalue):
logging.debug("adding %s: %s", key, newvalue)
thekey = _get_canonical(key)
if newvalue not in resultdict[thekey]:
resultdict[thekey].append(newvalue)
def _handle_mail(mail, fpr):
if mail.endswith('@debian.org'):
login = mail[0:-len('@debian.org')]
_add_to_result('login:email:%s' % mail, login)
_add_to_result('login:fpr:%s' % fpr, login)
_add_to_result('fpr:login:%s' % login, fpr)
_add_to_result('fpr:email:%s' % mail, fpr)
_add_to_result('email:fpr:%s' % fpr, mail)
def _handle_uid(uid, fpr):
# Do stuff with 'uid'
if uid:
(uid, mail) = _parse_uid(uid)
if mail:
_handle_mail(mail, fpr)
if uid:
_add_to_result('name:fpr:%s' % fpr, uid)
if mail:
_add_to_result('name:email:%s' % mail, uid)
return fpr
def process_gpg_list_keys_line(line, fpr):
"""
Process a line of gpg --list-keys --with-colon output.
"""
items = line.split(':')
if items[0] == 'pub':
return None
if items[0] == 'fpr':
return items[9].strip()
if items[0] == 'uid':
if items[1] == 'r':
return fpr
return _handle_uid(items[9].strip(), fpr)
else:
return fpr
def process_keyrings():
"""Process the keyrings and store the extracted data in an anydbm
file."""
for keyring in _get_keyrings():
logging.debug("get data from %s", keyring)
proc = subprocess.Popen([
"gpg", "--no-options", "--no-default-keyring",
"--homedir", os.path.expanduser(
CONFIG.get('DEFAULT', 'gnupghome')),
"--no-expensive-trust-checks",
"--keyring", keyring, "--list-keys",
"--with-colons", "--fixed-list-mode", "--with-fingerprint",
"--with-fingerprint"],
stdout=subprocess.PIPE)
fpr = None
for line in proc.stdout.readlines():
fpr = process_gpg_list_keys_line(line, fpr)
retcode = proc.wait()
if retcode != 0:
logging.error("subprocess ended with return code %d", retcode)
db = anydbm.open(pkg_resources.resource_filename(__name__,
'keyringcache'), 'c')
for key in resultdict:
db[key] = ":".join(resultdict[key])
db.close()
if __name__ == '__main__':
logging.basicConfig(stream=sys.stderr, level=logging.WARNING)
CONFIG.readfp(pkg_resources.resource_stream(
__name__, 'ddportfolio.ini'))
gpghome = os.path.expanduser(CONFIG.get('DEFAULT', 'gnupghome'))
if not os.path.isdir(gpghome):
os.makedirs(gpghome, 0700)
process_keyrings()

View file

@ -0,0 +1,102 @@
# -*- python -*-
# -*- coding: utf8 -*-
#
# DDPortfolio service url builder
# Copyright © 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""
This module provides the function build_urls to build personalized
URLs using the given information and the URL patterns defined in
ddportfolio.ini.
"""
from ConfigParser import ConfigParser, InterpolationMissingOptionError
import pkg_resources
from ddportfolioservice.model import keyfinder
from urllib import quote_plus
from pylons.i18n.translation import _, N_
my_config = ConfigParser()
my_config.readfp(pkg_resources.resource_stream(__name__, 'ddportfolio.ini'))
_FIELDNAMES_MAP = {
'email': N_('Email address'),
'name': N_('Name'),
'gpgfp': N_('GPG fingerprint'),
'username': N_('Debian user name'),
'nonddemail': N_('Non Debian email address'),
'aliothusername': N_('Alioth user name'),
}
class DDPortfolioEntry(object):
def __init__(self, config, section, key):
self.name = key
self.optional = config.has_option(section, key + '.optional') and \
config.getboolean(section, key + '.optional') or False
if config.has_option(section, key + '.type'):
self.type = config.get(section, key + '.type')
else:
self.type = 'url'
def build_urls(fields):
"""Build personalized URLs using the developer information in
fields."""
data = []
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:
qfields['gpgfp'] = fpr[0]
qfields['firstchar'] = fields['email'][0].encode('utf8')
qfields['emailnoq'] = fields['email'].encode('utf8')
for section in [section.strip() for section in \
my_config.get('DEFAULT',
'urlbuilder.sections').split(',')]:
data.append(['section', section])
if my_config.has_option(section, 'urls'):
for entry in ([
DDPortfolioEntry(my_config, section, url) for url in \
my_config.get(section, 'urls').split(',')]):
try:
data.append(
['url', section, entry,
my_config.get(section, entry.name + '.pattern',
False, qfields)])
except InterpolationMissingOptionError, e:
if not entry.optional:
if e.reference in _FIELDNAMES_MAP:
data.append(['error', section, entry,
_('Missing input: %s') % \
_(_FIELDNAMES_MAP[e.reference])])
else:
data.append(['error', section, entry,
_('Missing input: %s') % e.reference])
return data

View file

@ -0,0 +1 @@
javascript

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View file

@ -0,0 +1,2 @@
User-Agent: *
Allow: /

View file

@ -0,0 +1,61 @@
html, body {
font-family:sans, Arial;
font-size:10pt;
}
#debianlogo {
float:right;
}
#content {
clear:both;
}
#agpllogo {
float:left;
margin-right:10px;
}
table {
border-collapse:collapse;
width:100%;
}
th, td {
border:1px solid grey;
}
tr.section {
background-color: #a0a0a0;
color: #f0f0f0;
}
tr.odd td {
background-color: #f0f0f0;
}
tr.even td {
background-color: #e0e0ff;
}
tr.error td {
background-color: #ffe0e0;
}
td {
vertical-align:top;
padding:2px;
}
td p {
padding:0;
margin:0;
}
.errormsg {
color:red;
}
.hidden {
display:none;
}

View file

@ -0,0 +1,52 @@
## -*- coding: utf-8 -*- \
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<%doc>
Base template for XHTML templates.
Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
This file is part of the Debian Member Portfolio service.
Debian Member Portfolio 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.
Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
</%doc>
<html>
<head>
<title>${_('Debian Member Portfolio Service')}${self.titleaddon()}</title>
${h.stylesheet_link(h.url('/stylesheets/style.css'))}
${self.extrahead()}
</head>
<body>
<div id="header">
${h.image(h.url('/images/openlogo-100.jpg'), _('Debian Logo'), 100, 100,
id='debianlogo')}
<h1>${_('Debian Member Portfolio Service')}</h1>
<p>${h.literal(_('''This service has been inspired by Stefano Zacchiroli's <a href="http://wiki.debian.org/DDPortfolio">DDPortfolio page in the Debian Wiki</a>. You can create a set of customized links leading to a Debian Member's or package maintainer's information regarding Debian.'''))}</p>
<p><a class="FlattrButton" style="display:none" title="Debian Member Portfolio Service" href="${request.scheme}://portfolio.debian.net/">Debian Member Portfolio Service</a></p>
</div>
<div id="content">
${self.body()}
</div>
<div id="footer">
${h.image(h.url('/images/agplv3-88x31.png'), _('AGPL - Free Software'), 88, 31,
id='agpllogo')}
<p>${h.literal(_('''The service is available under the terms of the <a href="http://www.gnu.org/licenses/agpl.html">GNU Affero General Public License</a> as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. You can <a href="%(browseurl)s" title="Gitweb repository browser URL">browse the source code</a> or clone it from <a href="%(cloneurl)s" title="git clone URL">%(cloneurl)s</a> using <a href="http://git-scm.com/">git</a>. If you want to translate this service to your language you can contribute at <a href="%(transifexurl)s" title="Debian Member Portfolio Service at Transifex">Transifex</a>.''') % dict((('browseurl', 'http://debianstuff.dittberner.info/gitweb/?p=debianmemberportfolio.git;a=summary'), ('cloneurl', 'http://debianstuff.dittberner.info/git/debianmemberportfolio.git'), ('transifexurl', 'https://www.transifex.com/projects/p/debportfolioservice/'))))}</p>
<p>${_(u'''Copyright © 2009-2014 Jan Dittberner''')}</p>
</div>
<script type="text/javascript">
var flattr_url = '${request.scheme}://portfolio.debian.net/';
</script>
<script src="${request.scheme}://api.flattr.com/js/0.6/load.js?mode=auto&amp;button=compact" type="text/javascript"></script>
</body>
</html>
<%def name="extrahead()"></%def>

View file

@ -0,0 +1,164 @@
## -- coding: utf-8 -- \
<%inherit file="base.mako" />
<%doc>
Template for the data input form.
Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
This file is part of the Debian Member Portfolio service.
Debian Member Portfolio 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.
Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
</%doc>
<%def name="titleaddon()">
- ${_('Enter your personal information')}
</%def>
<%def name="extrahead()">${h.javascript_link('/javascript/jquery/jquery.js',
h.url(controller='showformscripts', action='index'))}</%def>
${h.form(h.url(action='urllist', controller='ddportfolio'), method='get')}
<fieldset id="ddportfolio">
<legend>${_('Debian Member Portfolio')}</legend>
<div id="emailfield" \
% if 'email' in c.messages['errors']:
class="witherrors" \
% endif
>
<label for="email">${_('Email address:')}
% if 'email' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['email'] | h}</span>
% endif
</label><br />
${h.text('email',
h.escape(request.params.get('email', None)), id='email')}<br />
</div>
<div id="showallfield" class="hidden">
${h.checkbox('showall', value='1', checked=False, id='showall')}
<label for="showall">${_(u'Show all form fields')}</label><br />
</div>
<div id="namefield" \
% if 'name' in c.messages['errors']:
class="witherrors" \
% endif
>
<label for="name">${_('Name:')}
% if 'name' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['name'] | h}</span>
% endif
</label><br />
${h.text('name',
h.escape(request.params.get('name', None)), id='name')}<br />
</div>
<div id="gpgfpfield">
<label for="gpgfp">${_('GPG fingerprint:')}
% if 'gpgfp' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['gpgfp'] | h}</span>
% endif
</label><br />
${h.text('gpgfp',
h.escape(request.params.get('gpgfp', None)),
id='gpgfp')}<br />
</div>
<div id="usernamefield" \
% if 'username' in c.messages['errors']:
class="witherrors" \
% endif
>
<label for="username">${_('Debian user name:')}
% if 'username' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['username'] | h}</span>
% endif
</label><br />
${h.text('username',
h.escape(request.params.get('username', None)),
id='username')}<br />
</div>
<div id="nonddemailfield" \
% if 'nonddemail' in c.messages['errors']:
class="witherrors" \
% endif
>
<label for="nonddemail">${_('Non Debian email address:') | h}
% if 'nonddemail' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['nonddemail'] | h}</span>
% endif
</label><br />
${h.text('nonddemail',
h.escape(request.params.get('nonddemail', None)),
id='nonddemail')}<br />
</div>
<div id="aliothusernamefield" \
% if 'aliothusername' in c.messages['errors']:
class="witherrors"
% endif
>
<label for="aliothusername">${_('Alioth user name:')}
% if 'aliothusername' in c.messages['errors']:
<br />
<span
class="errormsg">${c.messages['errors']['aliothusername'] | h}</span>
% endif
</label><br />
${h.text('aliothusername',
h.escape(request.params.get('username', None)),
id='aliothusername')}<br />
</div>
<div id="wikihomepagefield" \
% if 'wikihomepage' in c.messages['errors']:
class="witherrors"
% endif
>
<label for="wikihomepage">${_('Wiki user name:')}
% if 'wikihomepage' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['wikihomepage'] | h}</span>
% endif
</label><br />
${h.text('wikihomepage',
h.escape(request.params.get('wikihomepage', None)),
id='wikihomepage')}<br />
</div>
<div id="forumsidfield" \
% if 'forumsid' in c.messages['errors']:
class="witherrors"
% endif
>
<label for="forumsid">${_('Forum user id:')}
% if 'forumsid' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['forumsid'] | h}</span>
% endif
</label><br />
${h.text('forumsid',
h.escape(request.params.get('forumsid', None)),
id='forumsid')}<br />
</div>
<div id="modefield">
<label for="mode_html">${_('Output format:')}
% if 'mode' in c.messages['errors']:
<br />
<span class="errormsg">${c.messages['errors']['mode'] | h}</span>
% endif
</label><br />
${_('HTML')}&#160;${h.radio('mode', 'html',
checked=(request.params.get('mode',
'html') == 'html'))}&#160;${_('JSON')}&#160;${h.radio('mode',
'json', checked=(request.params.get('mode', 'html') == 'json'))}<br />
${h.submit('submit', value=_('Build Debian Member Portfolio URLs'))}
</div>
</fieldset>
${h.end_form()}

View file

@ -0,0 +1,122 @@
## -*- coding: utf-8 -*- \
<%doc>
Helper JavaScript for the data input form.
Copyright © 2009, 2010 Jan Dittberner <jan@dittberner.info>
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
<http://www.gnu.org/licenses/>.
</%doc>\
var defaulthiddendivs = new Array(
'#namefield', '#gpgfpfield', '#usernamefield', '#nonddemailfield',
'#aliothusernamefield', '#wikihomepagefield', '#forumsidfield');
var maskedfielddivs = new Array(
'#namefield', '#gpgfpfield', '#usernamefield', '#nonddemailfield',
'#aliothusernamefield', '#wikihomepagefield', '#forumsidfield');
var allfielddivs = new Array(
'#namefield', '#gpgfpfield', '#usernamefield', '#nonddemailfield',
'#aliothusernamefield', '#wikihomepagefield', '#forumsidfield');
function updateFields(data, textStatus) {
if (data.type == 2) { // DD
$('#name').attr('value', data.name).attr('readonly', 'readonly');
$('#gpgfp').attr('value', data.gpgfp);
$('#username').attr('value', data.username).attr(
'readonly', 'readonly');
$('#nonddemail').attr('value', data.email).focus();
$('#aliothusername').attr('value', data.username);
$('#wikihomepage').attr('value', data.wikihomepage);
$('#namefield').show();
$('#gpgfpfield').show();
$('#usernamefield').show();
$('#nonddemailfield').show();
$('#aliothusernamefield').show();
$('#wikihomepagefield').show();
$('#forumsidfield').show();
$('#nonddemail').focus().select();
} else if (data.type == 1) { // DM
$('#name').attr('value', data.name).attr('readonly', 'readonly');
$('#gpgfp').attr('value', data.gpgfp);
$('#username').attr('value', '');
$('#nonddemail').attr('value', data.email).focus();
$('#wikihomepage').attr('value', data.wikihomepage);
$('#namefield').show();
$('#gpgfpfield').show();
$('#usernamefield').hide();
$('#nonddemailfield').hide();
$('#aliothusernamefield').show();
$('#wikihomepagefield').show();
$('#forumsidfield').show();
$('#aliothusername').focus().select();
} else {
$('#nonddemail').attr('value', data.email);
$('#name').removeAttr('readonly');
$('#username').removeAttr('readonly').attr('value', '');
$('#gpgfp').attr('value', '');
$('#usernamefield').hide();
$('#gpgfpfield').hide();
$('#nonddemailfield').hide();
$('#namefield').show();
$('#aliothusernamefield').show();
$('#wikihomepagefield').show();
$('#forumsidfield').show();
$('#name').focus().select();
}
}
function onChangeShowAll(event) {
if ($('#showall').attr('checked')) {
for (var fielddiv in allfielddivs) {
$(allfielddivs[fielddiv]).show();
}
} else {
for (var fielddiv in maskedfielddivs) {
$(maskedfielddivs[fielddiv]).hide();
}
}
}
function onBlurEmail() {
if ($.trim($('#email').attr('value')).length > 0) {
$.ajax({
'url' : '${h.url(controller="showformscripts", action="fetchdddata")}',
'data' : {'email' : $('#email').attr('value')},
'dataType' : 'json',
'success' : updateFields,
'error' : function(request, textStatus, errorThrown) {
$('#email').focus();
}
});
}
}
$(document).ready(function() {
for (var index in defaulthiddendivs) {
if (!$(defaulthiddendivs[index]).hasClass('witherrors')) {
$(defaulthiddendivs[index]).hide();
}
}
$('#showall').attr('checked', false).change(onChangeShowAll);
$('#showallfield').show();
$('#email').blur(onBlurEmail).focus();
});

View file

@ -0,0 +1,67 @@
## -*- coding: utf-8 -*-
<%inherit file="base.mako" />\
<%doc>
Template for the url output page.
Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
This file is part of Debian Member Portfolio Service.
Debian Member Portfolio 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.
Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
</%doc>\
<%def name="titleaddon()">
- ${_('Your personal links')}
</%def>
% if c.urldata:
<fieldset id="ddportfolio">
<legend>${_('Debian Member Portfolio')}</legend>
<table id="urltable">
<thead>
<tr><th>${_('Usage')}</th><th>${_('URL')}</th></tr>
</thead>
<tbody>
% for row in c.urldata:
% if row[0] == 'section':
<tr class="section"><th class="sectionlabel" colspan="2">${row[2]}</th></tr>
<% urlclass = 'odd' %>
% elif row[0] == 'error':
<tr class="error">
<td>${h.literal(h.textile(row[4]))}</td>
<td>${_('Error during URL creation:')}
<span class="errormsg">${row[3].replace("\n",
'<br />')}</span></td>
</tr>
% else:
<tr class="url ${urlclass}">
<td>${h.literal(h.textile(row[4]))}</td>
<td>
% if row[2].type == 'url':
${h.link_to(h.truncate(row[3], length=120), row[3])}
% else:
<tt>${row[3]}</tt>
% endif
</td>
</tr>
<%
if urlclass == 'odd':
urlclass = 'even'
else:
urlclass = 'odd'
%>
% endif
% endfor
</tbody>
</table>
</fieldset>
% endif
<p>${h.link_to(_('Restart'), h.url(controller='ddportfolio', action='index'))}</p>

View file

@ -0,0 +1,56 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Debian Member Portfolio Service tests package
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
#
# This file is part of Debian Member Portfolio Service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
#
"""Pylons application test package
When the test runner finds and executes tests within this directory,
this file will be loaded to setup the test environment.
It registers the root directory of the project in sys.path and
pkg_resources, in case the project hasn't been installed with
setuptools. It also initializes the application via websetup (paster
setup-app) with the project's test.ini configuration file.
"""
from unittest import TestCase
from paste.script.appinstall import SetupCommand
from pylons import url
from routes.util import URLGenerator
from webtest import TestApp
import pylons.test
__all__ = ['environ', 'url', 'TestController']
# Invoke websetup with the current config file
SetupCommand('setup-app').run([pylons.test.pylonsapp.config['__file__']])
environ = {}
class TestController(TestCase):
def __init__(self, *args, **kwargs):
wsgiapp = pylons.test.pylonsapp
config = wsgiapp.config
self.app = TestApp(wsgiapp)
url._push_object(URLGenerator(config['routes.map'], environ))
TestCase.__init__(self, *args, **kwargs)

View file

@ -0,0 +1,22 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service functional tests package
# Copyright (c) 2009 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#

View file

@ -0,0 +1,32 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Debian Member Portfolio Service DdportfolioController test
# Copyright © 2009, 2010 Jan Dittberner <jan@dittberner.info>
#
# This file is part of Debian Member Portfolio Service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
#
from ddportfolioservice.tests import TestController, url
class TestDdportfolioController(TestController):
def test_index(self):
response = self.app.get(url(controller='ddportfolio', action='index'))
# Test response...
assert response.status_int == 200
assert response.content_type == "text/html"
assert "Debian Member Portfolio Service" in response

View file

@ -0,0 +1,33 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# Debian Member Portfolio Service DdportfolioController test
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
#
# This file is part of Debian Member Portfolio Service.
#
# Debian Member Portfolio 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.
#
# Debian Member Portfolio 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 <http://www.gnu.org/licenses/>.
#
from ddportfolioservice.tests import TestController, url
class TestShowformscriptsController(TestController):
def test_index(self):
response = self.app.get(
url(controller='showformscripts', action='index'))
# Test response...
assert response.status_int == 200
assert response.content_type == "text/javascript"
assert "function updateField" in response

View file

@ -0,0 +1,22 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service model tests
# Copyright (c) 2009 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#

View file

@ -0,0 +1,40 @@
# -*- python -*-
# -*- coding: utf-8 -*-
#
# DDPortfolio service websetup
# Copyright (c) 2009, 2010, 2011, 2012 Jan Dittberner <jan@dittberner.info>
#
# 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
# <http://www.gnu.org/licenses/>.
#
"""Setup the ddportfolioservice application"""
import logging
from paste.deploy import appconfig
from pylons import config
import pylons.test
from ddportfolioservice.config.environment import load_environment
log = logging.getLogger(__name__)
def setup_config(command, filename, section, vars):
"""Place any commands to setup ddportfolioservice here"""
conf = appconfig('config:' + filename)
if not pylons.test.pylonsapp:
load_environment(conf.global_conf, conf.local_conf)