forked from jan/debianmemberportfolio
Merge branch 'feature/flask-port' into develop
* feature/flask-port: (22 commits) Update german translation Update meta information and documentation Remove Pylons remains Add result view implementation Port showform template to Jinja2 Implement fetchdddata view Port dddatabuilder and keyfinder to Python3 Add Stretch dependency versions Fix compatibility with newer jQuery Implement better GPG output decoding Use Jessie versions of dependencies add some jessie requirements for flask port keyringanalyzer to Python3 Add initial Flask implementation Add Flask requirements Move static assets Add Babel configuration Move translation files Move Pylons implementation to attic remove Pylons references from setup.py ...
This commit is contained in:
commit
72ae3c7bfb
57 changed files with 844 additions and 1809 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -6,3 +6,5 @@ data/
|
||||||
.ropeproject/
|
.ropeproject/
|
||||||
*.mo
|
*.mo
|
||||||
*.pot
|
*.pot
|
||||||
|
tags
|
||||||
|
debianmemberportfolio/model/keyringcache.db
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
2015-11-12 Jan Dittberner <jan@dittberner.info>
|
||||||
|
* port to Python 3 and Flask
|
||||||
|
|
||||||
2015-03-09 Jan Dittberner <jan@dittberner.info>
|
2015-03-09 Jan Dittberner <jan@dittberner.info>
|
||||||
* apply patch for DMD link by Paul Wise
|
* apply patch for DMD link by Paul Wise
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,2 @@
|
||||||
include debianmemberportfolio/config/deployment.ini_tmpl
|
recursive-include debianmemberportfolio/static *
|
||||||
recursive-include debianmemberportfolio/public *
|
|
||||||
recursive-include debianmemberportfolio/templates *
|
recursive-include debianmemberportfolio/templates *
|
||||||
|
|
3
babel.cfg
Normal file
3
babel.cfg
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[python: **.py]
|
||||||
|
[jinja2: **/templates/**.html]
|
||||||
|
extensions=jinja2.ext.autoescape,jinja2.ext.with_
|
|
@ -1,9 +1,9 @@
|
||||||
# -*- python -*-
|
# -*- python -*-
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
# Debian Member Portfolio Service functional tests package
|
# Debian Member Portfolio Service Flask configuration
|
||||||
#
|
#
|
||||||
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
|
# Copyright © 2015 Jan Dittberner <jan@dittberner.info>
|
||||||
#
|
#
|
||||||
# This file is part of the Debian Member Portfolio Service.
|
# This file is part of the Debian Member Portfolio Service.
|
||||||
#
|
#
|
||||||
|
@ -20,3 +20,14 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
WTF_CSRF_ENABLED = False
|
||||||
|
|
||||||
|
# available languages
|
||||||
|
LANGUAGES = {
|
||||||
|
'en': 'English',
|
||||||
|
'de': 'Deutsch',
|
||||||
|
'fr': 'Français',
|
||||||
|
'id': 'Bahasa Indonesia',
|
||||||
|
'pt_BR': 'Portuguese (Brazil)'
|
||||||
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# Debian Member Portfolio Service package
|
# Debian Member Portfolio Service package
|
||||||
#
|
#
|
||||||
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
|
# Copyright © 2009-2015 Jan Dittberner <jan@dittberner.info>
|
||||||
#
|
#
|
||||||
# This file is part of the Debian Member Portfolio Service.
|
# This file is part of the Debian Member Portfolio Service.
|
||||||
#
|
#
|
||||||
|
@ -20,3 +20,12 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from flask import Flask
|
||||||
|
from flask.ext.babel import Babel
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
babel = Babel(app)
|
||||||
|
app.config.from_object('config')
|
||||||
|
|
||||||
|
from debianmemberportfolio import views
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service - 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:debianmemberportfolio
|
|
||||||
full_stack = true
|
|
||||||
static_files = true
|
|
||||||
|
|
||||||
cache_dir = %(here)s/data
|
|
||||||
beaker.session.key = debianmemberportfolio
|
|
||||||
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
|
|
|
@ -1,75 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service environment configuration
|
|
||||||
#
|
|
||||||
# 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 <https://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 debianmemberportfolio.lib.app_globals as app_globals
|
|
||||||
import debianmemberportfolio.lib.helpers
|
|
||||||
from debianmemberportfolio.config.routing import make_map
|
|
||||||
|
|
||||||
|
|
||||||
def load_environment(global_conf, app_conf):
|
|
||||||
"""
|
|
||||||
Configures 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='debianmemberportfolio', paths=paths)
|
|
||||||
|
|
||||||
config['routes.map'] = make_map(config)
|
|
||||||
config['pylons.app_globals'] = app_globals.Globals(config)
|
|
||||||
config['pylons.h'] = debianmemberportfolio.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
|
|
|
@ -1,95 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service middleware configuration
|
|
||||||
#
|
|
||||||
# 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 <https://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 debianmemberportfolio.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
|
|
|
@ -1,58 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service routing configuration
|
|
||||||
#
|
|
||||||
# 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 <https://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 https://routes.readthedocs.org/
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
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='portfolio', action='index')
|
|
||||||
map.connect('/result', controller='portfolio', action='urllist')
|
|
||||||
map.connect('/htmlformhelper.js', controller='showformscripts',
|
|
||||||
action='index')
|
|
||||||
|
|
||||||
map.connect('/{controller}/{action}')
|
|
||||||
map.connect('/{controller}/{action}/{id}')
|
|
||||||
|
|
||||||
return map
|
|
|
@ -1,22 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service controllers package
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
|
@ -1,70 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service ErrorController
|
|
||||||
#
|
|
||||||
# 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 <https://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 debianmemberportfolio.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'))
|
|
|
@ -1,212 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service PortfolioController
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
This module defines the PortfolioController class used to render the portfolio
|
|
||||||
of a person.
|
|
||||||
"""
|
|
||||||
|
|
||||||
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 debianmemberportfolio.lib.base import BaseController, render
|
|
||||||
from debianmemberportfolio.model.form import DDDataRequest, DeveloperData
|
|
||||||
from debianmemberportfolio.model.urlbuilder import build_urls
|
|
||||||
from debianmemberportfolio.model import dddatabuilder
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class PortfolioController(BaseController):
|
|
||||||
"""
|
|
||||||
Main controller for the Debian Member Portfolio Service.
|
|
||||||
"""
|
|
||||||
#: This dictionary defines groups of labeled portfolio items.
|
|
||||||
_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="https://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="https://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="https://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'),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
#: list of field name tuples for Debian Maintainers
|
|
||||||
DM_TUPLES = (('name', 'name'),
|
|
||||||
('gpgfp', 'gpgfp'),
|
|
||||||
('nonddemail', 'email'))
|
|
||||||
|
|
||||||
#: list of field name tuples for Debian Developers
|
|
||||||
DD_TUPLES = (('username', 'username'),
|
|
||||||
('aliothusername', 'username'))
|
|
||||||
|
|
||||||
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 _build_request_params(self):
|
|
||||||
schema = DDDataRequest()
|
|
||||||
formencode.api.set_stdtranslation(
|
|
||||||
domain="FormEncode",
|
|
||||||
languages=[lang[0:2] for lang in request.languages])
|
|
||||||
form_result = schema.to_python(request.params)
|
|
||||||
fields = dddatabuilder.build_data(form_result['email'])
|
|
||||||
rp = request.params.copy()
|
|
||||||
|
|
||||||
if fields['type'] in (dddatabuilder.TYPE_DD, dddatabuilder.TYPE_DM):
|
|
||||||
for tuple in self.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 self.DD_TUPLES:
|
|
||||||
if not tuple[0] in rp or not rp[tuple[0]]:
|
|
||||||
rp[tuple[0]] = fields[tuple[1]]
|
|
||||||
|
|
||||||
return rp
|
|
||||||
|
|
||||||
def urllist(self):
|
|
||||||
"""Handle the actual data."""
|
|
||||||
try:
|
|
||||||
rp = self._build_request_params()
|
|
||||||
except formencode.validators.Invalid as error:
|
|
||||||
c.messages = {'errors': error.unpack_errors()}
|
|
||||||
return render('/showform.mako')
|
|
||||||
|
|
||||||
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')
|
|
|
@ -1,75 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service ShowformscriptsController.
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
This file defines the ShowformscriptsController used to generate the JavaScript
|
|
||||||
code in forms.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import simplejson
|
|
||||||
|
|
||||||
from pylons import request, response
|
|
||||||
from pylons.controllers.util import abort
|
|
||||||
|
|
||||||
import formencode.api
|
|
||||||
import formencode.validators
|
|
||||||
|
|
||||||
from debianmemberportfolio.lib.base import BaseController, render
|
|
||||||
from debianmemberportfolio.model.form import DDDataRequest
|
|
||||||
from debianmemberportfolio.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)
|
|
|
@ -1,55 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service TemplateController
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
This file contains the TemplateController used to render templates.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from debianmemberportfolio.lib.base import BaseController
|
|
||||||
from pylons.controllers.util import abort
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
42
debianmemberportfolio/forms.py
Normal file
42
debianmemberportfolio/forms.py
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from flask.ext.babel import gettext as _
|
||||||
|
from flask.ext.wtf import Form
|
||||||
|
from wtforms import IntegerField, StringField, RadioField
|
||||||
|
from wtforms.validators import (
|
||||||
|
AnyOf, DataRequired, Email, Length, Optional, Regexp
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class FingerPrint(Regexp):
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super(FingerPrint, self).__init__(r'^[a-fA-F0-9]*$', **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class PlainText(Regexp):
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super(PlainText, self).__init__(r'^[a-zA-Z\-0-9]*$')
|
||||||
|
|
||||||
|
|
||||||
|
class DeveloperData(Form):
|
||||||
|
email = StringField('email', validators=[DataRequired(), Email()])
|
||||||
|
name = StringField('name', validators=[DataRequired()])
|
||||||
|
gpgfp = StringField('gpgfp', validators=[
|
||||||
|
FingerPrint(),
|
||||||
|
Length(min=32, max=40)
|
||||||
|
])
|
||||||
|
username = StringField('username', validators=[PlainText()])
|
||||||
|
nonddemail = StringField('nonddemail', validators=[Email()])
|
||||||
|
aliothusername = StringField('aliothusername', validators=[PlainText()])
|
||||||
|
mode = RadioField(
|
||||||
|
'mode', default='html', choices=[
|
||||||
|
('json', _('JSON')), ('html', _('HTML'))
|
||||||
|
], validators=[AnyOf(['json', 'html'])]
|
||||||
|
)
|
||||||
|
forumsid = IntegerField('forumsid', default=None, validators=[Optional()])
|
||||||
|
wikihomepage = StringField('wikihomepage', default=None, validators=[
|
||||||
|
Optional()])
|
||||||
|
|
||||||
|
|
||||||
|
class DeveloperDataRequest(Form):
|
||||||
|
email = StringField('email', validators=[DataRequired(), Email()])
|
|
@ -1,22 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service lib package
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
|
@ -1,43 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service application Globals
|
|
||||||
#
|
|
||||||
# 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 <https://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))
|
|
|
@ -1,55 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service base controller
|
|
||||||
#
|
|
||||||
# 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 <https://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
|
|
||||||
try:
|
|
||||||
languages = request.languages
|
|
||||||
for lang in languages:
|
|
||||||
try:
|
|
||||||
add_fallback(lang.replace('-', '_'))
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
c.messages = {'errors': [], 'messages': []}
|
|
||||||
return WSGIController.__call__(self, environ, start_response)
|
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['BaseController', 'render']
|
|
|
@ -1,35 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service webhelpers
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# pymode:lint_ignore=W0611
|
|
||||||
#
|
|
||||||
"""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
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# Debian Member Portfolio Service data builder
|
# Debian Member Portfolio Service data builder
|
||||||
#
|
#
|
||||||
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
|
# Copyright © 2009-2015 Jan Dittberner <jan@dittberner.info>
|
||||||
#
|
#
|
||||||
# This file is part of the Debian Member Portfolio Service.
|
# This file is part of the Debian Member Portfolio Service.
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service form handling model
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
This file contains the form definitions used in the controllers.
|
|
||||||
"""
|
|
||||||
|
|
||||||
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)
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# Debian Member Portfolio Service key finder module
|
# Debian Member Portfolio Service key finder module
|
||||||
#
|
#
|
||||||
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
|
# Copyright © 2009-2015 Jan Dittberner <jan@dittberner.info>
|
||||||
#
|
#
|
||||||
# This file is part of the Debian Member Portfolio Service.
|
# This file is part of the Debian Member Portfolio Service.
|
||||||
#
|
#
|
||||||
|
@ -36,14 +36,17 @@ cachetimestamp = 0
|
||||||
def _get_keyring_cache():
|
def _get_keyring_cache():
|
||||||
global db, cachetimestamp
|
global db, cachetimestamp
|
||||||
if db is None or (time.time() - cachetimestamp) > 86300:
|
if db is None or (time.time() - cachetimestamp) > 86300:
|
||||||
import anydbm
|
import dbm
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
import os.path
|
import os.path
|
||||||
filename = pkg_resources.resource_filename(__name__,
|
filename = pkg_resources.resource_filename(__name__,
|
||||||
'keyringcache')
|
'keyringcache')
|
||||||
logging.debug('reading cache data from %s', filename)
|
logging.debug('reading cache data from %s', filename)
|
||||||
assert os.path.exists(filename) and os.path.isfile(filename)
|
assert (
|
||||||
db = anydbm.open(filename, 'r')
|
os.path.exists(filename + '.db') and
|
||||||
|
os.path.isfile(filename + '.db')
|
||||||
|
)
|
||||||
|
db = dbm.open(filename, 'r')
|
||||||
cachetimestamp = time.time()
|
cachetimestamp = time.time()
|
||||||
return db
|
return db
|
||||||
|
|
||||||
|
@ -53,7 +56,7 @@ def _get_cached(cachekey):
|
||||||
logging.debug('cache lookup for %s', cachekey)
|
logging.debug('cache lookup for %s', cachekey)
|
||||||
if cachekey in cache:
|
if cachekey in cache:
|
||||||
logging.debug('found entry %s', cache[cachekey])
|
logging.debug('found entry %s', cache[cachekey])
|
||||||
return cache[cachekey]
|
return cache[cachekey].decode('utf8')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,7 +94,7 @@ def getLoginByFingerprint(fpr):
|
||||||
def _dump_cache():
|
def _dump_cache():
|
||||||
cache = _get_keyring_cache()
|
cache = _get_keyring_cache()
|
||||||
fprs = []
|
fprs = []
|
||||||
for key in cache.keys():
|
for key in [key.decode('utf8') for key in list(cache.keys())]:
|
||||||
if key.startswith('email:fpr:'):
|
if key.startswith('email:fpr:'):
|
||||||
fpr = key.replace('email:fpr:', '')
|
fpr = key.replace('email:fpr:', '')
|
||||||
if not fpr in fprs:
|
if not fpr in fprs:
|
||||||
|
@ -102,8 +105,8 @@ def _dump_cache():
|
||||||
email = _get_cached('email:fpr:%s' % fpr)
|
email = _get_cached('email:fpr:%s' % fpr)
|
||||||
name = _get_cached('name:fpr:%s' % fpr)
|
name = _get_cached('name:fpr:%s' % fpr)
|
||||||
|
|
||||||
print fpr, login, ':'
|
print(fpr, login, ':')
|
||||||
print ' ', name, email
|
print(' ', name, email)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# Debian Member Portfolio Service application key ring analyzer tool
|
# Debian Member Portfolio Service application key ring analyzer tool
|
||||||
#
|
#
|
||||||
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
|
# Copyright © 2009-2015 Jan Dittberner <jan@dittberner.info>
|
||||||
#
|
#
|
||||||
# This file is part of the Debian Member Portfolio Service.
|
# This file is part of the Debian Member Portfolio Service.
|
||||||
#
|
#
|
||||||
|
@ -26,10 +26,10 @@ retrieved data in a file database. The tool was inspired by Debian
|
||||||
qa's carnivore.
|
qa's carnivore.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import anydbm
|
import dbm
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
import glob
|
import glob
|
||||||
import ConfigParser
|
import configparser
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
import logging
|
import logging
|
||||||
|
@ -38,7 +38,7 @@ import sys
|
||||||
import email.utils
|
import email.utils
|
||||||
|
|
||||||
|
|
||||||
CONFIG = ConfigParser.SafeConfigParser()
|
CONFIG = configparser.ConfigParser()
|
||||||
|
|
||||||
|
|
||||||
def _get_keyrings():
|
def _get_keyrings():
|
||||||
|
@ -160,11 +160,15 @@ def process_keyrings():
|
||||||
stdout=subprocess.PIPE)
|
stdout=subprocess.PIPE)
|
||||||
fpr = None
|
fpr = None
|
||||||
for line in proc.stdout.readlines():
|
for line in proc.stdout.readlines():
|
||||||
|
try:
|
||||||
|
line = line.decode('utf8')
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
line = line.decode('iso8859-1')
|
||||||
fpr = process_gpg_list_keys_line(line, fpr)
|
fpr = process_gpg_list_keys_line(line, fpr)
|
||||||
retcode = proc.wait()
|
retcode = proc.wait()
|
||||||
if retcode != 0:
|
if retcode != 0:
|
||||||
logging.error("subprocess ended with return code %d", retcode)
|
logging.error("subprocess ended with return code %d", retcode)
|
||||||
db = anydbm.open(pkg_resources.resource_filename(__name__,
|
db = dbm.open(pkg_resources.resource_filename(__name__,
|
||||||
'keyringcache'), 'c')
|
'keyringcache'), 'c')
|
||||||
for key in resultdict:
|
for key in resultdict:
|
||||||
db[key] = ":".join(resultdict[key])
|
db[key] = ":".join(resultdict[key])
|
||||||
|
@ -173,9 +177,9 @@ def process_keyrings():
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
logging.basicConfig(stream=sys.stderr, level=logging.WARNING)
|
logging.basicConfig(stream=sys.stderr, level=logging.WARNING)
|
||||||
CONFIG.readfp(pkg_resources.resource_stream(
|
CONFIG.read_string(pkg_resources.resource_string(
|
||||||
__name__, 'portfolio.ini'))
|
__name__, 'portfolio.ini').decode('utf8'))
|
||||||
gpghome = os.path.expanduser(CONFIG.get('DEFAULT', 'gnupghome'))
|
gpghome = os.path.expanduser(CONFIG.get('DEFAULT', 'gnupghome'))
|
||||||
if not os.path.isdir(gpghome):
|
if not os.path.isdir(gpghome):
|
||||||
os.makedirs(gpghome, 0700)
|
os.makedirs(gpghome, 0o700)
|
||||||
process_keyrings()
|
process_keyrings()
|
||||||
|
|
|
@ -83,7 +83,7 @@ webid.optional=true
|
||||||
alioth.pattern=https://alioth.debian.org/users/%(aliothusername)s/
|
alioth.pattern=https://alioth.debian.org/users/%(aliothusername)s/
|
||||||
alioth.optional=true
|
alioth.optional=true
|
||||||
wiki.pattern=https://wiki.debian.org/%(wikihomepage)s
|
wiki.pattern=https://wiki.debian.org/%(wikihomepage)s
|
||||||
forum.pattern=http://forums.debian.net/memberlist.php?mode=viewprofile&u=%(forumsid)d
|
forum.pattern=http://forums.debian.net/memberlist.php?mode=viewprofile&u=%(forumsid)s
|
||||||
forum.optional=true
|
forum.optional=true
|
||||||
|
|
||||||
[miscellaneous]
|
[miscellaneous]
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# Debian Member Portfolio Service url builder
|
# Debian Member Portfolio Service url builder
|
||||||
#
|
#
|
||||||
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
|
# Copyright © 2009-2015 Jan Dittberner <jan@dittberner.info>
|
||||||
#
|
#
|
||||||
# This file is part of the Debian Member Portfolio Service.
|
# This file is part of the Debian Member Portfolio Service.
|
||||||
#
|
#
|
||||||
|
@ -26,15 +26,18 @@ URLs using the given information and the URL patterns defined in
|
||||||
portfolio.ini.
|
portfolio.ini.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ConfigParser import ConfigParser, InterpolationMissingOptionError
|
from configparser import ConfigParser, InterpolationMissingOptionError
|
||||||
|
from encodings.utf_8 import StreamReader as UTF8StreamReader
|
||||||
|
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
from debianmemberportfolio.model import keyfinder
|
from debianmemberportfolio.model import keyfinder
|
||||||
from urllib import quote_plus
|
from urllib.parse import quote_plus
|
||||||
from pylons.i18n.translation import _, N_
|
from flask.ext.babel import gettext as _, lazy_gettext as N_
|
||||||
|
|
||||||
|
|
||||||
my_config = ConfigParser()
|
my_config = ConfigParser()
|
||||||
my_config.readfp(pkg_resources.resource_stream(__name__, 'portfolio.ini'))
|
my_config.read_file(UTF8StreamReader(
|
||||||
|
pkg_resources.resource_stream(__name__, 'portfolio.ini')))
|
||||||
|
|
||||||
_FIELDNAMES_MAP = {
|
_FIELDNAMES_MAP = {
|
||||||
'email': N_('Email address'),
|
'email': N_('Email address'),
|
||||||
|
@ -62,14 +65,15 @@ def _build_quoted_fields(fields):
|
||||||
Take a dictionary of raw field values and quote the values if required.
|
Take a dictionary of raw field values and quote the values if required.
|
||||||
"""
|
"""
|
||||||
qfields = {}
|
qfields = {}
|
||||||
for key, value in fields.iteritems():
|
for key, value in fields.items():
|
||||||
if value is not None:
|
if value is not None:
|
||||||
if isinstance(value, unicode):
|
if isinstance(value, str):
|
||||||
qfields[key] = quote_plus(value.encode('utf8'))
|
qfields[key] = quote_plus(value.encode('utf8'))
|
||||||
elif isinstance(value, str):
|
elif isinstance(value, str):
|
||||||
qfields[key] = quote_plus(value)
|
qfields[key] = quote_plus(value)
|
||||||
else:
|
else:
|
||||||
qfields[key] = value
|
qfields[key] = value
|
||||||
|
qfields[key] = qfields[key].replace('%', '%%')
|
||||||
|
|
||||||
if 'gpgfp' not in qfields:
|
if 'gpgfp' not in qfields:
|
||||||
fpr = keyfinder.getFingerprintByEmail(fields['email'].encode('utf8'))
|
fpr = keyfinder.getFingerprintByEmail(fields['email'].encode('utf8'))
|
||||||
|
@ -97,8 +101,8 @@ def build_urls(fields):
|
||||||
data.append(
|
data.append(
|
||||||
['url', section, entry,
|
['url', section, entry,
|
||||||
my_config.get(section, entry.name + '.pattern',
|
my_config.get(section, entry.name + '.pattern',
|
||||||
False, qfields)])
|
raw=False, vars=qfields)])
|
||||||
except InterpolationMissingOptionError, e:
|
except InterpolationMissingOptionError as e:
|
||||||
if not entry.optional:
|
if not entry.optional:
|
||||||
if e.reference in _FIELDNAMES_MAP:
|
if e.reference in _FIELDNAMES_MAP:
|
||||||
data.append(['error', section, entry,
|
data.append(['error', section, entry,
|
||||||
|
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
48
debianmemberportfolio/templates/base.html
Normal file
48
debianmemberportfolio/templates/base.html
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
{# vim: ft=jinja
|
||||||
|
Base template for XHTML templates.
|
||||||
|
Copyright © 2009-2015 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 <https://www.gnu.org/licenses/>.
|
||||||
|
#}
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{% block title %}{{ _('Debian Member Portfolio Service') }}{% endblock %}</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='stylesheets/style.css') }}" />
|
||||||
|
{% block extrahead %}{% endblock %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">
|
||||||
|
<img alt="{{ _('Debian Logo') }}" id="debianlogo" src="{{ url_for('static', filename='images/openlogo-100.jpg') }}" height="100" width="100" />
|
||||||
|
<h1>{{ _('Debian Member Portfolio Service') }}</h1>
|
||||||
|
<p>{% trans %}This service has been inspired by Stefano Zacchiroli's <a href="https://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.{% endtrans %}</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">
|
||||||
|
{% block body %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<img alt="{{ _('AGPL - Free Software') }}" id="agpllogo" src="{{ url_for('static', filename='images/agplv3-88x31.png') }}" width="88" height="31" />
|
||||||
|
<p>{% trans 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/' %}The service is available under the terms of the <a href="https://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 }}" title="Gitweb repository browser URL">browse the source code</a> or clone it from <a href="{{ cloneurl }}" title="git clone URL">{{ cloneurl }}</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 }}" title="Debian Member Portfolio Service at Transifex">Transifex</a>.{% endtrans %}</p>
|
||||||
|
<p>{{ _('Copyright © 2009-2015 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&button=compact" type="text/javascript"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,52 +0,0 @@
|
||||||
## -*- 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 <https://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="https://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="https://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&button=compact" type="text/javascript"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
<%def name="extrahead()"></%def>
|
|
103
debianmemberportfolio/templates/showform.html
Normal file
103
debianmemberportfolio/templates/showform.html
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{#
|
||||||
|
Template for the data input form.
|
||||||
|
|
||||||
|
Copyright © 2009-2015 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 <https://www.gnu.org/licenses/>.
|
||||||
|
#}
|
||||||
|
{% block title %}{{ super()}} - {{ _('Enter your personal information') }}{% endblock %}
|
||||||
|
{% block extrahead %}{{ super() }}<script type="text/javascript" src="{{ url_for('static', filename='javascript/jquery/jquery.js') }}"></script>
|
||||||
|
<script type="text/javascript" src="{{ url_for('formhelper_js') }}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
{% block body %}{{ super() }}
|
||||||
|
<form action="{{ url_for('urllist') }}" method="get">
|
||||||
|
<fieldset id="portfolio">
|
||||||
|
<legend>{{ _('Debian Member Portfolio') }}</legend>
|
||||||
|
<div id="emailfield"{% if form.email.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="email">{{ _('Email address:') }}
|
||||||
|
{% if form.email.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.email.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.email }}<br />
|
||||||
|
</div>
|
||||||
|
<div id="showallfield" class="hidden">
|
||||||
|
<input type="checkbox" id="showall" name="showall"/>
|
||||||
|
<label for="showall">{{ _('Show all form fields') }}</label><br />
|
||||||
|
</div>
|
||||||
|
<div id="namefield"{% if form.name.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="name">{{ _('Name:') }}{% if form.name.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.name.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.name }}
|
||||||
|
</div>
|
||||||
|
<div id="gpgfpfield"{% if form.gpgfp.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="gpgfp">{{ _('GPG fingerprint:') }}{% if form.gpgfp.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.gpgfp.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.gpgfp }}
|
||||||
|
</div>
|
||||||
|
<div id="usernamefield"{% if form.username.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="username">{{ _('Debian user name:') }}{% if form.username.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.username.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.username }}
|
||||||
|
</div>
|
||||||
|
<div id="nonddemailfield"{% if form.nonddemail.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="nonddemail">{{ _('Non Debian email address:') }}{% if form.nonddemail.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.nonddemail.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.nonddemail }}
|
||||||
|
</div>
|
||||||
|
<div id="aliothusernamefield"{% if form.aliothusername.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="aliothusername">{{ _('Alioth user name:') }}{% if form.aliothusername.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.aliothusername.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.aliothusername }}
|
||||||
|
</div>
|
||||||
|
<div id="wikihomepagefield"{% if form.wikihomepage.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="wikihomepage">{{ _('Wiki user name:') }}{% if form.wikihomepage.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.wikihomepage.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.wikihomepage }}
|
||||||
|
</div>
|
||||||
|
<div id="forumsidfield"{% if form.forumsid.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="forumsid">{{ _('Forum user id:') }}{% if form.forumsid.erros %}<br />
|
||||||
|
<span class="errormsg">{{ form.forumsid.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{{ form.forumsid }}
|
||||||
|
</div>
|
||||||
|
<div id="modefield"{% if form.mode.errors %} class="witherrors"{% endif %}>
|
||||||
|
<label for="mode">{{ _('Output format:') }}{% if form.mode.errors %}<br />
|
||||||
|
<span class="errormsg">{{ form.mode.errors|join(', ') }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</label><br />
|
||||||
|
{% for subfield in form.mode %}
|
||||||
|
{{ subfield.label }} {{ subfield }}
|
||||||
|
{% endfor %}<br />
|
||||||
|
<input type="submit" value="{{ _('Build Debian Member Portfolio URLs') }}" />
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
|
@ -1,164 +0,0 @@
|
||||||
## -- 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 <https://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='portfolio'), method='get')}
|
|
||||||
<fieldset id="portfolio">
|
|
||||||
<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')} ${h.radio('mode', 'html',
|
|
||||||
checked=(request.params.get('mode',
|
|
||||||
'html') == 'html'))} ${_('JSON')} ${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()}
|
|
|
@ -1,25 +1,22 @@
|
||||||
## -*- coding: utf-8 -*- \
|
{# vim: ft=jinja
|
||||||
<%doc>
|
|
||||||
Helper JavaScript for the data input form.
|
Helper JavaScript for the data input form.
|
||||||
Copyright © 2009, 2010, 2015 Jan Dittberner <jan@dittberner.info>
|
Copyright © 2009, 2010, 2015 Jan Dittberner <jan@dittberner.info>
|
||||||
|
|
||||||
This file is part of DDPortfolio service.
|
This file is part of the Debian Member Portfolio service.
|
||||||
|
|
||||||
DDPortfolio service is free software: you can redistribute it and/or
|
Debian Member Portfolio service is free software: you can redistribute it
|
||||||
modify it under the terms of the GNU Affero General Public License as
|
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
|
published by the Free Software Foundation, either version 3 of the License, or
|
||||||
License, or (at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
DDPortfolio service is distributed in the hope that it will be useful,
|
Debian Member Portfolio service is distributed in the hope that it will be
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
|
||||||
Affero General Public License for more details.
|
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
|
|
||||||
<https://www.gnu.org/licenses/>.
|
|
||||||
</%doc>\
|
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License along
|
||||||
|
with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
#}
|
||||||
var defaulthiddendivs = new Array(
|
var defaulthiddendivs = new Array(
|
||||||
'#namefield', '#gpgfpfield', '#usernamefield', '#nonddemailfield',
|
'#namefield', '#gpgfpfield', '#usernamefield', '#nonddemailfield',
|
||||||
'#aliothusernamefield', '#wikihomepagefield', '#forumsidfield');
|
'#aliothusernamefield', '#wikihomepagefield', '#forumsidfield');
|
||||||
|
@ -32,13 +29,13 @@ var allfielddivs = new Array(
|
||||||
|
|
||||||
function updateFields(data, textStatus) {
|
function updateFields(data, textStatus) {
|
||||||
if (data.type == 2) { // DD
|
if (data.type == 2) { // DD
|
||||||
$('#name').attr('value', data.name).attr('readonly', 'readonly');
|
$('#name').prop('value', data.name).prop('readonly', 'readonly');
|
||||||
$('#gpgfp').attr('value', data.gpgfp);
|
$('#gpgfp').prop('value', data.gpgfp);
|
||||||
$('#username').attr('value', data.username).attr(
|
$('#username').prop('value', data.username).prop(
|
||||||
'readonly', 'readonly');
|
'readonly', 'readonly');
|
||||||
$('#nonddemail').attr('value', data.email).focus();
|
$('#nonddemail').prop('value', data.email).focus();
|
||||||
$('#aliothusername').attr('value', data.username);
|
$('#aliothusername').prop('value', data.username);
|
||||||
$('#wikihomepage').attr('value', data.wikihomepage);
|
$('#wikihomepage').prop('value', data.wikihomepage);
|
||||||
|
|
||||||
$('#namefield').show();
|
$('#namefield').show();
|
||||||
$('#gpgfpfield').show();
|
$('#gpgfpfield').show();
|
||||||
|
@ -50,11 +47,11 @@ function updateFields(data, textStatus) {
|
||||||
|
|
||||||
$('#nonddemail').focus().select();
|
$('#nonddemail').focus().select();
|
||||||
} else if (data.type == 1) { // DM
|
} else if (data.type == 1) { // DM
|
||||||
$('#name').attr('value', data.name).attr('readonly', 'readonly');
|
$('#name').prop('value', data.name).prop('readonly', 'readonly');
|
||||||
$('#gpgfp').attr('value', data.gpgfp);
|
$('#gpgfp').prop('value', data.gpgfp);
|
||||||
$('#username').attr('value', '');
|
$('#username').prop('value', '');
|
||||||
$('#nonddemail').attr('value', data.email).focus();
|
$('#nonddemail').prop('value', data.email).focus();
|
||||||
$('#wikihomepage').attr('value', data.wikihomepage);
|
$('#wikihomepage').prop('value', data.wikihomepage);
|
||||||
|
|
||||||
$('#namefield').show();
|
$('#namefield').show();
|
||||||
$('#gpgfpfield').show();
|
$('#gpgfpfield').show();
|
||||||
|
@ -66,10 +63,10 @@ function updateFields(data, textStatus) {
|
||||||
|
|
||||||
$('#aliothusername').focus().select();
|
$('#aliothusername').focus().select();
|
||||||
} else {
|
} else {
|
||||||
$('#nonddemail').attr('value', data.email);
|
$('#nonddemail').prop('value', data.email);
|
||||||
$('#name').removeAttr('readonly');
|
$('#name').removeAttr('readonly');
|
||||||
$('#username').removeAttr('readonly').attr('value', '');
|
$('#username').removeAttr('readonly').prop('value', '');
|
||||||
$('#gpgfp').attr('value', '');
|
$('#gpgfp').prop('value', '');
|
||||||
|
|
||||||
$('#usernamefield').hide();
|
$('#usernamefield').hide();
|
||||||
$('#gpgfpfield').hide();
|
$('#gpgfpfield').hide();
|
||||||
|
@ -98,7 +95,7 @@ function onChangeShowAll(event) {
|
||||||
function onBlurEmail() {
|
function onBlurEmail() {
|
||||||
if ($.trim($('#email').prop('value')).length > 0) {
|
if ($.trim($('#email').prop('value')).length > 0) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
'url' : '${h.url(controller="showformscripts", action="fetchdddata")}',
|
'url' : '{{ url_for("fetchdddata") }}',
|
||||||
'data' : {'email' : $('#email').prop('value')},
|
'data' : {'email' : $('#email').prop('value')},
|
||||||
'dataType' : 'json',
|
'dataType' : 'json',
|
||||||
'success' : updateFields,
|
'success' : updateFields,
|
||||||
|
@ -116,7 +113,7 @@ $(document).ready(function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#showall').attr('checked', false).change(onChangeShowAll);
|
$('#showall').prop('checked', false).change(onChangeShowAll);
|
||||||
$('#showallfield').show();
|
$('#showallfield').show();
|
||||||
$('#email').blur(onBlurEmail).focus();
|
$('#email').blur(onBlurEmail).focus();
|
||||||
});
|
});
|
61
debianmemberportfolio/templates/showurls.html
Normal file
61
debianmemberportfolio/templates/showurls.html
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{#
|
||||||
|
Template for the url output page.
|
||||||
|
Copyright © 2009-2015 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 <https://www.gnu.org/licenses/>.
|
||||||
|
#}
|
||||||
|
{% block title %}{{ super() }} - {{ _('Your personal links') }}{% endblock %}
|
||||||
|
{% block body %}{{ super() }}
|
||||||
|
{% if urldata %}
|
||||||
|
<fieldset id="portfolio">
|
||||||
|
<legend>{{ _('Debian Member Porfolio') }}</legend>
|
||||||
|
<table id="urltable">
|
||||||
|
<thead>
|
||||||
|
<tr><th>{{ _('Usage') }}</th><th>{{ _('URL') }}</th></tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for row in urldata %}
|
||||||
|
{% if row[0] == 'section' %}
|
||||||
|
<tr class="section"><th class="sectionlabel" colspan="2">{{ row[2] }}</th></tr>
|
||||||
|
{% set urlclass = 'odd' %}
|
||||||
|
{% elif row[0] == 'error' %}
|
||||||
|
<tr class="error">
|
||||||
|
<td>{{ 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>{{ row[4]|safe }}</td>
|
||||||
|
<td>
|
||||||
|
{% if row[2].type == 'url' %}
|
||||||
|
<a href="{{ row[3] }}">{{ row[3]|truncate(120) }}</a>
|
||||||
|
{% else %}
|
||||||
|
<tt>{{ row[3] }}</tt>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% if urlclass == "odd" %}{% set urlclass = "even" %}{% else %}{% set urlclass = "odd" %}{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
{% endif %}
|
||||||
|
<p><a href="{{ url_for('urllist') }}">{{ _('Restart') }}</a></p>
|
||||||
|
{% endblock body %}
|
||||||
|
|
|
@ -1,67 +0,0 @@
|
||||||
## -*- 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 <https://www.gnu.org/licenses/>.
|
|
||||||
</%doc>\
|
|
||||||
<%def name="titleaddon()">
|
|
||||||
- ${_('Your personal links')}
|
|
||||||
</%def>
|
|
||||||
% if c.urldata:
|
|
||||||
<fieldset id="portfolio">
|
|
||||||
<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='portfolio', action='index'))}</p>
|
|
|
@ -1,59 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service tests package
|
|
||||||
#
|
|
||||||
# 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 <https://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)
|
|
|
@ -1,43 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service PortfolioController test
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
This module defines test cases for the PortfolioController.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from debianmemberportfolio.tests import TestController, url
|
|
||||||
|
|
||||||
|
|
||||||
class TestPortfolioController(TestController):
|
|
||||||
"""
|
|
||||||
Test cases for PortfolioController.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def test_index(self):
|
|
||||||
"""
|
|
||||||
Test for the controller's index action.
|
|
||||||
"""
|
|
||||||
response = self.app.get(url(controller='portfolio', action='index'))
|
|
||||||
# Test response...
|
|
||||||
assert response.status_int == 200
|
|
||||||
assert response.content_type == "text/html"
|
|
||||||
assert "Debian Member Portfolio Service" in response
|
|
|
@ -1,44 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service ShowformscriptsController test
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
"""
|
|
||||||
This module defines test cases for the ShowformscriptsController.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from debianmemberportfolio.tests import TestController, url
|
|
||||||
|
|
||||||
|
|
||||||
class TestShowformscriptsController(TestController):
|
|
||||||
"""
|
|
||||||
Test cases for ShowformscriptsController.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def test_index(self):
|
|
||||||
"""
|
|
||||||
Test for the controller's index action.
|
|
||||||
"""
|
|
||||||
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
|
|
|
@ -1,22 +0,0 @@
|
||||||
# -*- python -*-
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service model tests
|
|
||||||
#
|
|
||||||
# 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 <https://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
|
@ -9,25 +9,34 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Debian Member Portfolio Service 0.3.1\n"
|
"Project-Id-Version: Debian Member Portfolio Service 0.3.1\n"
|
||||||
"Report-Msgid-Bugs-To: jan@dittberner.info\n"
|
"Report-Msgid-Bugs-To: jan@dittberner.info\n"
|
||||||
"POT-Creation-Date: 2014-02-08 18:14+0100\n"
|
"POT-Creation-Date: 2015-11-12 22:11+0100\n"
|
||||||
"PO-Revision-Date: 2014-02-08 18:03+0100\n"
|
"PO-Revision-Date: 2015-11-12 22:14+0100\n"
|
||||||
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
|
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
|
||||||
|
"Language: de\n"
|
||||||
"Language-Team: de <de@li.org>\n"
|
"Language-Team: de <de@li.org>\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 0.9.6\n"
|
"Generated-By: Babel 2.1.1\n"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:45
|
#: debianmemberportfolio/forms.py:33
|
||||||
|
msgid "JSON"
|
||||||
|
msgstr "JSON"
|
||||||
|
|
||||||
|
#: debianmemberportfolio/forms.py:33
|
||||||
|
msgid "HTML"
|
||||||
|
msgstr "HTML"
|
||||||
|
|
||||||
|
#: debianmemberportfolio/views.py:39
|
||||||
msgid "Overview"
|
msgid "Overview"
|
||||||
msgstr "Überblick"
|
msgstr "Überblick"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:46
|
#: debianmemberportfolio/views.py:40
|
||||||
msgid "Debian Member's Package Overview"
|
msgid "Debian Member's Package Overview"
|
||||||
msgstr "Paketübersicht des Debian-Mitglieds"
|
msgstr "Paketübersicht des Debian-Mitglieds"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:47
|
#: debianmemberportfolio/views.py:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Debian Member's Package Overview\n"
|
"Debian Member's Package Overview\n"
|
||||||
"... showing all email addresses"
|
"... showing all email addresses"
|
||||||
|
@ -35,11 +44,11 @@ msgstr ""
|
||||||
"Paketübersicht des Debian-Mitglieds\n"
|
"Paketübersicht des Debian-Mitglieds\n"
|
||||||
"... mit allen E-Mailadressen"
|
"... mit allen E-Mailadressen"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:51
|
#: debianmemberportfolio/views.py:45
|
||||||
msgid "Bugs"
|
msgid "Bugs"
|
||||||
msgstr "Fehler"
|
msgstr "Fehler"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:52
|
#: debianmemberportfolio/views.py:46
|
||||||
msgid ""
|
msgid ""
|
||||||
"bugs received\n"
|
"bugs received\n"
|
||||||
"(note: co-maintainers not listed, see <a href=\"https://bugs.debian.org"
|
"(note: co-maintainers not listed, see <a href=\"https://bugs.debian.org"
|
||||||
|
@ -50,247 +59,246 @@ msgstr ""
|
||||||
"href=\"https://bugs.debian.org/cgi-"
|
"href=\"https://bugs.debian.org/cgi-"
|
||||||
"bin/bugreport.cgi?bug=430986\">#430986</a>)"
|
"bin/bugreport.cgi?bug=430986\">#430986</a>)"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:56
|
#: debianmemberportfolio/views.py:50
|
||||||
msgid "bugs reported"
|
msgid "bugs reported"
|
||||||
msgstr "Berichtete Fehler"
|
msgstr "Berichtete Fehler"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:57
|
#: debianmemberportfolio/views.py:51
|
||||||
msgid "user tags"
|
msgid "user tags"
|
||||||
msgstr "User Tags"
|
msgstr "User Tags"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:58
|
#: debianmemberportfolio/views.py:52
|
||||||
msgid "all messages (i.e., full text search for developer name on all bug logs)"
|
msgid "all messages (i.e., full text search for developer name on all bug logs)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Alle Nachrichten (d.h. Volltextsuche nach dem Entwicklernamen in allen "
|
"Alle Nachrichten (d.h. Volltextsuche nach dem Entwicklernamen in allen "
|
||||||
"Fehlerlogs)"
|
"Fehlerlogs)"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:60
|
#: debianmemberportfolio/views.py:54
|
||||||
msgid "<a href=\"https://wiki.debian.org/WNPP\">WNPP</a>"
|
msgid "<a href=\"https://wiki.debian.org/WNPP\">WNPP</a>"
|
||||||
msgstr "<a href=\"https://wiki.debian.org/WNPP\">WNPP</a>"
|
msgstr "<a href=\"https://wiki.debian.org/WNPP\">WNPP</a>"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:61
|
#: debianmemberportfolio/views.py:55
|
||||||
msgid "correspondent for bugs"
|
msgid "correspondent for bugs"
|
||||||
msgstr "Beitragender zu Fehlern"
|
msgstr "Beitragender zu Fehlern"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:62
|
#: debianmemberportfolio/views.py:56
|
||||||
msgid "one year open bug history graph"
|
msgid "one year open bug history graph"
|
||||||
msgstr "Graph der Entwicklung offener Fehlerberichte über ein Jahr"
|
msgstr "Graph der Entwicklung offener Fehlerberichte über ein Jahr"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:65
|
#: debianmemberportfolio/views.py:59
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Build"
|
msgstr "Build"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:66
|
#: debianmemberportfolio/views.py:60
|
||||||
msgid "buildd.d.o"
|
msgid "buildd.d.o"
|
||||||
msgstr "buildd.d.o"
|
msgstr "buildd.d.o"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:67
|
#: debianmemberportfolio/views.py:61
|
||||||
msgid "igloo"
|
msgid "igloo"
|
||||||
msgstr "Igloo"
|
msgstr "Igloo"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:70
|
#: debianmemberportfolio/views.py:64
|
||||||
msgid "Quality Assurance"
|
msgid "Quality Assurance"
|
||||||
msgstr "Qualitätssicherung"
|
msgstr "Qualitätssicherung"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:71
|
#: debianmemberportfolio/views.py:65
|
||||||
msgid "maintainer dashboard"
|
msgid "maintainer dashboard"
|
||||||
msgstr "Maintainer Dashboard"
|
msgstr "Maintainer Dashboard"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:72
|
#: debianmemberportfolio/views.py:66
|
||||||
msgid "lintian reports"
|
msgid "lintian reports"
|
||||||
msgstr "Lintian-Berichte"
|
msgstr "Lintian-Berichte"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:73
|
#: debianmemberportfolio/views.py:67
|
||||||
msgid "full lintian reports (i.e. including \"info\"-level messages)"
|
msgid "full lintian reports (i.e. including \"info\"-level messages)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"vollständige Lintian-Berichte (d.h. inklusive Meldungen der Stufe "
|
"vollständige Lintian-Berichte (d.h. inklusive Meldungen der Stufe "
|
||||||
"\"info\")"
|
"\"info\")"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:75
|
#: debianmemberportfolio/views.py:69
|
||||||
msgid "piuparts"
|
msgid "piuparts"
|
||||||
msgstr "piuparts"
|
msgstr "piuparts"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:76
|
#: debianmemberportfolio/views.py:70
|
||||||
msgid "Debian patch tracking system"
|
msgid "Debian patch tracking system"
|
||||||
msgstr "Debian Nachverfolgungssystem für Patches"
|
msgstr "Debian Nachverfolgungssystem für Patches"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:77
|
#: debianmemberportfolio/views.py:71
|
||||||
msgid "Debian Url ChecKer"
|
msgid "Debian Url ChecKer"
|
||||||
msgstr "Debian URL-Prüfer"
|
msgstr "Debian URL-Prüfer"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:80
|
#: debianmemberportfolio/views.py:74
|
||||||
msgid "Mailing Lists"
|
msgid "Mailing Lists"
|
||||||
msgstr "Mailinglisten"
|
msgstr "Mailinglisten"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:81
|
#: debianmemberportfolio/views.py:75
|
||||||
msgid "lists.d.o"
|
msgid "lists.d.o"
|
||||||
msgstr "lists.d.o"
|
msgstr "lists.d.o"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:82
|
#: debianmemberportfolio/views.py:76
|
||||||
msgid "lists.a.d.o"
|
msgid "lists.a.d.o"
|
||||||
msgstr "lists.a.d.o"
|
msgstr "lists.a.d.o"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:83
|
#: debianmemberportfolio/views.py:77
|
||||||
msgid "gmane"
|
msgid "gmane"
|
||||||
msgstr "Gmane"
|
msgstr "Gmane"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:86
|
#: debianmemberportfolio/views.py:80
|
||||||
msgid "Files"
|
msgid "Files"
|
||||||
msgstr "Dateien"
|
msgstr "Dateien"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:87
|
#: debianmemberportfolio/views.py:81
|
||||||
msgid "people.d.o"
|
msgid "people.d.o"
|
||||||
msgstr "people.d.o"
|
msgstr "people.d.o"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:88
|
#: debianmemberportfolio/views.py:82
|
||||||
msgid "oldpeople"
|
msgid "oldpeople"
|
||||||
msgstr "oldpeople"
|
msgstr "oldpeople"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:89
|
#: debianmemberportfolio/views.py:83 debianmemberportfolio/views.py:91
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:97
|
|
||||||
msgid "Alioth"
|
msgid "Alioth"
|
||||||
msgstr "Alioth"
|
msgstr "Alioth"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:92
|
#: debianmemberportfolio/views.py:86
|
||||||
msgid "Membership"
|
msgid "Membership"
|
||||||
msgstr "Mitgliedschaft"
|
msgstr "Mitgliedschaft"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:93
|
#: debianmemberportfolio/views.py:87
|
||||||
msgid "NM"
|
msgid "NM"
|
||||||
msgstr "NM"
|
msgstr "NM"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:94
|
#: debianmemberportfolio/views.py:88
|
||||||
msgid "DB information via finger"
|
msgid "DB information via finger"
|
||||||
msgstr "DB-Informationen per finger"
|
msgstr "DB-Informationen per finger"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:95
|
#: debianmemberportfolio/views.py:89
|
||||||
msgid "DB information via HTTP"
|
msgid "DB information via HTTP"
|
||||||
msgstr "DB-Informationen per HTTP"
|
msgstr "DB-Informationen per HTTP"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:96
|
#: debianmemberportfolio/views.py:90
|
||||||
msgid "FOAF profile"
|
msgid "FOAF profile"
|
||||||
msgstr "FOAF-Profil"
|
msgstr "FOAF-Profil"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:98
|
#: debianmemberportfolio/views.py:92
|
||||||
msgid "Wiki"
|
msgid "Wiki"
|
||||||
msgstr "Wiki"
|
msgstr "Wiki"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:99
|
#: debianmemberportfolio/views.py:93
|
||||||
msgid "Forum"
|
msgid "Forum"
|
||||||
msgstr "Forum"
|
msgstr "Forum"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:102
|
#: debianmemberportfolio/views.py:96
|
||||||
msgid "Miscellaneous"
|
msgid "Miscellaneous"
|
||||||
msgstr "Sonstiges"
|
msgstr "Sonstiges"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:103
|
#: debianmemberportfolio/views.py:97
|
||||||
msgid "debtags"
|
msgid "debtags"
|
||||||
msgstr "debtags"
|
msgstr "debtags"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:104
|
#: debianmemberportfolio/views.py:98
|
||||||
msgid "Planet Debian (name)"
|
msgid "Planet Debian (name)"
|
||||||
msgstr "Planet Debian (Name)"
|
msgstr "Planet Debian (Name)"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:105
|
#: debianmemberportfolio/views.py:99
|
||||||
msgid "Planet Debian (username)"
|
msgid "Planet Debian (username)"
|
||||||
msgstr "Planet Debian (Benutzername)"
|
msgstr "Planet Debian (Benutzername)"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:106
|
#: debianmemberportfolio/views.py:100
|
||||||
msgid "links"
|
msgid "links"
|
||||||
msgstr "Links"
|
msgstr "Links"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:107
|
#: debianmemberportfolio/views.py:101
|
||||||
msgid "Debian website"
|
msgid "Debian website"
|
||||||
msgstr "Debian Webseite"
|
msgstr "Debian Webseite"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:108
|
#: debianmemberportfolio/views.py:102
|
||||||
msgid "Debian search"
|
msgid "Debian search"
|
||||||
msgstr "Debian-Suche"
|
msgstr "Debian-Suche"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:109
|
#: debianmemberportfolio/views.py:103
|
||||||
msgid "GPG public key via finger"
|
msgid "GPG public key via finger"
|
||||||
msgstr "öffentlicher GPG-Schlüssel per finger"
|
msgstr "öffentlicher GPG-Schlüssel per finger"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:110
|
#: debianmemberportfolio/views.py:104
|
||||||
msgid "GPG public key via HTTP"
|
msgid "GPG public key via HTTP"
|
||||||
msgstr "öffentlicher GPG-Schlüssel per HTTP"
|
msgstr "öffentlicher GPG-Schlüssel per HTTP"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:111
|
#: debianmemberportfolio/views.py:105
|
||||||
msgid "NM, AM participation"
|
msgid "NM, AM participation"
|
||||||
msgstr "NM-, AM-Mitwirkung"
|
msgstr "NM-, AM-Mitwirkung"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:112
|
#: debianmemberportfolio/views.py:106
|
||||||
msgid "Contribution information"
|
msgid "Contribution information"
|
||||||
msgstr "Debian Contributor-Informationen"
|
msgstr "Debian Contributor-Informationen"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:115
|
#: debianmemberportfolio/views.py:109
|
||||||
msgid "Information reachable via ssh (for Debian Members)"
|
msgid "Information reachable via ssh (for Debian Members)"
|
||||||
msgstr "Per ssh erreichbare Informationen (für Debian Mitglieder)"
|
msgstr "Per ssh erreichbare Informationen (für Debian Mitglieder)"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:116
|
#: debianmemberportfolio/views.py:110
|
||||||
msgid "owned debian.net domains"
|
msgid "owned debian.net domains"
|
||||||
msgstr "Besitz von debian.net-Domains"
|
msgstr "Besitz von debian.net-Domains"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:117
|
#: debianmemberportfolio/views.py:111
|
||||||
msgid ""
|
msgid ""
|
||||||
"<a href=\"https://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> database"
|
"<a href=\"https://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a> "
|
||||||
" information"
|
"database information"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Informationen in der <a "
|
"Informationen in der <a "
|
||||||
"href=\"https://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a>-Datenbank"
|
"href=\"https://wiki.debian.org/qa.debian.org/MIATeam\">MIA</a>-Datenbank"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:119
|
#: debianmemberportfolio/views.py:113
|
||||||
msgid "Group membership information"
|
msgid "Group membership information"
|
||||||
msgstr "Information über Gruppenmitgliedschaften"
|
msgstr "Information über Gruppenmitgliedschaften"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:122
|
#: debianmemberportfolio/views.py:116
|
||||||
msgid "Ubuntu"
|
msgid "Ubuntu"
|
||||||
msgstr "Ubuntu"
|
msgstr "Ubuntu"
|
||||||
|
|
||||||
#: debianmemberportfolio/controllers/portfolio.py:123
|
#: debianmemberportfolio/views.py:117
|
||||||
msgid "Available patches from Ubuntu"
|
msgid "Available patches from Ubuntu"
|
||||||
msgstr "Verfügbare Patches aus Ubuntu"
|
msgstr "Verfügbare Patches aus Ubuntu"
|
||||||
|
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:40
|
#: debianmemberportfolio/model/urlbuilder.py:43
|
||||||
msgid "Email address"
|
msgid "Email address"
|
||||||
msgstr "E-Mailadresse"
|
msgstr "E-Mailadresse"
|
||||||
|
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:41
|
#: debianmemberportfolio/model/urlbuilder.py:44
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:42
|
#: debianmemberportfolio/model/urlbuilder.py:45
|
||||||
msgid "GPG fingerprint"
|
msgid "GPG fingerprint"
|
||||||
msgstr "GPG-Fingerabdruck"
|
msgstr "GPG-Fingerabdruck"
|
||||||
|
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:43
|
#: debianmemberportfolio/model/urlbuilder.py:46
|
||||||
msgid "Debian user name"
|
msgid "Debian user name"
|
||||||
msgstr "Debian-Benutzername"
|
msgstr "Debian-Benutzername"
|
||||||
|
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:44
|
#: debianmemberportfolio/model/urlbuilder.py:47
|
||||||
msgid "Non Debian email address"
|
msgid "Non Debian email address"
|
||||||
msgstr "Nicht-Debian-E-Mailadresse"
|
msgstr "Nicht-Debian-E-Mailadresse"
|
||||||
|
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:45
|
#: debianmemberportfolio/model/urlbuilder.py:48
|
||||||
msgid "Alioth user name"
|
msgid "Alioth user name"
|
||||||
msgstr "Alioth-Benutzername"
|
msgstr "Alioth-Benutzername"
|
||||||
|
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:97
|
#: debianmemberportfolio/model/urlbuilder.py:109
|
||||||
#: debianmemberportfolio/model/urlbuilder.py:101
|
#: debianmemberportfolio/model/urlbuilder.py:113
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Missing input: %s"
|
msgid "Missing input: %s"
|
||||||
msgstr "Fehlende Eingabe: %s"
|
msgstr "Fehlende Eingabe: %s"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/base.mako:25
|
#: debianmemberportfolio/templates/base.html:24
|
||||||
#: debianmemberportfolio/templates/base.mako:33
|
#: debianmemberportfolio/templates/base.html:31
|
||||||
msgid "Debian Member Portfolio Service"
|
msgid "Debian Member Portfolio Service"
|
||||||
msgstr "Debian-Mitglieder-Portfolioservice"
|
msgstr "Debian-Mitglieder-Portfolioservice"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/base.mako:31
|
#: debianmemberportfolio/templates/base.html:30
|
||||||
msgid "Debian Logo"
|
msgid "Debian Logo"
|
||||||
msgstr "Debian-Logo"
|
msgstr "Debian-Logo"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/base.mako:34
|
#: debianmemberportfolio/templates/base.html:32
|
||||||
msgid ""
|
msgid ""
|
||||||
"This service has been inspired by Stefano Zacchiroli's <a "
|
"This service has been inspired by Stefano Zacchiroli's <a "
|
||||||
"href=\"https://wiki.debian.org/DDPortfolio\">DDPortfolio page in the "
|
"href=\"https://wiki.debian.org/DDPortfolio\">DDPortfolio page in the "
|
||||||
|
@ -298,16 +306,16 @@ msgid ""
|
||||||
"Debian Member's or package maintainer's information regarding Debian."
|
"Debian Member's or package maintainer's information regarding Debian."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dieser Dienst wurde durch Stefano Zacchirolis <a "
|
"Dieser Dienst wurde durch Stefano Zacchirolis <a "
|
||||||
"href=\"https://wiki.debian.org/DDPortfolio\">DDPortfolio-Seite im Debian "
|
"href=\"http://wiki.debian.org/DDPortfolio\">DDPortfolio-Seite im Debian "
|
||||||
"Wiki</a> inspiriert. Mit dem Dienst können personalisierte Links zu "
|
"Wiki</a> inspiriert. Mit dem Dienst können personalisierte Links zu "
|
||||||
"Informationen im Bezug auf Debian für Debian-Mitglieder und Paketbetreuer"
|
"Informationen im Bezug auf Debian für Debian-Mitglieder und Paketbetreuer"
|
||||||
" erzeugt werden."
|
" erzeugt werden."
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/base.mako:41
|
#: debianmemberportfolio/templates/base.html:39
|
||||||
msgid "AGPL - Free Software"
|
msgid "AGPL - Free Software"
|
||||||
msgstr "AGPL - Freie Software"
|
msgstr "AGPL - Freie Software"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/base.mako:43
|
#: debianmemberportfolio/templates/base.html:40
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The service is available under the terms of the <a "
|
"The service is available under the terms of the <a "
|
||||||
|
@ -322,7 +330,7 @@ msgid ""
|
||||||
"title=\"Debian Member Portfolio Service at Transifex\">Transifex</a>."
|
"title=\"Debian Member Portfolio Service at Transifex\">Transifex</a>."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dieser Dienst wird unter den Bedingungen der <a "
|
"Dieser Dienst wird unter den Bedingungen der <a "
|
||||||
"href=\"https://www.gnu.org/licenses/agpl.html\">GNU Affero General Public "
|
"href=\"http://www.gnu.org/licenses/agpl.html\">GNU Affero General Public "
|
||||||
"License</a>, so wie sie von der Free Software Foundation veröffentlicht "
|
"License</a>, so wie sie von der Free Software Foundation veröffentlicht "
|
||||||
"ist, bereitgestellt. Sie können entweder Version 3 oder (auf Ihren Wunsch"
|
"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 "
|
" hin) jede spätere Version der Lizenz verwenden. Sie können sich <a "
|
||||||
|
@ -333,88 +341,152 @@ msgstr ""
|
||||||
"können Sie auf <a href=\"%(transifexurl)s\" title=\"Debian Member "
|
"können Sie auf <a href=\"%(transifexurl)s\" title=\"Debian Member "
|
||||||
"Portfolio Service bei Transifex\">Transifex</a> dazu beitragen."
|
"Portfolio Service bei Transifex\">Transifex</a> dazu beitragen."
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/base.mako:44
|
#: debianmemberportfolio/templates/base.html:41
|
||||||
msgid "Copyright © 2009-2014 Jan Dittberner"
|
msgid "Copyright © 2009-2015 Jan Dittberner"
|
||||||
msgstr "Copyright © 2009-2014 Jan Dittberner"
|
msgstr "Copyright © 2009-2015 Jan Dittberner"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:24
|
#: debianmemberportfolio/templates/showform.html:22
|
||||||
msgid "Enter your personal information"
|
msgid "Enter your personal information"
|
||||||
msgstr "Eingabe der persönlichen Informationen"
|
msgstr "Eingabe der persönlichen Informationen"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:30
|
#: debianmemberportfolio/templates/showform.html:29
|
||||||
#: debianmemberportfolio/templates/showurls.mako:27
|
|
||||||
msgid "Debian Member Portfolio"
|
msgid "Debian Member Portfolio"
|
||||||
msgstr "Debian-Mitgliederportfolio"
|
msgstr "Debian-Mitglieder-Portfolioservice"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:36
|
#: debianmemberportfolio/templates/showform.html:31
|
||||||
msgid "Email address:"
|
msgid "Email address:"
|
||||||
msgstr "E-Mailadresse:"
|
msgstr "E-Mailadresse:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:47
|
#: debianmemberportfolio/templates/showform.html:40
|
||||||
msgid "Show all form fields"
|
msgid "Show all form fields"
|
||||||
msgstr "Alle Formularfelder anzeigen"
|
msgstr "Alle Formularfelder anzeigen"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:54
|
#: debianmemberportfolio/templates/showform.html:43
|
||||||
msgid "Name:"
|
msgid "Name:"
|
||||||
msgstr "Name:"
|
msgstr "Name:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:64
|
#: debianmemberportfolio/templates/showform.html:50
|
||||||
msgid "GPG fingerprint:"
|
msgid "GPG fingerprint:"
|
||||||
msgstr "GPG-Fingerabdruck:"
|
msgstr "GPG-Fingerabdruck:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:79
|
#: debianmemberportfolio/templates/showform.html:57
|
||||||
msgid "Debian user name:"
|
msgid "Debian user name:"
|
||||||
msgstr "Debian-Benutzername:"
|
msgstr "Debian-Benutzername:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:94
|
#: debianmemberportfolio/templates/showform.html:64
|
||||||
msgid "Non Debian email address:"
|
msgid "Non Debian email address:"
|
||||||
msgstr "Nicht-Debian-E-Mailadresse"
|
msgstr "Nicht-Debian-E-Mailadresse"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:109
|
#: debianmemberportfolio/templates/showform.html:71
|
||||||
msgid "Alioth user name:"
|
msgid "Alioth user name:"
|
||||||
msgstr "Alioth-Benutzername:"
|
msgstr "Alioth-Benutzername:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:125
|
#: debianmemberportfolio/templates/showform.html:78
|
||||||
msgid "Wiki user name:"
|
msgid "Wiki user name:"
|
||||||
msgstr "Wiki-Benutzername:"
|
msgstr "Wiki-Benutzername:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:140
|
#: debianmemberportfolio/templates/showform.html:85
|
||||||
msgid "Forum user id:"
|
msgid "Forum user id:"
|
||||||
msgstr "Forumsbenutzernummer:"
|
msgstr "Forumsbenutzernummer:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:151
|
#: debianmemberportfolio/templates/showform.html:92
|
||||||
msgid "Output format:"
|
msgid "Output format:"
|
||||||
msgstr "Ausgabeformat:"
|
msgstr "Ausgabeformat:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:157
|
#: debianmemberportfolio/templates/showform.html:99
|
||||||
msgid "HTML"
|
|
||||||
msgstr "HTML"
|
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:159
|
|
||||||
msgid "JSON"
|
|
||||||
msgstr "JSON"
|
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showform.mako:161
|
|
||||||
msgid "Build Debian Member Portfolio URLs"
|
msgid "Build Debian Member Portfolio URLs"
|
||||||
msgstr "Debian-Mitgliedsportfolio-URLs bauen"
|
msgstr "Debian-Mitgliedsportfolio-URLs bauen"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showurls.mako:23
|
#: debianmemberportfolio/templates/showurls.html:21
|
||||||
msgid "Your personal links"
|
msgid "Your personal links"
|
||||||
msgstr "Ihre personalisierten Links"
|
msgstr "Ihre personalisierten Links"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showurls.mako:30
|
#: debianmemberportfolio/templates/showurls.html:25
|
||||||
|
msgid "Debian Member Porfolio"
|
||||||
|
msgstr "Debian-Mitgliederportfolio"
|
||||||
|
|
||||||
|
#: debianmemberportfolio/templates/showurls.html:28
|
||||||
msgid "Usage"
|
msgid "Usage"
|
||||||
msgstr "Verwendung"
|
msgstr "Verwendung"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showurls.mako:30
|
#: debianmemberportfolio/templates/showurls.html:28
|
||||||
msgid "URL"
|
msgid "URL"
|
||||||
msgstr "URL"
|
msgstr "URL"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showurls.mako:40
|
#: debianmemberportfolio/templates/showurls.html:38
|
||||||
msgid "Error during URL creation:"
|
msgid "Error during URL creation:"
|
||||||
msgstr "Fehler bei der URL-Erzeugung:"
|
msgstr "Fehler bei der URL-Erzeugung:"
|
||||||
|
|
||||||
#: debianmemberportfolio/templates/showurls.mako:67
|
#: debianmemberportfolio/templates/showurls.html:59
|
||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Neu beginnen"
|
msgstr "Neu beginnen"
|
||||||
|
|
||||||
|
#~ msgid "Debian Logo"
|
||||||
|
#~ msgstr "Debian-Logo"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "AGPL - Free Software"
|
||||||
|
#~ msgstr "AGPL - Freie Software"
|
||||||
|
|
||||||
|
#~ msgid "Copyright © 2009-2014 Jan Dittberner"
|
||||||
|
#~ msgstr "Copyright © 2009-2014 Jan Dittberner"
|
||||||
|
|
||||||
|
#~ msgid "Debian Member Portfolio"
|
||||||
|
#~ msgstr "Debian-Mitgliederportfolio"
|
||||||
|
|
||||||
|
#~ msgid "Email address:"
|
||||||
|
#~ msgstr "E-Mailadresse:"
|
||||||
|
|
||||||
|
#~ msgid "Show all form fields"
|
||||||
|
#~ msgstr "Alle Formularfelder anzeigen"
|
||||||
|
|
||||||
|
#~ msgid "Name:"
|
||||||
|
#~ msgstr "Name:"
|
||||||
|
|
||||||
|
#~ msgid "GPG fingerprint:"
|
||||||
|
#~ msgstr "GPG-Fingerabdruck:"
|
||||||
|
|
||||||
|
#~ msgid "Debian user name:"
|
||||||
|
#~ msgstr "Debian-Benutzername:"
|
||||||
|
|
||||||
|
#~ msgid "Non Debian email address:"
|
||||||
|
#~ msgstr "Nicht-Debian-E-Mailadresse"
|
||||||
|
|
||||||
|
#~ msgid "Alioth user name:"
|
||||||
|
#~ msgstr "Alioth-Benutzername:"
|
||||||
|
|
||||||
|
#~ msgid "Wiki user name:"
|
||||||
|
#~ msgstr "Wiki-Benutzername:"
|
||||||
|
|
||||||
|
#~ msgid "Forum user id:"
|
||||||
|
#~ msgstr "Forumsbenutzernummer:"
|
||||||
|
|
||||||
|
#~ msgid "Output format:"
|
||||||
|
#~ msgstr "Ausgabeformat:"
|
||||||
|
|
||||||
|
#~ msgid "HTML"
|
||||||
|
#~ msgstr "HTML"
|
||||||
|
|
||||||
|
#~ msgid "JSON"
|
||||||
|
#~ msgstr "JSON"
|
||||||
|
|
||||||
|
#~ msgid "Build Debian Member Portfolio URLs"
|
||||||
|
#~ msgstr "Debian-Mitgliedsportfolio-URLs bauen"
|
||||||
|
|
||||||
|
#~ msgid "Your personal links"
|
||||||
|
#~ msgstr "Ihre personalisierten Links"
|
||||||
|
|
||||||
|
#~ msgid "Usage"
|
||||||
|
#~ msgstr "Verwendung"
|
||||||
|
|
||||||
|
#~ msgid "URL"
|
||||||
|
#~ msgstr "URL"
|
||||||
|
|
||||||
|
#~ msgid "Error during URL creation:"
|
||||||
|
#~ msgstr "Fehler bei der URL-Erzeugung:"
|
||||||
|
|
||||||
|
#~ msgid "Restart"
|
||||||
|
#~ msgstr "Neu beginnen"
|
||||||
|
|
218
debianmemberportfolio/views.py
Normal file
218
debianmemberportfolio/views.py
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
# -*- python -*-
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Debian Member Portfolio Service views
|
||||||
|
#
|
||||||
|
# Copyright © 2015 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 <https://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from debianmemberportfolio import app, babel
|
||||||
|
from flask import g, make_response, request, render_template, abort
|
||||||
|
from flask.ext.babel import lazy_gettext as N_
|
||||||
|
from config import LANGUAGES
|
||||||
|
from .forms import DeveloperData, DeveloperDataRequest
|
||||||
|
from .model import dddatabuilder
|
||||||
|
from .model.urlbuilder import build_urls
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
#: This dictionary defines groups of labeled portfolio items.
|
||||||
|
_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="https://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="https://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="https://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'),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
#: list of field name tuples for Debian Maintainers
|
||||||
|
DM_TUPLES = (('name', 'name'),
|
||||||
|
('gpgfp', 'gpgfp'),
|
||||||
|
('nonddemail', 'email'))
|
||||||
|
|
||||||
|
#: list of field name tuples for Debian Developers
|
||||||
|
DD_TUPLES = (('username', 'username'),
|
||||||
|
('aliothusername', 'username'))
|
||||||
|
|
||||||
|
|
||||||
|
def _get_label(section, url=None):
|
||||||
|
if section in _LABELS:
|
||||||
|
if url:
|
||||||
|
if url in _LABELS[section]:
|
||||||
|
return _LABELS[section][url]
|
||||||
|
elif 'label' in _LABELS[section]:
|
||||||
|
return _LABELS[section]['label']
|
||||||
|
if url:
|
||||||
|
return "%s.%s" % (section, url)
|
||||||
|
return section
|
||||||
|
|
||||||
|
|
||||||
|
@babel.localeselector
|
||||||
|
def get_locale():
|
||||||
|
return request.accept_languages.best_match(LANGUAGES.keys())
|
||||||
|
|
||||||
|
|
||||||
|
@app.before_request
|
||||||
|
def before_request():
|
||||||
|
g.locale = get_locale()
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
form = DeveloperData()
|
||||||
|
return render_template('showform.html', form=form)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/result')
|
||||||
|
def urllist():
|
||||||
|
form = DeveloperData(request.values)
|
||||||
|
if form.validate():
|
||||||
|
fields = dddatabuilder.build_data(form.data['email'])
|
||||||
|
rp = request.values
|
||||||
|
|
||||||
|
if fields['type'] in (dddatabuilder.TYPE_DD, dddatabuilder.TYPE_DM):
|
||||||
|
for dmtuple in DM_TUPLES:
|
||||||
|
if not dmtuple[0] in rp or not rp[dmtuple[0]]:
|
||||||
|
rp[dmtuple[0]] = fields[dmtuple[1]]
|
||||||
|
if fields['type'] == dddatabuilder.TYPE_DD:
|
||||||
|
for ddtuple in DD_TUPLES:
|
||||||
|
if not ddtuple[0] in rp or not rp[ddtuple[0]]:
|
||||||
|
rp[ddtuple[0]] = fields[ddtuple[1]]
|
||||||
|
if form.data['wikihomepage'] is None:
|
||||||
|
log.debug('generate wikihomepage from name')
|
||||||
|
form.data['wikihomepage'] = "".join([
|
||||||
|
part.capitalize() for part in form.data['name'].split()
|
||||||
|
])
|
||||||
|
|
||||||
|
data = build_urls(form.data)
|
||||||
|
|
||||||
|
if form.data['mode'] == 'json':
|
||||||
|
response = make_response(json.dumps(dict(
|
||||||
|
[("{}.{}".format(entry[1], entry[2].name), entry[3])
|
||||||
|
for entry in data if entry[0] == 'url'])))
|
||||||
|
response.headers['Content-Type'] = 'application/json'
|
||||||
|
return response
|
||||||
|
|
||||||
|
for entry in data:
|
||||||
|
if entry[0] in ('url', 'error'):
|
||||||
|
entry.append(_get_label(entry[1], entry[2].name))
|
||||||
|
elif entry[0] == 'section':
|
||||||
|
entry.append(_get_label(entry[1]))
|
||||||
|
|
||||||
|
return render_template('showurls.html', urldata=data)
|
||||||
|
return render_template('showform.html', form=form)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/htmlformhelper.js')
|
||||||
|
def formhelper_js():
|
||||||
|
response = make_response(render_template('showformscript.js'))
|
||||||
|
response.headers['Content-Type'] = 'text/javascript; charset=utf-8'
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/showformscripts/fetchdddata/')
|
||||||
|
def fetchdddata():
|
||||||
|
form = DeveloperDataRequest(request.values)
|
||||||
|
if form.validate():
|
||||||
|
fields = dddatabuilder.build_data(form.data['email'])
|
||||||
|
log.debug(fields)
|
||||||
|
response = make_response(json.dumps(fields))
|
||||||
|
response.headers['Content-Type'] = 'application/json'
|
||||||
|
return response
|
||||||
|
abort(
|
||||||
|
400,
|
||||||
|
"\n".join(["%s: %s" % (key, form.errors[key]) for key in form.errors])
|
||||||
|
)
|
|
@ -1,73 +0,0 @@
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service - Pylons development environment
|
|
||||||
# configuration
|
|
||||||
#
|
|
||||||
# The %(here)s variable will be replaced with the parent directory of this file
|
|
||||||
#
|
|
||||||
[DEFAULT]
|
|
||||||
debug = true
|
|
||||||
# Uncomment and replace with the address which should receive any error reports
|
|
||||||
#email_to = you@yourdomain.com
|
|
||||||
smtp_server = localhost
|
|
||||||
error_email_from = paste@localhost
|
|
||||||
|
|
||||||
[server:main]
|
|
||||||
use = egg:Paste#http
|
|
||||||
host = 127.0.0.1
|
|
||||||
port = 5000
|
|
||||||
|
|
||||||
[app:main]
|
|
||||||
use = egg:debianmemberportfolio
|
|
||||||
full_stack = true
|
|
||||||
static_files = true
|
|
||||||
|
|
||||||
cache_dir = %(here)s/data
|
|
||||||
beaker.session.key = debianmemberportfolio
|
|
||||||
beaker.session.secret = somesecret
|
|
||||||
|
|
||||||
# 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, routes, debianmemberportfolio
|
|
||||||
|
|
||||||
[handlers]
|
|
||||||
keys = console
|
|
||||||
|
|
||||||
[formatters]
|
|
||||||
keys = generic
|
|
||||||
|
|
||||||
[logger_root]
|
|
||||||
level = INFO
|
|
||||||
handlers = console
|
|
||||||
|
|
||||||
[logger_routes]
|
|
||||||
level = INFO
|
|
||||||
handlers =
|
|
||||||
qualname = routes.middleware
|
|
||||||
# "level = DEBUG" logs the route matched and routing variables.
|
|
||||||
|
|
||||||
[logger_debianmemberportfolio]
|
|
||||||
level = DEBUG
|
|
||||||
handlers =
|
|
||||||
qualname = debianmemberportfolio
|
|
||||||
|
|
||||||
[handler_console]
|
|
||||||
class = StreamHandler
|
|
||||||
args = (sys.stderr,)
|
|
||||||
level = NOTSET
|
|
||||||
formatter = generic
|
|
||||||
|
|
||||||
[formatter_generic]
|
|
||||||
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] [%(threadName)s] %(message)s
|
|
||||||
datefmt = %H:%M:%S
|
|
|
@ -1,16 +1,15 @@
|
||||||
Development of Debian Member Portfolio Service
|
Development of Debian Member Portfolio Service
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
The Debian Member Portfolio Service is implemented in `Python
|
The Debian Member Portfolio Service is implemented in `Python 3
|
||||||
<https://www.python.org>`_ using the `Pylons
|
<https://www.python.org>`_ using the `Flask <http://flask.pocoo.org/>`_ web
|
||||||
<https://pylons.readthedocs.org/en/latest/>`_ web application
|
application framework.
|
||||||
framework.
|
|
||||||
|
|
||||||
The following sections describe how to setup a local development environment
|
The following sections describe how to setup a local development environment
|
||||||
for the Debian Member Portfolio Service.
|
for the Debian Member Portfolio Service.
|
||||||
|
|
||||||
All instructions assume that you work on a Debian system. You should use Python
|
All instructions assume that you work on a Debian system. You should use Python
|
||||||
2.7 for development.
|
3 for development.
|
||||||
|
|
||||||
Setup of a local development
|
Setup of a local development
|
||||||
----------------------------
|
----------------------------
|
||||||
|
@ -22,53 +21,48 @@ To start working on the source code you need to have `git`_ installed::
|
||||||
.. _git: http://www.git-scm.com/
|
.. _git: http://www.git-scm.com/
|
||||||
|
|
||||||
The canonical git repository for the Debian Member Portfolio Service is
|
The canonical git repository for the Debian Member Portfolio Service is
|
||||||
available at http://debianstuff.dittberner.info/git/debianmemberportfolio.git.
|
available at https://debianstuff.dittberner.info/git/debianmemberportfolio.git.
|
||||||
To get a clone of the source code you change to a directory of your choice and
|
To get a clone of the source code you change to a directory of your choice and
|
||||||
invoke git clone::
|
invoke git clone::
|
||||||
|
|
||||||
cd ~/src
|
cd ~/src
|
||||||
git clone http://debianstuff.dittberner.info/git/debianmemberportfolio.git
|
git clone https://debianstuff.dittberner.info/git/debianmemberportfolio.git
|
||||||
|
|
||||||
You should use `virtualenv`_ to separate the development environment from your
|
You should use `venv`_ to separate the development environment from your
|
||||||
system wide Python installation. You can install virtualenv using::
|
system wide Python installation. You can install virtualenv using::
|
||||||
|
|
||||||
sudo aptitude install python-virtualenv
|
sudo aptitude install python3-venv
|
||||||
|
|
||||||
.. _virtualenv: https://pypi.python.org/pypi/virtualenv
|
.. _venv: https://docs.python.org/3/library/venv.html
|
||||||
|
|
||||||
When you have :command:`virtualenv` installed you should create a virtual
|
When you have :command:`pyvenv` installed you should create a virtual
|
||||||
environment for Debian Member Portfolio Service development and install the
|
environment for Debian Member Portfolio Service development and install the
|
||||||
requirements using `pip <https://pypi.python.org/pypi/pip>`_::
|
requirements using `pip <https://pypi.python.org/pypi/pip>`_::
|
||||||
|
|
||||||
mkdir ~/.virtualenvs
|
mkdir ~/.virtualenvs
|
||||||
virtualenv --distribute ~/.virtualenvs/dmportfolio
|
pyvenv ~/.virtualenvs/dmportfolio
|
||||||
. ~/.virtualenvs/dmportfolio/bin/activate
|
. ~/.virtualenvs/dmportfolio/bin/activate
|
||||||
cd ~/src/debianmemberportfolio
|
cd ~/src/debianmemberportfolio
|
||||||
pip install -r jessiereq.pip
|
pip install -r stretchreq.pip
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
The Debian Member Portfolio Service instance at http://portfolio.debian.net/
|
The Debian Member Portfolio Service instance at http://portfolio.debian.net/
|
||||||
is running on a Debian Jessie server, therefore :file:`jessiereq.pip`
|
is running on a Debian Stretch server, therefore :file:`stretchreq.pip`
|
||||||
contains dependency versions matching that Debian release.
|
contains dependency versions matching that Debian release.
|
||||||
|
|
||||||
The dependency download and installation into the virtual environment takes
|
The dependency download and installation into the virtual environment takes
|
||||||
some time.
|
some time.
|
||||||
|
|
||||||
After you have your virtual environment ready you need to setup the project for
|
|
||||||
development::
|
|
||||||
|
|
||||||
python setup.py develop
|
|
||||||
|
|
||||||
Debian Member Portfolio Service needs the JQuery JavaScript library to function
|
Debian Member Portfolio Service needs the JQuery JavaScript library to function
|
||||||
properly. The JQuery library is not included in the git clone and must be
|
properly. The JQuery library is not included in the git clone and must be
|
||||||
copied into the subdirectory
|
copied into the subdirectory
|
||||||
:file:`debianmemberportfolio/public/javascript/jquery`. On Debian systems you
|
:file:`debianmemberportfolio/static/javascript/jquery`. On Debian systems you
|
||||||
can install the package libjs-jquery and place a symlink to the directory
|
can install the package libjs-jquery and place a symlink to the directory
|
||||||
:file:`/usr/share/javascript` into :file:`debianmemberportfolio/public`: ::
|
:file:`/usr/share/javascript` into :file:`debianmemberportfolio/static`: ::
|
||||||
|
|
||||||
sudo aptitude install libjs-jquery
|
sudo aptitude install libjs-jquery
|
||||||
ln -s /usr/share/javascript debianmemberportfolio/public
|
ln -s /usr/share/javascript debianmemberportfolio/static
|
||||||
|
|
||||||
Prepare for first startup
|
Prepare for first startup
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -93,21 +87,19 @@ When you have both installed you can run::
|
||||||
The first synchronizes the keyrings in :file:`$HOME/debian/keyring.debian.org`
|
The first synchronizes the keyrings in :file:`$HOME/debian/keyring.debian.org`
|
||||||
with files on the `keyring.debian.org <http://keyring.debian.org>`_ host. And
|
with files on the `keyring.debian.org <http://keyring.debian.org>`_ host. And
|
||||||
the second generates a key/value database in
|
the second generates a key/value database in
|
||||||
:file:`debianmemberportfolio/model/keyringcache` that is used by the code.
|
:file:`debianmemberportfolio/model/keyringcache.db` that is used by the code.
|
||||||
|
|
||||||
Run a development server
|
Run a development server
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Pylons uses PasteScript to run a development server. You can run a development
|
You can run a development server using::
|
||||||
server using::
|
|
||||||
|
|
||||||
paster serve --reload development.ini
|
python3 run.py
|
||||||
|
|
||||||
The output of this command should look like the following::
|
The output of this command should look like the following::
|
||||||
|
|
||||||
Starting subprocess with file monitor
|
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
|
||||||
Starting server in PID 31377.
|
* Restarting with stat
|
||||||
serving on http://127.0.0.1:5000
|
|
||||||
|
|
||||||
You can now access your development server at the URL that is printed by the command.
|
You can now access your development server at the URL that is printed by the command.
|
||||||
|
|
||||||
|
@ -122,21 +114,17 @@ Add new URL
|
||||||
Debian Member Portfolio Service uses a ini style configuration file
|
Debian Member Portfolio Service uses a ini style configuration file
|
||||||
:file:`debianmemberportfolio/model/portfolio.ini` to configure the generated URL
|
:file:`debianmemberportfolio/model/portfolio.ini` to configure the generated URL
|
||||||
patterns. The actual URL generation is done in
|
patterns. The actual URL generation is done in
|
||||||
:py:class:`~debianmemberportfolio.controllers.portfolio.DdportfolioController`
|
:py:func:`~debianmemberportfolio.views.urllist`.
|
||||||
in the
|
|
||||||
:py:meth:`~debianmemberportfolio.controllers.portfolio.DdportfolioController.urllist`
|
|
||||||
method.
|
|
||||||
|
|
||||||
If you want to add a new URL type you have to add a line in
|
If you want to add a new URL type you have to add a line in
|
||||||
:file:`portfolio.ini` and an entry in
|
:file:`portfolio.ini` and an entry in :py:mod:`~debianmemberportfolio.views`'s
|
||||||
:py:class:`~debianmemberportfolio.controllers.portfolio.DdportfolioController`'s
|
:py:attr:`~debianmemberportfolio.views._LABELS` dictionary. The top level
|
||||||
:py:attr:`~debianmemberportfolio.controllers.portfolio.DdportfolioController._LABELS`
|
dictionary keys correspond to sections in the ini file. The dictionary values
|
||||||
dictionary. The top level dictionary keys correspond to sections in the ini
|
are dictionaries themselves that contain a special key ``label`` that defines
|
||||||
file. The dictionary values are dictionaries themselves that contain a special
|
the label of the section in the output and keys for each entry to be rendered
|
||||||
key ``label`` that defines the label of the section in the output and keys for
|
in that section. The values in these sub-dictionaries are strings marked for
|
||||||
each entry to be rendered in that section. The values in these sub-dictionaries
|
translation using the :py:func:`~flask.ext.babel.lazy_gettext` function from
|
||||||
are strings marked for translation using the :py:func:`~pylons.i18n._` function from
|
:py:mod:`flask.ext.babel`.
|
||||||
:py:mod:`pylons.i18n`.
|
|
||||||
|
|
||||||
The patterns in :file:`portfolio.ini` can contain the following placeholders
|
The patterns in :file:`portfolio.ini` can contain the following placeholders
|
||||||
that are filled at runtime:
|
that are filled at runtime:
|
||||||
|
@ -148,7 +136,7 @@ Placeholder Replacement
|
||||||
%(email)s email address (URL encoded)
|
%(email)s email address (URL encoded)
|
||||||
%(emailnoq)s email address
|
%(emailnoq)s email address
|
||||||
%(firstchar)s first character of the email address
|
%(firstchar)s first character of the email address
|
||||||
%(forumsid)d forum user id
|
%(forumsid)s forum user id
|
||||||
%(gpgfp)s GNUPG/PGP key fingerprint
|
%(gpgfp)s GNUPG/PGP key fingerprint
|
||||||
%(name)s full name (i.e. John Smith)
|
%(name)s full name (i.e. John Smith)
|
||||||
%(username)s Debian user name
|
%(username)s Debian user name
|
||||||
|
@ -158,10 +146,9 @@ Placeholder Replacement
|
||||||
.. _alioth.debian.org: https://alioth.debian.org/
|
.. _alioth.debian.org: https://alioth.debian.org/
|
||||||
|
|
||||||
The replacement of placeholders is performed in the
|
The replacement of placeholders is performed in the
|
||||||
:py:meth:`~debianmemberportfolio.controllers.portfolio.DdportfolioController.urllist`
|
:py:func:`~debianmemberportfolio.views.urllist` function. And uses data from
|
||||||
method. And uses data from the Debian keyring. Access to the pre-parsed keyring
|
the Debian keyring. Access to the pre-parsed keyring data is performed using
|
||||||
data is performed using the
|
the :py:func:`~debianmemberportfolio.model.dddatabuilder.build_data` function
|
||||||
:py:func:`~debianmemberportfolio.model.dddatabuilder.build_data` function of
|
of the module :py:mod:`debianmemberportfolio.model.dddatabuilder`, which uses
|
||||||
the module :py:mod:`debianmemberportfolio.model.dddatabuilder`, which uses
|
|
||||||
several helper functions from :py:mod:`debianmemberportfolio.model.keyfinder`
|
several helper functions from :py:mod:`debianmemberportfolio.model.keyfinder`
|
||||||
to access the key information.
|
to access the key information.
|
||||||
|
|
|
@ -4,58 +4,16 @@ Source documentation
|
||||||
The sections below contain mostly autogenerated documentation of the source
|
The sections below contain mostly autogenerated documentation of the source
|
||||||
code of the Debian Member Portfolio Service.
|
code of the Debian Member Portfolio Service.
|
||||||
|
|
||||||
Controllers
|
Forms
|
||||||
-----------
|
-----
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.controllers
|
.. automodule:: debianmemberportfolio.forms
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
portfolio controller
|
Views
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
-----
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.controllers.portfolio
|
.. automodule:: debianmemberportfolio.views
|
||||||
:members:
|
|
||||||
|
|
||||||
error controller
|
|
||||||
~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.controllers.error
|
|
||||||
:members:
|
|
||||||
|
|
||||||
showformscripts controller
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.controllers.showformscripts
|
|
||||||
:members:
|
|
||||||
|
|
||||||
template controller
|
|
||||||
~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.controllers.template
|
|
||||||
:members:
|
|
||||||
|
|
||||||
Library code
|
|
||||||
------------
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.lib
|
|
||||||
:members:
|
|
||||||
|
|
||||||
app_globals
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.lib.app_globals
|
|
||||||
:members:
|
|
||||||
|
|
||||||
base
|
|
||||||
~~~~
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.lib.base
|
|
||||||
:members:
|
|
||||||
|
|
||||||
helpers
|
|
||||||
~~~~~~~
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.lib.helpers
|
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
Model
|
Model
|
||||||
|
@ -70,12 +28,6 @@ dddatabuilder
|
||||||
.. automodule:: debianmemberportfolio.model.dddatabuilder
|
.. automodule:: debianmemberportfolio.model.dddatabuilder
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
form
|
|
||||||
~~~~
|
|
||||||
|
|
||||||
.. automodule:: debianmemberportfolio.model.form
|
|
||||||
:members:
|
|
||||||
|
|
||||||
keyfinder
|
keyfinder
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
Babel==1.3
|
|
||||||
Beaker==1.6.4
|
|
||||||
FormEncode==1.2.6
|
|
||||||
Mako==1.0.0
|
|
||||||
MarkupSafe==0.23
|
|
||||||
Paste==1.7.5.1
|
|
||||||
PasteDeploy==1.5.2
|
|
||||||
PasteScript==1.7.5
|
|
||||||
Pygments==2.0.1
|
|
||||||
Pylons==1.0.1
|
|
||||||
Routes==2.0
|
|
||||||
Tempita==0.5.2
|
|
||||||
WebError==0.10.3
|
|
||||||
WebHelpers==1.3
|
|
||||||
WebOb==1.4
|
|
||||||
WebTest==2.0.16
|
|
||||||
nose==1.3.4
|
|
||||||
simplejson==3.6.5
|
|
10
debianmemberportfolio/config/__init__.py → run.py
Normal file → Executable file
10
debianmemberportfolio/config/__init__.py → run.py
Normal file → Executable file
|
@ -1,9 +1,10 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
# -*- python -*-
|
# -*- python -*-
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#
|
#
|
||||||
# Debian Member Portfolio Service config package
|
# Debian Member Portfolio Service Flask runner
|
||||||
#
|
#
|
||||||
# Copyright © 2009-2014 Jan Dittberner <jan@dittberner.info>
|
# Copyright © 2015 Jan Dittberner <jan@dittberner.info>
|
||||||
#
|
#
|
||||||
# This file is part of the Debian Member Portfolio Service.
|
# This file is part of the Debian Member Portfolio Service.
|
||||||
#
|
#
|
||||||
|
@ -20,3 +21,8 @@
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
from debianmemberportfolio import app
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.debug = True
|
||||||
|
app.run()
|
19
setup.cfg
19
setup.cfg
|
@ -12,29 +12,28 @@ doc-dir=docs/html
|
||||||
make-dirs=1
|
make-dirs=1
|
||||||
|
|
||||||
[nosetests]
|
[nosetests]
|
||||||
with-pylons = test.ini
|
|
||||||
cover-package = debianmemberportfolio
|
cover-package = debianmemberportfolio
|
||||||
|
|
||||||
# Babel configuration
|
# Babel configuration
|
||||||
[compile_catalog]
|
[compile_catalog]
|
||||||
domain = debianmemberportfolio
|
domain = messages
|
||||||
directory = debianmemberportfolio/i18n
|
directory = debianmemberportfolio/translations
|
||||||
statistics = true
|
statistics = true
|
||||||
|
|
||||||
[extract_messages]
|
[extract_messages]
|
||||||
charset = UTF-8
|
charset = UTF-8
|
||||||
add_comments = TRANSLATORS:
|
add_comments = TRANSLATORS:
|
||||||
output_file = debianmemberportfolio/i18n/debianmemberportfolio.pot
|
output_file = messages.pot
|
||||||
width = 80
|
width = 80
|
||||||
msgid_bugs_address = jan@dittberner.info
|
msgid_bugs_address = jan@dittberner.info
|
||||||
|
|
||||||
[init_catalog]
|
[init_catalog]
|
||||||
domain = debianmemberportfolio
|
domain = messages
|
||||||
input_file = debianmemberportfolio/i18n/debianmemberportfolio.pot
|
input_file = messages.pot
|
||||||
output_dir = debianmemberportfolio/i18n
|
output_dir = debianmemberportfolio/translations
|
||||||
|
|
||||||
[update_catalog]
|
[update_catalog]
|
||||||
domain = debianmemberportfolio
|
domain = messages
|
||||||
input_file = debianmemberportfolio/i18n/debianmemberportfolio.pot
|
input_file = messages.pot
|
||||||
output_dir = debianmemberportfolio/i18n
|
output_dir = debianmemberportfolio/translations
|
||||||
previous = true
|
previous = true
|
||||||
|
|
16
setup.py
16
setup.py
|
@ -46,22 +46,16 @@ setup(
|
||||||
author_email='jan@dittberner.info',
|
author_email='jan@dittberner.info',
|
||||||
url='http://debian-stuff.dittberner.info/debianmemberportfolio',
|
url='http://debian-stuff.dittberner.info/debianmemberportfolio',
|
||||||
license='AGPL-3.0+',
|
license='AGPL-3.0+',
|
||||||
install_requires=["Pylons>=1.0", 'babel>=0.9.6'],
|
install_requires=["Flask>=0.10.1", 'Babel>=1.3', 'Flask-Babel>=0.9'],
|
||||||
packages=find_packages(exclude=['ez_setup']),
|
packages=find_packages(exclude=['ez_setup']),
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
test_suite='nose.collector',
|
test_suite='nose.collector',
|
||||||
package_data={'debianmemberportfolio':
|
package_data={'debianmemberportfolio':
|
||||||
['*.ini', 'i18n/*/LC_MESSAGES/*.mo']},
|
['*.ini', 'translations/*/LC_MESSAGES/*.mo']},
|
||||||
message_extractors={'debianmemberportfolio': [
|
message_extractors={'debianmemberportfolio': [
|
||||||
('**.py', 'python', None),
|
('**.py', 'python', None),
|
||||||
('templates/**.mako', 'mako', None),
|
('templates/**.html', 'jinja2', None),
|
||||||
('public/**', 'ignore', None)]},
|
('templates/**.js', 'jinja2', None),
|
||||||
|
('static/**', 'ignore', None)]},
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
entry_points="""
|
|
||||||
[paste.app_factory]
|
|
||||||
main = debianmemberportfolio.config.middleware:make_app
|
|
||||||
|
|
||||||
[paste.app_install]
|
|
||||||
main = pylons.util:PylonsInstaller
|
|
||||||
""",
|
|
||||||
)
|
)
|
||||||
|
|
29
stretch.pip
Normal file
29
stretch.pip
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
Flask==0.10.1
|
||||||
|
Jinja2==2.8
|
||||||
|
MarkupSafe==0.23
|
||||||
|
Werkzeug==0.10.4
|
||||||
|
itsdangerous==0.24
|
||||||
|
Babel==2.1.1
|
||||||
|
Flask-Babel==0.9
|
||||||
|
pytz==2012c
|
||||||
|
speaklater==1.3
|
||||||
|
Flask-WTF==0.12
|
||||||
|
WTForms==2.0.2
|
||||||
|
#Babel==1.3
|
||||||
|
#Beaker==1.6.4
|
||||||
|
#FormEncode==1.2.6
|
||||||
|
#Mako==1.0.0
|
||||||
|
#MarkupSafe==0.23
|
||||||
|
#Paste==1.7.5.1
|
||||||
|
#PasteDeploy==1.5.2
|
||||||
|
#PasteScript==1.7.5
|
||||||
|
#Pygments==2.0.1
|
||||||
|
#Pylons==1.0.1
|
||||||
|
#Routes==2.0
|
||||||
|
#Tempita==0.5.2
|
||||||
|
#WebError==0.10.3
|
||||||
|
#WebHelpers==1.3
|
||||||
|
#WebOb==1.4
|
||||||
|
#WebTest==2.0.16
|
||||||
|
#nose==1.3.4
|
||||||
|
#simplejson==3.6.5
|
21
test.ini
21
test.ini
|
@ -1,21 +0,0 @@
|
||||||
#
|
|
||||||
# Debian Member Portfolio Service - Pylons testing environment configuration
|
|
||||||
#
|
|
||||||
# The %(here)s variable will be replaced with the parent directory of this file
|
|
||||||
#
|
|
||||||
[DEFAULT]
|
|
||||||
debug = true
|
|
||||||
# Uncomment and replace with the address which should receive any error reports
|
|
||||||
#email_to = you@yourdomain.com
|
|
||||||
smtp_server = localhost
|
|
||||||
error_email_from = paste@localhost
|
|
||||||
|
|
||||||
[server:main]
|
|
||||||
use = egg:Paste#http
|
|
||||||
host = 127.0.0.1
|
|
||||||
port = 5000
|
|
||||||
|
|
||||||
[app:main]
|
|
||||||
use = config:development.ini
|
|
||||||
|
|
||||||
# Add additional test specific configuration options as necessary.
|
|
|
@ -1,20 +0,0 @@
|
||||||
Babel==0.9.6
|
|
||||||
Beaker==1.6.3
|
|
||||||
FormEncode==1.2.4
|
|
||||||
Mako==0.7.0
|
|
||||||
MarkupSafe==0.15
|
|
||||||
Paste==1.7.5.1
|
|
||||||
PasteDeploy==1.5.0
|
|
||||||
PasteScript==1.7.5
|
|
||||||
Pygments==1.5
|
|
||||||
Pylons==1.0
|
|
||||||
Routes==1.13
|
|
||||||
Tempita==0.5.1
|
|
||||||
WebError==0.10.3
|
|
||||||
WebHelpers==1.3
|
|
||||||
WebOb==1.1.1
|
|
||||||
WebTest==1.3.4
|
|
||||||
argparse==1.2.1
|
|
||||||
nose==1.1.2
|
|
||||||
simplejson==2.5.2
|
|
||||||
wsgiref==0.1.2
|
|
Loading…
Reference in a new issue