-beweb/beweb/config.py
+Bugs-Everywhere-Web/beweb/config.py
./build
--- /dev/null
+Metadata-Version: 1.0
+Name: Bugs-Everywhere-Web
+Version: 1.0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 3 - Alpha
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Framework :: TurboGears
--- /dev/null
+README.txt
+setup.py
+start-beweb.py
+Bugs-Everywhere-Web.egg-info/PKG-INFO
+Bugs-Everywhere-Web.egg-info/SOURCES.txt
+Bugs-Everywhere-Web.egg-info/not-zip-safe
+Bugs-Everywhere-Web.egg-info/requires.txt
+Bugs-Everywhere-Web.egg-info/sqlobject.txt
+Bugs-Everywhere-Web.egg-info/top_level.txt
+beweb/__init__.py
+beweb/config.py
+beweb/controllers.py
+beweb/formatting.py
+beweb/model.py
+beweb/prest.py
+beweb/release.py
+beweb/config/__init__.py
+beweb/templates/__init__.py
+beweb/tests/__init__.py
+beweb/tests/test_controllers.py
+beweb/tests/test_model.py
+libbe/__init__.py
+libbe/arch.py
+libbe/bugdir.py
+libbe/bzr.py
+libbe/cmdutil.py
+libbe/config.py
+libbe/diff.py
+libbe/mapfile.py
+libbe/names.py
+libbe/no_rcs.py
+libbe/plugin.py
+libbe/rcs.py
+libbe/restconvert.py
+libbe/tests.py
+libbe/utility.py
--- /dev/null
+TurboGears >= 0.9a4
\ No newline at end of file
--- /dev/null
+beweb
+libbe
--- /dev/null
+Version: 0.0
--- /dev/null
+TurboGears
+PasteScript
--- /dev/null
+db_module=beweb.model
+history_dir=$base/beweb/sqlobject-history
--- /dev/null
+Bugs-Everywhere-Web
+
+This is a TurboGears (http://www.turbogears.org) project. It can be
+started by running the start-beweb.py script.
\ No newline at end of file
--- /dev/null
+[global]
+# The settings in this file should not vary depending on the deployment
+# environment. devcfg.py and prodcfg.py are the locations for
+# the different deployment settings. Settings in this file will
+# be overridden by settings in those other files.
+
+# The commented out values below are the defaults
+
+# VIEW
+
+# which view (template engine) to use if one is not specified in the
+# template name
+# tg.defaultview = "kid"
+
+# kid.outputformat="html"
+# kid.encoding="utf-8"
+
+# The sitetemplate is used for overall styling of a site that
+# includes multiple TurboGears applications
+# tg.sitetemplate="<packagename.templates.templatename>"
+
+# Allow every exposed function to be called as json,
+# tg.allow_json = False
+
+# Set to True if you'd like all of your pages to include MochiKit
+# tg.mochikit_all = False
+
+# VISIT TRACKING
+# Each visit to your application will be assigned a unique visit ID tracked via
+# a cookie sent to the visitor's browser.
+# --------------
+
+# Enable Visit tracking
+# visit.on=False
+
+# Number of minutes a visit may be idle before it expires.
+# visit.timeout=20
+
+# The name of the cookie to transmit to the visitor's browser.
+# visit.cookie.name="tg-visit"
+
+# Domain name to specify when setting the cookie (must begin with . according to
+# RFC 2109). The default (None) should work for most cases and will default to
+# the machine to which the request was made. NOTE: localhost is NEVER a valid
+# value and will NOT WORK.
+# visit.cookie.domain=None
+
+# Specific path for the cookie
+# visit.cookie.path="/"
+
+# The name of the VisitManager plugin to use for visitor tracking.
+# visit.manager="sqlobject"
+
+
+# IDENTITY
+# General configuration of the TurboGears Identity management module
+# --------
+
+# Switch to turn on or off the Identity management module
+# identity.on=False
+
+# [REQUIRED] URL to which CherryPy will internally redirect when an access
+# control check fails. If Identity management is turned on, a value for this
+# option must be specified.
+# identity.failure_url=None
+
+# The IdentityProvider to use -- defaults to the SqlObjectIdentityProvider which
+# pulls User, Group, and Permission data out of your model database.
+# identity.provider="sqlobject"
+
+# The names of the fields on the login form containing the visitor's user ID
+# and password. In addition, the submit button is specified simply so its
+# existence may be stripped out prior to passing the form data to the target
+# controller.
+# identity.form.user_name="user_name"
+# identity.form.password="password"
+# identity.form.submit="login"
+
+# What sources should the identity provider consider when determining the
+# identity associated with a request? Comma separated list of identity sources.
+# Valid sources: form, visit, http_auth
+# identity.source="form,http_auth,visit"
+
+
+# SqlObjectIdentityProvider
+# Configuration options for the default IdentityProvider
+# -------------------------
+
+# The classes you wish to use for your Identity model. Leave these commented out
+# to use the default classes for SqlObjectIdentityProvider. Or set them to the
+# classes in your model. NOTE: These aren't TG_* because the TG prefix is
+# reserved for classes created by TurboGears.
+# identity.soprovider.model.user="beweb.model.User"
+# identity.soprovider.model.group="beweb.model.Group"
+# identity.soprovider.model.permission="beweb.model.Permission"
+
+# The password encryption algorithm used when comparing passwords against what's
+# stored in the database. Valid values are 'md5' or 'sha1'. If you do not
+# specify an encryption algorithm, passwords are expected to be clear text.
+#
+# The SqlObjectProvider *will* encrypt passwords supplied as part of your login
+# form. If you set the password through the password property, like:
+# my_user.password = 'secret'
+# the password will be encrypted in the database, provided identity is up and
+# running, or you have loaded the configuration specifying what encryption to
+# use (in situations where identity may not yet be running, like tests).
+
+# identity.soprovider.encryption_algorithm=None
+
+[/static]
+static_filter.on = True
+#static_filter.dir = "%(top_level_dir)s/static"
+static_filter.dir = "/home/abentley/be/Bugs-Everywhere-Web/beweb/static"
+
+[/favicon.ico]
+static_filter.on = True
+#static_filter.file = "%(top_level_dir)s/static/images/favicon.ico"
+static_filter.file = "/home/abentley/be/Bugs-Everywhere-Web/beweb/static/images/favicon.ico"
+
+[/]
+decodingFilter.on = True
import turbogears
-from turbogears import controllers
+from turbogears import controllers, expose, redirect, identity
import cherrypy
from libbe.bugdir import (tree_root, cmp_severity, new_bug, new_comment,
NoRootEntry)
def index(self):
raise cherrypy.HTTPRedirect(project_url())
+ @expose(template="beweb.templates.login")
+ def login(self, forward_url=None, previous_url=None, *args, **kw):
+
+ if not identity.current.anonymous and identity.was_login_attempted():
+ raise redirect(forward_url)
+
+ forward_url=None
+ previous_url= cherrypy.request.path
+
+ if identity.was_login_attempted():
+ msg=_("The credentials you supplied were not correct or "\
+ "did not grant access to this resource.")
+ elif identity.get_identity_errors():
+ msg=_("You must provide your credentials before accessing "\
+ "this resource.")
+ else:
+ msg=_("Please log in.")
+ forward_url= cherrypy.request.headers.get("Referer", "/")
+ cherrypy.response.status=403
+ return dict(message=msg, previous_url=previous_url, logging_in=True,
+ original_parameters=cherrypy.request.params,
+ forward_url=forward_url)
+
+ @expose()
+ def logout(self):
+ identity.current.logout()
+ raise redirect("/")
+
@turbogears.expose('beweb.templates.about')
def about(self, *paths, **kwargs):
return {}
def default(self, *args, **kwargs):
return self.prest.default(*args, **kwargs)
- def _cpOnError(self):
+ def _cp_on_error(self):
import traceback, StringIO
bodyFile = StringIO.StringIO()
traceback.print_exc(file = bodyFile)
from sqlobject import *
from turbogears.database import PackageHub
+# Uncomment the following line if you wish to use Identity and SO_Provider
+# from turbogears.identity.soprovider import TG_User, TG_Group, TG_Permission
hub = PackageHub("beweb")
__connection__ = hub
--- /dev/null
+# Release information about Bugs-Everywhere-Web
+
+version = "1.0"
+
+# description = "Your plan to rule the world"
+# author = "Your Name Here"
+# email = "YourEmail@YourDomain"
+# copyright = "Vintage 2006 - a good year indeed"
+
+# if it's open source, you might want to specify these
+# url = "http://yourcool.site/"
+# download_url = "http://yourcool.site/download"
+# license = "MIT"
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:py="http://purl.org/kid/ns#"
+ py:extends="'master.kid'">
+
+<head>
+ <meta content="text/html; charset=UTF-8"
+ http-equiv="content-type" py:replace="''"/>
+ <title>Login</title>
+ <style>
+ #loginBox
+ {
+ width: 30%;
+ margin: auto;
+ margin-top: 10%;
+ padding-left: 10%;
+ padding-right: 10%;
+ padding-top: 5%;
+ padding-bottom: 5%;
+ font-family: verdana;
+ font-size: 10px;
+ background-color: #eee;
+ border: 2px solid #ccc;
+ }
+
+ #loginBox h1
+ {
+ font-size: 42px;
+ font-family: "Trebuchet MS";
+ margin: 0;
+ color: #ddd;
+ }
+
+ #loginBox p
+ {
+ position: relative;
+ top: -1.5em;
+ padding-left: 4em;
+ font-size: 12px;
+ margin: 0;
+ color: #666;
+ }
+
+ #loginBox table
+ {
+ table-layout: fixed;
+ border-spacing: 0;
+ width: 100%;
+ }
+
+ #loginBox td.label
+ {
+ width: 33%;
+ text-align: right;
+ }
+
+ #loginBox td.field
+ {
+ width: 66%;
+ }
+
+ #loginBox td.field input
+ {
+ width: 100%;
+ }
+
+ #loginBox td.buttons
+ {
+ text-align: right;
+ }
+
+ </style>
+</head>
+
+<body>
+ <div id="loginBox">
+ <h1>Login</h1>
+ <p>${message}</p>
+ <form action="${previous_url}" method="POST">
+ <table>
+ <tr>
+ <td class="label">
+ <label for="user_name">User Name:</label>
+ </td>
+ <td class="field">
+ <input type="text" id="user_name" name="user_name"/>
+ </td>
+ </tr>
+ <tr>
+ <td class="label">
+ <label for="password">Password:</label>
+ </td>
+ <td class="field">
+ <input type="password" id="password" name="password"/>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="buttons">
+ <input type="submit" value="Login"/>
+ </td>
+ </tr>
+ </table>
+
+ <input py:if="forward_url" type="hidden" name="forward_url"
+ value="${forward_url}"/>
+
+ <input py:for="name,value in original_parameters.items()"
+ type="hidden" name="${name}" value="${value}"/>
+ </form>
+ </div>
+</body>
+</html>
<?python import sitetemplate ?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" py:extends="sitetemplate">
-<head py:match="item.tag=='{http://www.w3.org/1999/xhtml}head'">
+<head py:match="item.tag=='{http://www.w3.org/1999/xhtml}head'" py:attrs="item.items()">
<meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/>
<title py:if="False">Your title goes here</title>
<link rel="stylesheet" type="text/css" href="/static/css/style.css"/>
- <div py:replace="item[:]"/>
+ <meta py:replace="item[:]"/>
+ <style>
+ #pageLogin
+ {
+ font-size: 10px;
+ font-family: verdana;
+ text-align: right;
+ }
+ </style>
</head>
-<body py:match="item.tag=='{http://www.w3.org/1999/xhtml}body'">
+<body py:match="item.tag=='{http://www.w3.org/1999/xhtml}body'" py:attrs="item.items()">
<div id="header"><div style="float: left">b u g s e v r y w h e r e</div><ul class="navoption"><li><a href="/about/">About</a></li></ul> </div>
+ <div py:if="tg.config('identity.on',False) and not 'logging_in' in locals()"
+ id="pageLogin">
+ <span py:if="tg.identity.anonymous">
+ <a href="/login">Login</a>
+ </span>
+ <span py:if="not tg.identity.anonymous">
+ Welcome ${tg.identity.user.displayName}.
+ <a href="/logout">Logout</a>
+ </span>
+ </div>
+
<div py:if="tg_flash" class="flash" py:content="tg_flash"></div>
-
+
<div py:replace="item[:]"/>
+
</body>
<table py:match="item.tag=='{http://www.w3.org/1999/xhtml}insetbox'" cellspacing="0" cellpadding="0" border="0" class="insetbox">
<tr height="19"><td background="/static/images/is-tl.png" width="19"/>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
+ py:extends="'master.kid'">
+
+<head>
+ <meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/>
+ <title>Welcome to TurboGears</title>
+</head>
+
+<body>
+ <p>Congratulations, your TurboGears application is running as of <span py:replace="now">now</span>.</p>
+
+ <h2>Are you ready to Gear Up?</h2>
+
+ <p>Take the following steps to dive right in:</p>
+
+ <ol>
+ <li>Edit your project's model.py to create SQLObjects representing the data you're working with</li>
+ <li>Edit your dev.cfg file to point to the database you'll be using</li>
+ <li>Run "<code>tg-admin sql create</code>" to create the tables in the database</li>
+ <li>Edit controllers.py to add the functionality to your webapp</li>
+ <li>Change the master.kid template to have the headers and footers for your application.</li>
+ <li>Change welcome.kid (this template) or create a new one to display your data</li>
+ <li>Repeat steps 4-6 until done.</li>
+ <li><b>Profit!</b></li>
+ </ol>
+
+ <p>If you haven't already, you might check out some of the <a href="http://www.turbogears.org/docs/" >documentation</a>.</p>
+
+ <p>Thanks for using TurboGears! See you on the <a href="http://groups.google.com/group/turbogears" >mailing list</a> and the "turbogears" channel on irc.freenode.org!</p>
+
+</body>
+</html>
--- /dev/null
+from turbogears import testutil
+from beweb.controllers import Root
+import cherrypy
+
+cherrypy.root = Root()
+
+def test_method():
+ "the index method should return a string called now"
+ import types
+ result = testutil.call(cherrypy.root.index)
+ assert type(result["now"]) == types.StringType
+
+def test_indextitle():
+ "The mainpage should have the right title"
+ testutil.createRequest("/")
+ assert "<TITLE>Welcome to TurboGears</TITLE>" in cherrypy.response.body[0]
--- /dev/null
+# If your project uses a database, you can set up database tests
+# similar to what you see below. Be sure to set the db_uri to
+# an appropriate uri for your testing database. sqlite is a good
+# choice for testing, because you can use an in-memory database
+# which is very fast.
+
+from turbogears import testutil
+#from beweb.model import YourDataClass
+#from turbogears.identity.soprovider import TG_User
+
+# database.set_db_uri("sqlite:///:memory:")
+
+# class testTG_User(testutil.DBTest):
+# def get_model(self):
+# return TG_User
+#
+# def test_creation(self):
+# "Object creation should set the name"
+# obj = TG_User(userId = "creosote",
+# emailAddress = "spam@python.not",
+# displayName = "Mr Creosote",
+# password = "Wafer-thin Mint")
+# assert obj.displayName == "Mr Creosote"
+
--- /dev/null
+[global]
+# This is where all of your settings go for your development environment
+# Settings that are the same for both development and production
+# (such as template engine, encodings, etc.) all go in
+# yourpackage/config/app.cfg
+
+# DATABASE
+
+# pick the form for your database
+# sqlobject.dburi="postgres://username@hostname/databasename"
+# sqlobject.dburi="mysql://username:password@hostname:port/databasename"
+# sqlobject.dburi="sqlite:///file_name_and_path"
+
+# if you are using a database or table type without transactions
+# (MySQL default, for example), you should turn off transactions
+# by prepending notrans_ on the uri
+# sqlobject.dburi="notrans_mysql://username:password@hostname:port/databasename"
+
+# for Windows users, sqlite URIs look like:
+# sqlobject.dburi="sqlite:///drive_letter|/path/to/file"
+
+
+# SERVER
+
+# Some server parameters that you may want to tweak
+# server.socket_port=8080
+
+# Enable the debug output at the end on pages.
+# log_debug_info_filter.on = False
+
+server.environment="development"
+autoreload.package="beweb"
+
+# Set to True if you'd like to abort execution if a controller gets an
+# unexpected parameter. False by default
+tg.strict_parameters = True
+
--- /dev/null
+[global]
+# This is where all of your settings go for your production environment.
+# You'll copy this file over to your production server and provide it
+# as a command-line option to your start script.
+# Settings that are the same for both development and production
+# (such as template engine, encodings, etc.) all go in
+# yourpackage/config/app.cfg
+
+# DATABASE
+
+# pick the form for your database
+# sqlobject.dburi="postgres://username@hostname/databasename"
+# sqlobject.dburi="mysql://username:password@hostname:port/databasename"
+# sqlobject.dburi="sqlite:///file_name_and_path"
+
+# if you are using a database or table type without transactions
+# (MySQL default, for example), you should turn off transactions
+# by prepending notrans_ on the uri
+# sqlobject.dburi="notrans_mysql://username:password@hostname:port/databasename"
+
+# for Windows users, sqlite URIs look like:
+# sqlobject.dburi="sqlite:///drive_letter|/path/to/file"
+
+
+# SERVER
+
+server.environment="production"
+server.log_file="server.log"
+server.log_to_screen=False
+
+# Sets the number of threads the server uses
+# server.thread_pool = 1
+
+# if this is part of a larger site, you can set the path
+# to the TurboGears instance here
+# server.webpath=""
+
+# Set to True if you'd like to abort execution if a controller gets an
+# unexpected parameter. False by default
+# tg.strict_parameters = False
+
--- /dev/null
+from setuptools import setup, find_packages
+from turbogears.finddata import find_package_data
+
+import os
+execfile(os.path.join("beweb", "release.py"))
+
+setup(
+ name="Bugs-Everywhere-Web",
+ version=version,
+
+ # uncomment the following lines if you fill them out in release.py
+ #description=description,
+ #author=author,
+ #author_email=email,
+ #url=url,
+ #download_url=download_url,
+ #license=license,
+
+ install_requires = ["TurboGears >= 0.9a4"],
+ scripts = ["start-beweb.py"],
+ zip_safe=False,
+ packages=find_packages(),
+ package_data = find_package_data(where='beweb',
+ package='beweb'),
+ keywords = [
+ # Use keywords if you'll be adding your package to the
+ # Python Cheeseshop
+
+ # if this has widgets, uncomment the next line
+ # 'turbogears.widgets',
+
+ # if this has a tg-admin command, uncomment the next line
+ # 'turbogears.command',
+
+ # if this has identity providers, uncomment the next line
+ # 'turbogears.identity.provider',
+
+ # If this is a template plugin, uncomment the next line
+ # 'python.templating.engines',
+
+ # If this is a full application, uncomment the next line
+ # 'turbogears.app',
+ ],
+ classifiers = [
+ 'Development Status :: 3 - Alpha',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ 'Framework :: TurboGears',
+ # if this is an application that you'll distribute through
+ # the Cheeseshop, uncomment the next line
+ # 'Framework :: TurboGears :: Applications',
+
+ # if this is a package that includes widgets that you'll distribute
+ # through the Cheeseshop, uncomment the next line
+ # 'Framework :: TurboGears :: Widgets',
+ ],
+ test_suite = 'nose.collector',
+ )
+
import pkg_resources
pkg_resources.require("TurboGears")
+import turbogears
import cherrypy
+cherrypy.lowercase_api = True
+
from os.path import *
import sys
# if it's not on the command line, then
# look for setup.py in this directory. If it's not there, this script is
# probably installed
-cherrypy.config.update(file="common.cfg")
if len(sys.argv) > 1:
- cherrypy.config.update(file=sys.argv[1])
+ turbogears.update_config(configfile=sys.argv[1],
+ modulename="beweb.config.app")
elif exists(join(dirname(__file__), "setup.py")):
- cherrypy.config.update(file="dev.cfg")
+ turbogears.update_config(configfile="dev.cfg",
+ modulename="beweb.config.app")
else:
- cherrypy.config.update(file="prod.cfg")
+ turbogears.update_config(configfile="prod.cfg",
+ modulename="beweb.config.app")
from beweb.controllers import Root
+++ /dev/null
-Metadata-Version: 1.0
-Name: Bugs-Everywhere-Web
-Version: 1.0
-Summary: UNKNOWN
-Home-page: UNKNOWN
-Author: UNKNOWN
-Author-email: UNKNOWN
-License: UNKNOWN
-Description: UNKNOWN
-Platform: UNKNOWN
+++ /dev/null
-# This is where all of your settings go for your development environment
-[/static]
-staticFilter.on = True
-staticFilter.dir = "static"
-[/favicon.ico]
-staticFilter.on = True
-staticFilter.file = "static/images/favicon.ico"
-[/]
-decodingFilter.on = True
+++ /dev/null
-# This is where all of your settings go for your development environment
-
-[global]
-
-# DATABASE
-
-# pick the form for your database
-# sqlobject.dburi="postgres://username@hostname/databasename"
-# sqlobject.dburi="mysql://username:password@hostname:port/databasename"
-# sqlobject.dburi="sqlite:///file_name_and_path"
-
-# for Windows users, sqlite URIs look like:
-# sqlobject.dburi="sqlite:///drive_letter|/path/to/file"
-
-
-# VIEW
-
-# kid.outputformat="html"
-
-# The sitetemplate is used for overall styling of a site that
-# includes multiple TurboGears applications
-# tg.sitetemplate="<packagename.templates.templatename>"
-
-
-# SERVER
-
-# Some server parameters that you may want to tweak
-# server.socketPort=8080
-
-# Disable the debug output at the end on pages.
-# logDebugInfoFilter.on = False
-
-server.environment="development"
-autoreload.package="beweb"
+++ /dev/null
-# This is where all of your settings go for your development environment
-
-[global]
-
-# DATABASE
-
-# pick the form for your database
-# sqlobject.dburi="postgres://username@hostname/databasename"
-# sqlobject.dburi="mysql://username:password@hostname:port/databasename"
-# sqlobject.dburi="sqlite:///file_name_and_path"
-
-# for Windows users, sqlite URIs look like:
-# sqlobject.dburi="sqlite:///drive_letter|/path/to/file"
-
-
-# VIEW
-
-# kid.outputformat="html"
-
-# The sitetemplate is used for overall styling of a site that
-# includes multiple TurboGears applications
-# tg.sitetemplate="<packagename.templates.templatename>"
-
-
-# Server configuration
-server.environment="production"
-server.logFile="server.log"
-server.logToScreen=False
-
-# if this is part of a larger site, you can set the path
-# to the TurboGears instance here
-# server.webpath=""
-
+++ /dev/null
-from setuptools import setup, find_packages
-from turbogears.finddata import find_package_data
-
-setup(
- name="Bugs Everywhere Web",
- version="1.0",
- #description="",
- #author="",
- #author_email="",
- #url="",
- install_requires = ["TurboGears >= 0.8a4"],
- scripts = ["beweb-start.py"],
- zip_safe=False,
- packages=find_packages(),
- package_data = find_package_data(where='beweb',
- package='beweb'),
- )
-