You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2014/01/10 22:23:10 UTC

[14/36] PEP8 cleanup

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeActivity/forgeactivity/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/tests/functional/test_root.py b/ForgeActivity/forgeactivity/tests/functional/test_root.py
index eda71be..cafdfe4 100644
--- a/ForgeActivity/forgeactivity/tests/functional/test_root.py
+++ b/ForgeActivity/forgeactivity/tests/functional/test_root.py
@@ -29,6 +29,7 @@ from allura.tests import decorators as td
 
 
 class TestActivityController(TestController):
+
     def setUp(self, *args, **kwargs):
         super(TestActivityController, self).setUp(*args, **kwargs)
         self._enabled = config.get('activitystream.enabled', 'false')
@@ -58,37 +59,37 @@ class TestActivityController(TestController):
         from activitystream.storage.base import StoredActivity
         from bson import ObjectId
         director.get_timeline.return_value = [StoredActivity(**{
-            "_id" : ObjectId("529fa331033c5e6406d8b338"),
-            "obj" : {
-                    "activity_extras" : {
-                            "allura_id" : "Post:971389ad979eaafa658beb807bf4629d30f5f642.tickets@test.p.sourceforge.net",
-                            "summary" : "Just wanted to leave a comment on this..."
-                    },
-                    "activity_url" : "/p/test/tickets/_discuss/thread/08e74efd/ed7c/",
-                    "activity_name" : "a comment"
+            "_id": ObjectId("529fa331033c5e6406d8b338"),
+            "obj": {
+                "activity_extras": {
+                    "allura_id": "Post:971389ad979eaafa658beb807bf4629d30f5f642.tickets@test.p.sourceforge.net",
+                    "summary": "Just wanted to leave a comment on this..."
+                },
+                "activity_url": "/p/test/tickets/_discuss/thread/08e74efd/ed7c/",
+                "activity_name": "a comment"
             },
-            "target" : {
-                    "activity_extras" : {
-                            "allura_id" : "Ticket:529f57a6033c5e5985db2efa",
-                            "summary" : "Make activitystream timeline look better"
-                    },
-                    "activity_url" : "/p/test/tickets/34/",
-                    "activity_name" : "ticket #34"
+            "target": {
+                "activity_extras": {
+                    "allura_id": "Ticket:529f57a6033c5e5985db2efa",
+                    "summary": "Make activitystream timeline look better"
+                },
+                "activity_url": "/p/test/tickets/34/",
+                "activity_name": "ticket #34"
             },
-            "actor" : {
-                    "activity_extras" : {
-                            "icon_url" : "/u/test-admin/user_icon",
-                            "allura_id" : "User:521f96cb033c5e2587adbdff"
-                    },
-                    "activity_url" : "/u/test-admin/",
-                    "activity_name" : "Administrator 1",
-                    "node_id" : "User:521f96cb033c5e2587adbdff"
+            "actor": {
+                "activity_extras": {
+                    "icon_url": "/u/test-admin/user_icon",
+                    "allura_id": "User:521f96cb033c5e2587adbdff"
+                },
+                "activity_url": "/u/test-admin/",
+                "activity_name": "Administrator 1",
+                "node_id": "User:521f96cb033c5e2587adbdff"
             },
-            "verb" : "posted",
-            "published" : dateutil.parser.parse("2013-12-04T21:48:19.817"),
-            "score" : 1386193699,
-            "node_id" : "Project:527a6584033c5e62126f5a60",
-            "owner_id" : "Project:527a6584033c5e62126f5a60"
+            "verb": "posted",
+            "published": dateutil.parser.parse("2013-12-04T21:48:19.817"),
+            "score": 1386193699,
+            "node_id": "Project:527a6584033c5e62126f5a60",
+            "owner_id": "Project:527a6584033c5e62126f5a60"
         })]
         r = self.app.get('/p/test/activity/')
         timeline = r.html.find('ul', 'timeline')
@@ -156,7 +157,7 @@ class TestActivityController(TestController):
     @td.with_user_project('test-user-1')
     def test_background_aggregation(self):
         self.app.get('/u/test-admin/activity/follow?follow=True',
-                extra_environ=dict(username='test-user-1'))
+                     extra_environ=dict(username='test-user-1'))
         # new ticket, creates activity
         d = {'ticket_form.summary': 'New Ticket'}
         self.app.post('/bugs/save_ticket', params=d)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeActivity/forgeactivity/widgets/follow.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/widgets/follow.py b/ForgeActivity/forgeactivity/widgets/follow.py
index ce05ef7..f5a15d7 100644
--- a/ForgeActivity/forgeactivity/widgets/follow.py
+++ b/ForgeActivity/forgeactivity/widgets/follow.py
@@ -22,8 +22,8 @@ import ew.jinja2_ew as ew
 
 
 class FollowToggle(ew.SimpleForm):
-    template='jinja:forgeactivity:templates/widgets/follow.html'
-    defaults=dict(
+    template = 'jinja:forgeactivity:templates/widgets/follow.html'
+    defaults = dict(
         ew.SimpleForm.defaults,
         thing='project',
         action='follow',

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeActivity/setup.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/setup.py b/ForgeActivity/setup.py
index bbc5372..45c546e 100644
--- a/ForgeActivity/setup.py
+++ b/ForgeActivity/setup.py
@@ -22,7 +22,8 @@ setup(name='ForgeActivity',
       description="",
       long_description="""\
 """,
-      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[],
       keywords='',
       author='',
       author_email='',

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/command/base.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/command/base.py b/ForgeBlog/forgeblog/command/base.py
index c7bf329..8e67cc9 100644
--- a/ForgeBlog/forgeblog/command/base.py
+++ b/ForgeBlog/forgeblog/command/base.py
@@ -17,5 +17,6 @@
 
 from allura.command.base import Command
 
+
 class BlogCommand(Command):
     group_name = 'ForgeBlog'

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/command/rssfeeds.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/command/rssfeeds.py b/ForgeBlog/forgeblog/command/rssfeeds.py
index eeac4b2..ce02487 100644
--- a/ForgeBlog/forgeblog/command/rssfeeds.py
+++ b/ForgeBlog/forgeblog/command/rssfeeds.py
@@ -36,8 +36,8 @@ from allura.lib import exceptions
 from allura.lib.helpers import exceptionless
 from allura.lib.helpers import plain2markdown
 
-## Everything in this file depends on html2text,
-## so import attempt is placed in global scope.
+# Everything in this file depends on html2text,
+# so import attempt is placed in global scope.
 try:
     import html2text
 except ImportError:
@@ -46,6 +46,7 @@ except ImportError:
 
 html2text.BODY_WIDTH = 0
 
+
 class RssFeedsCommand(base.BlogCommand):
     summary = 'Rss feed client'
     parser = base.BlogCommand.standard_parser(verbose=True)
@@ -60,12 +61,15 @@ class RssFeedsCommand(base.BlogCommand):
         # activity, User.url() will be called. This method defers to an
         # AuthenticationProvider, which depends on a request being setup in
         # the current thread. So, we set one up here.
-        import pylons, webob
+        import pylons
+        import webob
         pylons.request._push_object(webob.Request.blank('/'))
 
         self.basic_setup()
-        self.process_feed = exceptionless(None, log=allura_base.log)(self.process_feed)
-        self.process_entry = exceptionless(None, log=allura_base.log)(self.process_entry)
+        self.process_feed = exceptionless(
+            None, log=allura_base.log)(self.process_feed)
+        self.process_entry = exceptionless(
+            None, log=allura_base.log)(self.process_entry)
 
         user = M.User.query.get(username=self.options.username)
         c.user = user
@@ -78,10 +82,11 @@ class RssFeedsCommand(base.BlogCommand):
     def prepare_feeds(self):
         feed_dict = {}
         if self.options.appid != '':
-            gl_app = BM.Globals.query.get(app_config_id=ObjectId(self.options.appid))
+            gl_app = BM.Globals.query.get(
+                app_config_id=ObjectId(self.options.appid))
             if not gl_app:
-                raise exceptions.NoSuchGlobalsError("The globals %s " \
-                     "could not be found in the database" % self.options.appid)
+                raise exceptions.NoSuchGlobalsError("The globals %s "
+                                                    "could not be found in the database" % self.options.appid)
             if len(gl_app.external_feeds) > 0:
                 feed_dict[gl_app.app_config_id] = gl_app.external_feeds
         else:
@@ -111,7 +116,8 @@ class RssFeedsCommand(base.BlogCommand):
     def process_entry(self, e, appid):
         title = e.title
         allura_base.log.info(" ...entry '%s'", title)
-        parsed_content = filter(None, e.get('content') or [e.get('summary_detail')])
+        parsed_content = filter(
+            None, e.get('content') or [e.get('summary_detail')])
         if parsed_content:
             content = u''
             for ct in parsed_content:
@@ -124,18 +130,19 @@ class RssFeedsCommand(base.BlogCommand):
                     content += markdown_content
         else:
             content = plain2markdown(getattr(e, 'summary',
-                                        getattr(e, 'subtitle',
-                                            getattr(e, 'title'))))
+                                             getattr(e, 'subtitle',
+                                                     getattr(e, 'title'))))
 
         content += u' [link](%s)' % e.link
         updated = datetime.utcfromtimestamp(calendar.timegm(e.updated_parsed))
 
         base_slug = BM.BlogPost.make_base_slug(title, updated)
-        b_count = BM.BlogPost.query.find(dict(slug=base_slug, app_config_id=appid)).count()
+        b_count = BM.BlogPost.query.find(
+            dict(slug=base_slug, app_config_id=appid)).count()
         if b_count == 0:
             post = BM.BlogPost(title=title, text=content, timestamp=updated,
-                            app_config_id=appid,
-                            state='published')
-            post.neighborhood_id=c.project.neighborhood_id
+                               app_config_id=appid,
+                               state='published')
+            post.neighborhood_id = c.project.neighborhood_id
             post.make_slug()
             post.commit()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/main.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/main.py b/ForgeBlog/forgeblog/main.py
index bd0f821..1bb4ced 100644
--- a/ForgeBlog/forgeblog/main.py
+++ b/ForgeBlog/forgeblog/main.py
@@ -57,8 +57,9 @@ from forgeblog import widgets
 
 log = logging.getLogger(__name__)
 
+
 class W:
-    thread=w.Thread(
+    thread = w.Thread(
         page=None, limit=None, page_size=None, count=None,
         style='linear')
     pager = widgets.BlogPager()
@@ -73,30 +74,31 @@ class W:
     search_results = SearchResults()
     help_modal = SearchHelp()
 
+
 class ForgeBlogApp(Application):
     __version__ = version.__version__
-    tool_label='Blog'
-    tool_description="""
+    tool_label = 'Blog'
+    tool_description = """
         Share exciting news and progress updates with your
         community.
     """
-    default_mount_label='Blog'
-    default_mount_point='blog'
+    default_mount_label = 'Blog'
+    default_mount_point = 'blog'
     permissions = ['configure', 'read', 'write',
-                    'unmoderated_post', 'post', 'moderate', 'admin']
+                   'unmoderated_post', 'post', 'moderate', 'admin']
     permissions_desc = {
         'read': 'View blog entries.',
         'write': 'Create new blog entry.',
         'admin': 'Set permissions. Enable/disable commenting.',
     }
-    ordinal=14
+    ordinal = 14
     exportable = True
     config_options = Application.config_options
     default_external_feeds = []
-    icons={
-        24:'images/blog_24.png',
-        32:'images/blog_32.png',
-        48:'images/blog_48.png'
+    icons = {
+        24: 'images/blog_24.png',
+        32: 'images/blog_32.png',
+        48: 'images/blog_48.png'
     }
 
     def __init__(self, project, config):
@@ -114,12 +116,14 @@ class ForgeBlogApp(Application):
             else:
                 external_feeds = self.default_external_feeds
             return external_feeds
+
         def fset(self, new_external_feeds):
             globals = BM.Globals.query.get(app_config_id=self.config._id)
             if globals is not None:
                 globals.external_feeds = new_external_feeds
             elif len(new_external_feeds) > 0:
-                globals = BM.Globals(app_config_id=self.config._id, external_feeds=new_external_feeds)
+                globals = BM.Globals(
+                    app_config_id=self.config._id, external_feeds=new_external_feeds)
             if globals is not None:
                 session(globals).flush()
 
@@ -132,7 +136,7 @@ class ForgeBlogApp(Application):
         menu_id = self.config.options.mount_label
         with h.push_config(c, app=self):
             return [
-                SitemapEntry(menu_id, '.')[self.sidebar_menu()] ]
+                SitemapEntry(menu_id, '.')[self.sidebar_menu()]]
 
     @property
     def show_discussion(self):
@@ -147,21 +151,23 @@ class ForgeBlogApp(Application):
         links = [
             SitemapEntry('Home', base),
             SitemapEntry('Search', base + 'search'),
-            ]
+        ]
         if has_access(self, 'write')():
-            links += [ SitemapEntry('New Post', base + 'new') ]
+            links += [SitemapEntry('New Post', base + 'new')]
         return links
 
     def admin_menu(self):
         import sys
-        admin_url = c.project.url() + 'admin/' + self.config.options.mount_point + '/'
+        admin_url = c.project.url() + 'admin/' + \
+            self.config.options.mount_point + '/'
         # temporarily disabled until some bugs are fixed
         links = super(ForgeBlogApp, self).admin_menu(force_options=True)
         # We don't want external feeds in menu unless they're enabled
         if asbool(config.get('forgeblog.exfeed', 'false')):
-            links.insert(0, SitemapEntry('External feeds', admin_url + 'exfeed', className='admin_modal'))
+            links.insert(0, SitemapEntry('External feeds',
+                         admin_url + 'exfeed', className='admin_modal'))
         return links
-        #return super(ForgeBlogApp, self).admin_menu(force_options=True)
+        # return super(ForgeBlogApp, self).admin_menu(force_options=True)
 
     def install(self, project):
         'Set up any default permissions and roles here'
@@ -180,7 +186,7 @@ class ForgeBlogApp(Application):
             M.ACE.allow(role_developer, 'moderate'),
             M.ACE.allow(role_admin, 'configure'),
             M.ACE.allow(role_admin, 'admin'),
-            ]
+        ]
 
     def uninstall(self, project):
         "Remove all the tool's artifacts from the database"
@@ -198,6 +204,7 @@ class ForgeBlogApp(Application):
             json.dump(post, f, cls=jsonify.GenericJSON, indent=2)
         f.write(']}')
 
+
 class RootController(BaseController, FeedController):
 
     def __init__(self):
@@ -264,7 +271,6 @@ class RootController(BaseController, FeedController):
         post = BM.BlogPost.new(**kw)
         redirect(h.really_unicode(post.url()).encode('utf-8'))
 
-
     @with_trailing_slash
     @expose('jinja:allura:templates/markdown_syntax_dialog.html')
     def markdown_syntax_dialog(self, **kw):
@@ -281,6 +287,7 @@ class RootController(BaseController, FeedController):
             raise exc.HTTPNotFound()
         return PostController(post), rest
 
+
 class PostController(BaseController, FeedController):
 
     def __init__(self, post):
@@ -341,7 +348,7 @@ class PostController(BaseController, FeedController):
             self.post.delete()
             flash('Post deleted', 'info')
             redirect(h.really_unicode(c.app.url).encode('utf-8'))
-        for k,v in kw.iteritems():
+        for k, v in kw.iteritems():
             setattr(self.post, k, v)
         self.post.commit()
         redirect('.')
@@ -379,13 +386,16 @@ class PostController(BaseController, FeedController):
             self.post.url())
 
     def _get_version(self, version):
-        if not version: return self.post
+        if not version:
+            return self.post
         try:
             return self.post.get_version(version)
         except ValueError:
             raise exc.HTTPNotFound()
 
+
 class BlogAdminController(DefaultAdminController):
+
     def __init__(self, app):
         self.app = app
 
@@ -399,9 +409,11 @@ class BlogAdminController(DefaultAdminController):
     @expose()
     @require_post()
     def set_options(self, show_discussion=False):
-        self.app.config.options['show_discussion'] = show_discussion and True or False
+        self.app.config.options[
+            'show_discussion'] = show_discussion and True or False
         flash('Blog options updated')
-        redirect(h.really_unicode(c.project.url()+'admin/tools').encode('utf-8'))
+        redirect(h.really_unicode(c.project.url() + 'admin/tools')
+                 .encode('utf-8'))
 
     @without_trailing_slash
     @expose('jinja:forgeblog:templates/blog/admin_exfeed.html')
@@ -442,12 +454,14 @@ class BlogAdminController(DefaultAdminController):
         self.app.external_feeds_list = exfeed_list
         flash('External feeds updated')
         if len(invalid_list) > 0:
-            flash('Invalid link(s): %s' % ','.join(link for link in invalid_list), 'error')
+            flash('Invalid link(s): %s' %
+                  ','.join(link for link in invalid_list), 'error')
 
-        redirect(c.project.url()+'admin/tools')
+        redirect(c.project.url() + 'admin/tools')
 
 
 class RootRestController(BaseController):
+
     def __init__(self):
         self._discuss = AppDiscussionRestController()
 
@@ -472,7 +486,8 @@ class RootRestController(BaseController):
             post_titles = []
             for post in posts:
                 if has_access(post, 'read')():
-                    post_titles.append({'title': post.title, 'url': h.absurl('/rest' + post.url())})
+                    post_titles.append(
+                        {'title': post.title, 'url': h.absurl('/rest' + post.url())})
             return dict(posts=post_titles, count=result['count'], limit=result['limit'], page=result['page'])
 
     @expose()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/model/blog.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/model/blog.py b/ForgeBlog/forgeblog/model/blog.py
index 7e34aea..f520265 100644
--- a/ForgeBlog/forgeblog/model/blog.py
+++ b/ForgeBlog/forgeblog/model/blog.py
@@ -36,23 +36,26 @@ from allura.lib import utils
 config = utils.ConfigProxy(
     common_suffix='forgemail.domain')
 
+
 class Globals(MappedClass):
 
     class __mongometa__:
         name = 'blog-globals'
         session = M.project_orm_session
-        indexes = [ 'app_config_id' ]
+        indexes = ['app_config_id']
 
     type_s = 'BlogGlobals'
     _id = FieldProperty(schema.ObjectId)
-    app_config_id = ForeignIdProperty('AppConfig', if_missing=lambda:c.app.config._id)
-    external_feeds=FieldProperty([str])
+    app_config_id = ForeignIdProperty(
+        'AppConfig', if_missing=lambda: c.app.config._id)
+    external_feeds = FieldProperty([str])
 
 
 class BlogPostSnapshot(M.Snapshot):
+
     class __mongometa__:
-        name='blog_post_snapshot'
-    type_s='Blog Post Snapshot'
+        name = 'blog_post_snapshot'
+    type_s = 'Blog Post Snapshot'
 
     def original(self):
         return BlogPost.query.get(_id=self.artifact_id)
@@ -92,14 +95,18 @@ class BlogPostSnapshot(M.Snapshot):
             return None
         return orig.email_address
 
+
 class BlogPost(M.VersionedArtifact, ActivityObject):
+
     class __mongometa__:
-        name='blog_post'
+        name = 'blog_post'
         history_class = BlogPostSnapshot
-        unique_indexes = [ ('app_config_id', 'slug') ]
+        unique_indexes = [('app_config_id', 'slug')]
         indexes = [
-            ('app_config_id', 'state', 'timestamp'),  # for [[project_blog_posts]] macro
-            ('neighborhood_id', 'state', 'timestamp'),  # for [[neighborhood_blog_posts]] macro
+            # for [[project_blog_posts]] macro
+            ('app_config_id', 'state', 'timestamp'),
+            # for [[neighborhood_blog_posts]] macro
+            ('neighborhood_id', 'state', 'timestamp'),
         ]
 
     type_s = 'Blog Post'
@@ -109,7 +116,8 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
     text_cache = FieldProperty(MarkdownCache)
     timestamp = FieldProperty(datetime, if_missing=datetime.utcnow)
     slug = FieldProperty(str)
-    state = FieldProperty(schema.OneOf('draft', 'published'), if_missing='draft')
+    state = FieldProperty(
+        schema.OneOf('draft', 'published'), if_missing='draft')
     neighborhood_id = ForeignIdProperty('Neighborhood', if_missing=None)
 
     @property
@@ -128,12 +136,14 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
 
     def _get_date(self):
         return self.timestamp.date()
+
     def _set_date(self, value):
         self.timestamp = datetime.combine(value, self.time)
     date = property(_get_date, _set_date)
 
     def _get_time(self):
         return self.timestamp.time()
+
     def _set_time(self, value):
         self.timestamp = datetime.combine(self.date, value)
     time = property(_get_time, _set_time)
@@ -162,19 +172,20 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
         # first and *then* truncating doesn't work either, because the
         # ellipsis tag ends up orphaned from the main text.
         ellipsis = '... [read more](%s)' % self.url()
-        paragraphs = self.text.replace('\r','').split('\n\n')
+        paragraphs = self.text.replace('\r', '').split('\n\n')
         total_length = 0
         for i, p in enumerate(paragraphs):
             total_length += len(p)
             if total_length >= 400:
                 break
-        text = '\n\n'.join(paragraphs[:i+1])
+        text = '\n\n'.join(paragraphs[:i + 1])
         return g.markdown.convert(text + (ellipsis if i + 1 < len(paragraphs)
-                                                   else ''))
+                                          else ''))
 
     @property
     def email_address(self):
-        domain = '.'.join(reversed(self.app.url[1:-1].split('/'))).replace('_', '-')
+        domain = '.'.join(
+            reversed(self.app.url[1:-1].split('/'))).replace('_', '-')
         return '%s@%s%s' % (self.title.replace('/', '.'), domain, config.common_suffix)
 
     @staticmethod
@@ -184,8 +195,8 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
             for ch in title.replace(' ', '-')
             if ch.isalnum() or ch == '-')
         return '%s/%s' % (
-                timestamp.strftime('%Y/%m'),
-                slugsafe)
+            timestamp.strftime('%Y/%m'),
+            slugsafe)
 
     def make_slug(self):
         base = BlogPost.make_base_slug(self.title, self.timestamp)
@@ -195,7 +206,7 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
                 session(self).insert_now(self, state(self))
                 return self.slug
             except DuplicateKeyError:
-                self.slug = base + '-%.3d' % randint(0,999)
+                self.slug = base + '-%.3d' % randint(0, 999)
 
     def url(self):
         return self.app.url + self.slug + '/'
@@ -215,26 +226,27 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
 
     def get_version(self, version):
         HC = self.__mongometa__.history_class
-        return HC.query.find({'artifact_id':self._id, 'version':int(version)}).one()
+        return HC.query.find({'artifact_id': self._id, 'version': int(version)}).one()
 
     def commit(self):
         activity = functools.partial(g.director.create_activity, c.user,
-                target=c.project)
+                                     target=c.project)
         self.subscribe()
         super(BlogPost, self).commit()
         if self.version > 1:
-            v1 = self.get_version(self.version-1)
+            v1 = self.get_version(self.version - 1)
             v2 = self
-            la = [ line + '\n'  for line in v1.text.splitlines() ]
-            lb = [ line + '\n'  for line in v2.text.splitlines() ]
+            la = [line + '\n' for line in v1.text.splitlines()]
+            lb = [line + '\n' for line in v2.text.splitlines()]
             diff = ''.join(difflib.unified_diff(
-                    la, lb,
-                    'v%d' % v1.version,
-                    'v%d' % v2.version))
+                la, lb,
+                'v%d' % v1.version,
+                'v%d' % v2.version))
             description = diff
             if v1.state != 'published' and v2.state == 'published':
                 activity('created', self)
-                M.Feed.post(self, self.title, self.text, author=self.author(), pubdate=self.get_version(1).timestamp)
+                M.Feed.post(self, self.title, self.text, author=self.author(),
+                            pubdate=self.get_version(1).timestamp)
                 description = self.text
                 subject = '%s created post %s' % (
                     c.user.username, self.title)
@@ -252,7 +264,8 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
                 c.user.username, self.title)
             if self.state == 'published':
                 activity('created', self)
-                M.Feed.post(self, self.title, self.text, author=self.author(), pubdate=self.timestamp)
+                M.Feed.post(self, self.title, self.text,
+                            author=self.author(), pubdate=self.timestamp)
         if self.state == 'published':
             M.Notification.post(
                 artifact=self, topic='metadata', text=description, subject=subject)
@@ -282,10 +295,11 @@ class BlogPost(M.VersionedArtifact, ActivityObject):
 
 
 class Attachment(M.BaseAttachment):
-    ArtifactClass=BlogPost
+    ArtifactClass = BlogPost
+
     class __mongometa__:
-        polymorphic_identity='BlogAttachment'
-    attachment_type=FieldProperty(str, if_missing='BlogAttachment')
+        polymorphic_identity = 'BlogAttachment'
+    attachment_type = FieldProperty(str, if_missing='BlogAttachment')
 
 
 Mapper.compile_all()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/functional/test_rest.py b/ForgeBlog/forgeblog/tests/functional/test_rest.py
index b1b3bc7..05e06c8 100644
--- a/ForgeBlog/forgeblog/tests/functional/test_rest.py
+++ b/ForgeBlog/forgeblog/tests/functional/test_rest.py
@@ -44,7 +44,9 @@ class TestBlogApi(TestRestApiBase):
             'labels': 'label1, label2'
         }
         r = self.api_post('/rest/p/test/blog/', **data)
-        assert_equal(r.location, 'http://localhost/rest/p/test/blog/%s/%s/test/' % (date.today().strftime("%Y"), date.today().strftime("%m")))
+        assert_equal(
+            r.location, 'http://localhost/rest/p/test/blog/%s/%s/test/' %
+            (date.today().strftime("%Y"), date.today().strftime("%m")))
         assert_equal(r.status_int, 201)
         url = '/rest' + BM.BlogPost.query.find().first().url()
         r = self.api_get('/rest/p/test/blog/')
@@ -58,8 +60,6 @@ class TestBlogApi(TestRestApiBase):
         assert_equal(r.json['state'], data['state'])
         assert_equal(r.json['labels'], data['labels'].split(','))
 
-
-
     def test_update_post(self):
         data = {
             'title': 'test',
@@ -100,8 +100,10 @@ class TestBlogApi(TestRestApiBase):
         assert_equal(r.status_int, 404)
 
     def test_read_permissons(self):
-        self.api_post('/rest/p/test/blog/', title='test', text='test text', state='published')
-        self.app.get('/rest/p/test/blog/', extra_environ={'username': '*anonymous'}, status=200)
+        self.api_post('/rest/p/test/blog/', title='test',
+                      text='test text', state='published')
+        self.app.get('/rest/p/test/blog/',
+                     extra_environ={'username': '*anonymous'}, status=200)
         p = M.Project.query.get(shortname='test')
         acl = p.app_instance('blog').config.acl
         anon = M.ProjectRole.by_name('*anonymous')._id
@@ -113,7 +115,8 @@ class TestBlogApi(TestRestApiBase):
 
     def test_new_post_permissons(self):
         self.app.post('/rest/p/test/blog/',
-                      params=dict(title='test', text='test text', state='published'),
+                      params=dict(title='test', text='test text',
+                                  state='published'),
                       extra_environ={'username': '*anonymous'},
                       status=401)
         p = M.Project.query.get(shortname='test')
@@ -122,15 +125,18 @@ class TestBlogApi(TestRestApiBase):
         anon_write = M.ACE.allow(anon, 'write')
         acl.append(anon_write)
         self.app.post('/rest/p/test/blog/',
-                      params=dict(title='test', text='test text', state='published'),
+                      params=dict(title='test', text='test text',
+                                  state='published'),
                       extra_environ={'username': '*anonymous'},
                       status=201)
 
     def test_update_post_permissons(self):
-        self.api_post('/rest/p/test/blog/', title='test', text='test text', state='published')
+        self.api_post('/rest/p/test/blog/', title='test',
+                      text='test text', state='published')
         url = '/rest' + BM.BlogPost.query.find().first().url()
         self.app.post(url.encode('utf-8'),
-                      params=dict(title='test2', text='test text2', state='published'),
+                      params=dict(title='test2', text='test text2',
+                                  state='published'),
                       extra_environ={'username': '*anonymous'},
                       status=401)
         p = M.Project.query.get(shortname='test')
@@ -139,7 +145,8 @@ class TestBlogApi(TestRestApiBase):
         anon_write = M.ACE.allow(anon, 'write')
         acl.append(anon_write)
         self.app.post(url.encode('utf-8'),
-                      params=dict(title='test2', text='test text2', state='published'),
+                      params=dict(title='test2', text='test text2',
+                                  state='published'),
                       extra_environ={'username': '*anonymous'},
                       status=200)
         r = self.api_get(url)
@@ -148,12 +155,15 @@ class TestBlogApi(TestRestApiBase):
         assert_equal(r.json['state'], 'published')
 
     def test_permission_draft_post(self):
-        self.api_post('/rest/p/test/blog/', title='test', text='test text', state='draft')
-        r = self.app.get('/rest/p/test/blog/', extra_environ={'username': '*anonymous'})
+        self.api_post('/rest/p/test/blog/', title='test',
+                      text='test text', state='draft')
+        r = self.app.get('/rest/p/test/blog/',
+                         extra_environ={'username': '*anonymous'})
         assert_equal(r.json['posts'], [])
         url = '/rest' + BM.BlogPost.query.find().first().url()
         self.app.post(url.encode('utf-8'),
-                      params=dict(title='test2', text='test text2', state='published'),
+                      params=dict(title='test2', text='test text2',
+                                  state='published'),
                       extra_environ={'username': '*anonymous'},
                       status=401)
         p = M.Project.query.get(shortname='test')
@@ -161,22 +171,29 @@ class TestBlogApi(TestRestApiBase):
         anon = M.ProjectRole.by_name('*anonymous')._id
         anon_write = M.ACE.allow(anon, 'write')
         acl.append(anon_write)
-        r = self.app.get('/rest/p/test/blog/', extra_environ={'username': '*anonymous'})
+        r = self.app.get('/rest/p/test/blog/',
+                         extra_environ={'username': '*anonymous'})
         assert_equal(r.json['posts'][0]['title'], 'test')
 
     def test_draft_post(self):
-        self.api_post('/rest/p/test/blog/', title='test', text='test text', state='draft')
-        r = self.app.get('/rest/p/test/blog/', extra_environ={'username': '*anonymous'})
+        self.api_post('/rest/p/test/blog/', title='test',
+                      text='test text', state='draft')
+        r = self.app.get('/rest/p/test/blog/',
+                         extra_environ={'username': '*anonymous'})
         assert_equal(r.json['posts'], [])
         url = '/rest' + BM.BlogPost.query.find().first().url()
         self.api_post(url, state='published')
-        r = self.app.get('/rest/p/test/blog/', extra_environ={'username': '*anonymous'})
+        r = self.app.get('/rest/p/test/blog/',
+                         extra_environ={'username': '*anonymous'})
         assert_equal(r.json['posts'][0]['title'], 'test')
 
     def test_pagination(self):
-        self.api_post('/rest/p/test/blog/', title='test1', text='test text1', state='published')
-        self.api_post('/rest/p/test/blog/', title='test2', text='test text2', state='published')
-        self.api_post('/rest/p/test/blog/', title='test3', text='test text3', state='published')
+        self.api_post('/rest/p/test/blog/', title='test1',
+                      text='test text1', state='published')
+        self.api_post('/rest/p/test/blog/', title='test2',
+                      text='test text2', state='published')
+        self.api_post('/rest/p/test/blog/', title='test3',
+                      text='test text3', state='published')
         r = self.api_get('/rest/p/test/blog/', limit='1', page='0')
         assert_equal(r.json['posts'][0]['title'], 'test3')
         assert_equal(len(r.json['posts']), 1)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/functional/test_root.py b/ForgeBlog/forgeblog/tests/functional/test_root.py
index 96a8113..d3eb932 100644
--- a/ForgeBlog/forgeblog/tests/functional/test_root.py
+++ b/ForgeBlog/forgeblog/tests/functional/test_root.py
@@ -32,14 +32,15 @@ from allura import model as M
 # CommentController methods exposed:
 #     reply, delete
 
+
 class Test(TestController):
 
     def _post(self, slug='', **kw):
         d = {
-                'title':'My Post',
-                'text':'Nothing to see here',
-                'labels':'',
-                'state':'published'}
+            'title': 'My Post',
+            'text': 'Nothing to see here',
+            'labels': '',
+            'state': 'published'}
         d.update(kw)
         r = self.app.post('/blog%s/save' % slug, params=d)
         return r
@@ -210,7 +211,7 @@ class Test(TestController):
         self._post(title='two', text='[blog:%s/one]' % d)
         M.MonQTask.run_ready()
         ThreadLocalORMSession.flush_all()
-        r= self.app.get('/blog/%s/one/' % d)
+        r = self.app.get('/blog/%s/one/' % d)
         assert 'Related' in r
         assert 'Blog Post: %s/two' % d in r
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/tests/test_app.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/test_app.py b/ForgeBlog/forgeblog/tests/test_app.py
index 895bb06..bab8f22 100644
--- a/ForgeBlog/forgeblog/tests/test_app.py
+++ b/ForgeBlog/forgeblog/tests/test_app.py
@@ -62,10 +62,13 @@ class TestBulkExport(object):
         blog.bulk_export(f)
         f.seek(0)
         blog = json.loads(f.read())
-        blog['posts'] = sorted(blog['posts'], key=lambda x: x['title'], reverse=True)
+        blog['posts'] = sorted(
+            blog['posts'], key=lambda x: x['title'], reverse=True)
         assert_equal(blog['posts'][0]['title'], 'Test2 title')
         assert_equal(blog['posts'][0]['text'], 'test2 post')
         assert_equal(blog['posts'][1]['title'], 'Test title')
         assert_equal(blog['posts'][1]['text'], 'test post')
-        assert_equal(blog['posts'][1]['labels'], ['the firstlabel', 'the second label'])
-        assert_equal(blog['posts'][1]['discussion_thread']['posts'][0]['text'], 'test comment')
+        assert_equal(blog['posts'][1]['labels'],
+                     ['the firstlabel', 'the second label'])
+        assert_equal(blog['posts'][1]['discussion_thread']
+                     ['posts'][0]['text'], 'test comment')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/tests/test_commands.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/test_commands.py b/ForgeBlog/forgeblog/tests/test_commands.py
index 569470e..a086519 100644
--- a/ForgeBlog/forgeblog/tests/test_commands.py
+++ b/ForgeBlog/forgeblog/tests/test_commands.py
@@ -30,15 +30,18 @@ from allura import model as M
 from forgeblog import model as BM
 
 
-test_config = pkg_resources.resource_filename('allura', '../test.ini') + '#main'
+test_config = pkg_resources.resource_filename(
+    'allura', '../test.ini') + '#main'
 
 
 def setUp():
     setup_basic_test()
     setup_global_objects()
 
+
 def _mock_feed(*entries):
     class attrdict(dict):
+
         def __getattr__(self, name):
             return self[name]
 
@@ -53,11 +56,12 @@ def _mock_feed(*entries):
             subtitle='',
             summary='',
             link='http://example.com/',
-            updated=datetime.utcnow()+timedelta(days=_mock_feed.i - 100))
+            updated=datetime.utcnow() + timedelta(days=_mock_feed.i - 100))
         entry.update(e)
         entry['updated_parsed'] = entry['updated'].timetuple()
         if 'content' in entry:
-            entry['content'] = [attrdict(type=entry['content_type'], value=entry['content'])]
+            entry['content'] = [
+                attrdict(type=entry['content_type'], value=entry['content'])]
         if 'summary_detail' in entry:
             entry['summary_detail'] = attrdict(entry['summary_detail'])
         feed.entries.append(entry)
@@ -65,6 +69,7 @@ def _mock_feed(*entries):
     return feed
 _mock_feed.i = 0
 
+
 @skipif(module_not_available('html2text'))
 @mock.patch.object(feedparser, 'parse')
 def test_pull_rss_feeds(parsefeed):
@@ -82,11 +87,11 @@ def test_pull_rss_feeds(parsefeed):
     )
 
     rendered_html_content = "\n".join([
-       r"1\. foo",
+        r"1\. foo",
         "",
-       r"\#foo bar [baz](baz) foo bar ",
+        r"\#foo bar [baz](baz) foo bar ",
         "",
-       r"\#foo bar [ baz ](baz)",
+        r"\#foo bar [ baz ](baz)",
         " [link](http://example.com/)",
     ])
 
@@ -97,13 +102,14 @@ def test_pull_rss_feeds(parsefeed):
         dict(summary_detail=dict(type='text/html', value=html_content)),
     )
 
-    base_app =  M.AppConfig.query.find().all()[0]
-    tmp_app = M.AppConfig(tool_name=u'Blog', discussion_id=base_app.discussion_id,
-                          project_id=base_app.project_id,
-                          options={u'ordinal': 0, u'show_right_bar': True,
-                                    u'project_name': base_app.project.name,
-                                    u'mount_point': u'blog',
-                                    u'mount_label': u'Blog'})
+    base_app = M.AppConfig.query.find().all()[0]
+    tmp_app = M.AppConfig(
+        tool_name=u'Blog', discussion_id=base_app.discussion_id,
+        project_id=base_app.project_id,
+        options={u'ordinal': 0, u'show_right_bar': True,
+                 u'project_name': base_app.project.name,
+                 u'mount_point': u'blog',
+                 u'mount_label': u'Blog'})
     new_external_feeds = ['http://example.com/news/feed/']
     BM.Globals(app_config_id=tmp_app._id, external_feeds=new_external_feeds)
     ThreadLocalORMSession.flush_all()
@@ -113,7 +119,8 @@ def test_pull_rss_feeds(parsefeed):
     cmd.run([test_config, '-a', tmp_app._id])
     cmd.command()
     parsefeed.assert_called_with('http://example.com/news/feed/')
-    posts = BM.BlogPost.query.find({'app_config_id': tmp_app._id}).sort('timestamp', 1)
+    posts = BM.BlogPost.query.find(
+        {'app_config_id': tmp_app._id}).sort('timestamp', 1)
     assert_equal(posts.count(), 4)
     posts = posts.all()
     assert_equal(posts[0].title, 'Test')
@@ -125,6 +132,7 @@ def test_pull_rss_feeds(parsefeed):
     assert_equal(posts[3].title, 'Default Title 4')
     assert_equal(posts[3].text, rendered_html_content)
 
+
 @skipif(module_not_available('html2text'))
 def test_plaintext_preprocessor():
     from html2text import html2text
@@ -140,10 +148,11 @@ def test_plaintext_preprocessor():
     )
     html = g.markdown.convert(text)
     assert_equal(html,
-        '<div class="markdown_content"><p>1. foo '
-        '#foo bar <a class="" href="../baz">baz</a> foo bar '
-        '#foo bar <a class="" href="../baz"> baz </a></p></div>'
-    )
+                 '<div class="markdown_content"><p>1. foo '
+                 '#foo bar <a class="" href="../baz">baz</a> foo bar '
+                 '#foo bar <a class="" href="../baz"> baz </a></p></div>'
+                 )
+
 
 @skipif(module_not_available('html2text'))
 def test_plaintext_preprocessor_wrapped():
@@ -162,7 +171,7 @@ def test_plaintext_preprocessor_wrapped():
     )
     html = g.markdown.convert(text)
     assert_equal(html,
-        '<div class="markdown_content"><p>1. foo</p>\n'
-        '<p>#foo bar <a class="" href="../baz">baz</a> foo bar </p>\n'
-        '<p>#foo bar <a class="" href="../baz"> baz </a></p></div>'
-    )
+                 '<div class="markdown_content"><p>1. foo</p>\n'
+                 '<p>#foo bar <a class="" href="../baz">baz</a> foo bar </p>\n'
+                 '<p>#foo bar <a class="" href="../baz"> baz </a></p></div>'
+                 )

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/tests/test_roles.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/test_roles.py b/ForgeBlog/forgeblog/tests/test_roles.py
index a352305..e270bec 100644
--- a/ForgeBlog/forgeblog/tests/test_roles.py
+++ b/ForgeBlog/forgeblog/tests/test_roles.py
@@ -22,6 +22,7 @@ from allura import model as M
 from allura.lib import security
 from allura.lib import helpers as h
 
+
 def setUp():
     setup_basic_test()
     setup_global_objects()
@@ -29,10 +30,12 @@ def setUp():
     c.project.install_app('blog', 'blog')
     g.set_app('blog')
 
+
 def test_role_assignments():
     admin = M.User.by_username('test-admin')
     user = M.User.by_username('test-user')
     anon = M.User.anonymous()
+
     def check_access(perm):
         pred = security.has_access(c.app, perm)
         return pred(user=admin), pred(user=user), pred(user=anon)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/tests/unit/__init__.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/unit/__init__.py b/ForgeBlog/forgeblog/tests/unit/__init__.py
index 86e891f..dbef2b5 100644
--- a/ForgeBlog/forgeblog/tests/unit/__init__.py
+++ b/ForgeBlog/forgeblog/tests/unit/__init__.py
@@ -28,16 +28,18 @@ from alluratest.controller import setup_basic_test
 def setUp():
     setup_basic_test()
 
+
 class BlogTestWithModel(object):
+
     def setUp(self):
         bootstrap.wipe_database()
         project_reg = plugin.ProjectRegistrationProvider.get()
         c.user = bootstrap.create_user('Test User')
         neighborhood = M.Neighborhood(name='Projects', url_prefix='/p/',
-            features=dict(private_projects = False,
-                          max_projects = None,
-                          css = 'none',
-                          google_analytics = False))
+                                      features=dict(private_projects=False,
+                                                    max_projects=None,
+                                                    css='none',
+                                                    google_analytics=False))
         project_reg.register_neighborhood_project(neighborhood, [c.user])
         c.project = neighborhood.register_project('test', c.user)
         c.project.install_app('Blog', 'blog')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/tests/unit/test_blog_post.py b/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
index f2274d9..fadfcf0 100644
--- a/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
+++ b/ForgeBlog/forgeblog/tests/unit/test_blog_post.py
@@ -23,13 +23,16 @@ from forgeblog import model as M
 from forgeblog.tests.unit import BlogTestWithModel
 from allura.model import Feed
 
+
 def wrapped(s):
     return '<div class="markdown_content"><p>%s</p></div>' % s
 
 
 class TestBlogPost(BlogTestWithModel):
+
     def test_new(self):
-        post = M.BlogPost.new(title='test', text='test message', state='published')
+        post = M.BlogPost.new(
+            title='test', text='test message', state='published')
         assert_equal(post.title, 'test')
         assert_equal(post.text, 'test message')
         assert_equal(post.state, 'published')
@@ -38,6 +41,7 @@ class TestBlogPost(BlogTestWithModel):
 
 
 class TestFeed(BlogTestWithModel):
+
     def testd(self):
         post = M.BlogPost()
         post.title = 'test'
@@ -57,6 +61,7 @@ class TestFeed(BlogTestWithModel):
 
 
 class TestHtmlPreview(BlogTestWithModel):
+
     def _make_post(self, text):
         post = M.BlogPost()
         post.text = text

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/forgeblog/widgets.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/forgeblog/widgets.py b/ForgeBlog/forgeblog/widgets.py
index ea763ad..9d54903 100644
--- a/ForgeBlog/forgeblog/widgets.py
+++ b/ForgeBlog/forgeblog/widgets.py
@@ -24,42 +24,50 @@ from allura.lib.widgets import form_fields as ffw
 from allura.lib.widgets import forms
 from allura import model as M
 
+
 class BlogPager(ffw.PageList):
-    template='jinja:forgeblog:templates/blog_widgets/page_list.html'
+    template = 'jinja:forgeblog:templates/blog_widgets/page_list.html'
+
 
 class NewPostForm(forms.ForgeForm):
-    template='jinja:forgeblog:templates/blog_widgets/post_form.html'
+    template = 'jinja:forgeblog:templates/blog_widgets/post_form.html'
+
     class fields(ew_core.NameList):
         title = ew.TextField(validator=fev.UnicodeString(not_empty=True,
-                             messages={'empty':"You must provide a Title"}),
+                             messages={'empty': "You must provide a Title"}),
                              attrs=dict(placeholder='Enter your title here',
                                         title='Enter your title here',
                                         style='width: 425px'))
         text = ffw.MarkdownEdit(show_label=False,
-                                attrs=dict(placeholder='Enter your content here',
-                                           title='Enter your content here'))
+                                attrs=dict(
+                                    placeholder='Enter your content here',
+                                    title='Enter your content here'))
         state = ew.SingleSelectField(
             options=[
                 ew.Option(py_value='draft', label='Draft'),
-                ew.Option(py_value='published', label='Published') ])
+                ew.Option(py_value='published', label='Published')])
         labels = ffw.LabelEdit(placeholder='Add labels here',
                                title='Add labels here')
 
     def resources(self):
-        for r in super(NewPostForm, self).resources(): yield r
+        for r in super(NewPostForm, self).resources():
+            yield r
         yield ew.JSScript('''
             $(function() {
                 $('input[name="title"]').focus();
             });
         ''')
 
+
 class EditPostForm(NewPostForm):
+
     class buttons(ew_core.NameList):
         delete = ew.SubmitButton(label='Delete')
 
+
 class ViewPostForm(ew_core.Widget):
-    template='jinja:forgeblog:templates/blog_widgets/view_post.html'
-    defaults=dict(
+    template = 'jinja:forgeblog:templates/blog_widgets/view_post.html'
+    defaults = dict(
         ew_core.Widget.defaults,
         value=None,
         subscribed=None,
@@ -71,8 +79,9 @@ class ViewPostForm(ew_core.Widget):
             M.Mailbox.subscribed(artifact=kw.get('value'))
         return kw
 
+
 class PreviewPostForm(ew_core.Widget):
-    template='jinja:forgeblog:templates/blog_widgets/preview_post.html'
-    defaults=dict(
+    template = 'jinja:forgeblog:templates/blog_widgets/preview_post.html'
+    defaults = dict(
         ew_core.Widget.defaults,
         value=None)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeBlog/setup.py
----------------------------------------------------------------------
diff --git a/ForgeBlog/setup.py b/ForgeBlog/setup.py
index 10f3fae..40befd6 100644
--- a/ForgeBlog/setup.py
+++ b/ForgeBlog/setup.py
@@ -16,7 +16,8 @@
 #       under the License.
 
 from setuptools import setup, find_packages
-import sys, os
+import sys
+import os
 
 from forgeblog.version import __version__
 
@@ -25,7 +26,8 @@ setup(name='ForgeBlog',
       description="",
       long_description="""\
 """,
-      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[],
       keywords='',
       author='',
       author_email='',

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeChat/forgechat/command.py
----------------------------------------------------------------------
diff --git a/ForgeChat/forgechat/command.py b/ForgeChat/forgechat/command.py
index fdba6e2..e667843 100644
--- a/ForgeChat/forgechat/command.py
+++ b/ForgeChat/forgechat/command.py
@@ -38,9 +38,10 @@ from allura import model as M
 
 from forgechat import model as CM
 
+
 class IRCBotCommand(allura.command.Command):
-    min_args=1
-    max_args=1
+    min_args = 1
+    max_args = 1
     usage = '<ini file>'
     summary = 'Connect to all configured IRC servers and relay messages'
     parser = command.Command.standard_parser(verbose=True)
@@ -58,11 +59,13 @@ class IRCBotCommand(allura.command.Command):
                     asint(tg.config.get('forgechat.port', '6667')))
                 asyncore.loop()
             except Exception:
-                base.log.exception('Error in ircbot asyncore.loop(), restart in 5s')
+                base.log.exception(
+                    'Error in ircbot asyncore.loop(), restart in 5s')
                 time.sleep(5)
 
+
 class IRCBot(asynchat.async_chat):
-    TIME_BETWEEN_CONFIGS=timedelta(minutes=1)
+    TIME_BETWEEN_CONFIGS = timedelta(minutes=1)
 
     def __init__(self, host, port, nick='sfbot'):
         self.logger = logging.getLogger(__name__)
@@ -91,7 +94,7 @@ class IRCBot(asynchat.async_chat):
     def found_terminator(self):
         request = ''.join(self.data)
         self.logger.debug('RECV %s', request)
-        self.data=[]
+        self.data = []
         if request.startswith(':'):
             sender, cmd, rest = request[1:].split(' ', 2)
             sender = sender.split('!', 1)
@@ -114,7 +117,7 @@ class IRCBot(asynchat.async_chat):
 
     def check_configure(self):
         if (datetime.utcnow() - self.last_configured
-            > self.TIME_BETWEEN_CONFIGS):
+                > self.TIME_BETWEEN_CONFIGS):
             self.configure()
 
     def say(self, s):
@@ -131,7 +134,8 @@ class IRCBot(asynchat.async_chat):
         ThreadLocalORMSession.flush_all()
 
     def handle_command(self, sender, cmd, rest):
-        if cmd == 'NOTICE': pass
+        if cmd == 'NOTICE':
+            pass
         elif cmd == '433':
             self.set_nick()
             self.channels = {}
@@ -140,10 +144,13 @@ class IRCBot(asynchat.async_chat):
             self.say('PONG ' + rest)
         elif cmd in ('NOTICE', 'PRIVMSG'):
             rcpt, msg = rest.split(' ', 1)
-            if not self.set_context(rcpt): return
-            if msg.startswith(':'): msg = msg[1:]
+            if not self.set_context(rcpt):
+                return
+            if msg.startswith(':'):
+                msg = msg[1:]
             self.log_channel(sender, cmd, rcpt, msg)
-            if cmd == 'NOTICE': return
+            if cmd == 'NOTICE':
+                return
             for lnk in search.find_shortlinks(msg):
                 self.handle_shortlink(lnk, sender, rcpt)
         ThreadLocalORMSession.flush_all()
@@ -152,9 +159,11 @@ class IRCBot(asynchat.async_chat):
         ThreadLocalORMSession.close_all()
 
     def set_context(self, rcpt):
-        if rcpt == self.nick: return False
+        if rcpt == self.nick:
+            return False
         chan = self.channels.get(rcpt, None)
-        if not chan: return False
+        if not chan:
+            return False
         h.set_context(chan.project_id,
                       app_config_id=chan.app_config_id)
         return True
@@ -164,8 +173,9 @@ class IRCBot(asynchat.async_chat):
         if security.has_access(art, 'read', user=M.User.anonymous())():
             index = art.index()
             text = index['snippet_s'] or h.get_first(index, 'title')
-            url = urljoin(tg.config.get('base_url', 'http://sourceforge.net'), index['url_s'])
-            self.notice(rcpt, '[%s] - [%s](%s)' % (lnk.link, text,url))
+            url = urljoin(
+                tg.config.get('base_url', 'http://sourceforge.net'), index['url_s'])
+            self.notice(rcpt, '[%s] - [%s](%s)' % (lnk.link, text, url))
 
     def log_channel(self, sender, cmd, rcpt, rest):
         if cmd not in ('NOTICE', 'PRIVMSG'):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeChat/forgechat/main.py
----------------------------------------------------------------------
diff --git a/ForgeChat/forgechat/main.py b/ForgeChat/forgechat/main.py
index 1e7fb7b..c579ea5 100644
--- a/ForgeChat/forgechat/main.py
+++ b/ForgeChat/forgechat/main.py
@@ -43,25 +43,26 @@ from forgechat import version
 
 log = logging.getLogger(__name__)
 
+
 class ForgeChatApp(Application):
     __version__ = version.__version__
-    tool_label='Chat'
-    status='alpha'
-    default_mount_label='Chat'
-    default_mount_point='chat'
-    ordinal=13
-    permissions = ['configure', 'read' ]
+    tool_label = 'Chat'
+    status = 'alpha'
+    default_mount_label = 'Chat'
+    default_mount_point = 'chat'
+    ordinal = 13
+    permissions = ['configure', 'read']
     permissions_desc = {
         'configure': 'Set monitored IRC channel. Requires admin permission.',
         'read': 'View chat logs.',
     }
     config_options = Application.config_options + [
         ConfigOption('channel', str, ''),
-        ]
-    icons={
-        24:'images/chat_24.png',
-        32:'images/chat_32.png',
-        48:'images/chat_48.png'
+    ]
+    icons = {
+        24: 'images/chat_24.png',
+        32: 'images/chat_32.png',
+        48: 'images/chat_48.png'
     }
 
     def __init__(self, project, config):
@@ -79,14 +80,14 @@ class ForgeChatApp(Application):
         menu_id = self.config.options.mount_label
         with h.push_config(c, app=self):
             return [
-                SitemapEntry(menu_id, '.')[self.sidebar_menu()] ]
+                SitemapEntry(menu_id, '.')[self.sidebar_menu()]]
 
     @h.exceptionless([], log)
     def sidebar_menu(self):
         return [
             SitemapEntry('Home', '.'),
             SitemapEntry('Search', 'search'),
-            ]
+        ]
 
     def admin_menu(self):
         return super(ForgeChatApp, self).admin_menu()
@@ -99,7 +100,7 @@ class ForgeChatApp(Application):
         self.config.acl = [
             M.ACE.allow(role_anon, 'read'),
             M.ACE.allow(role_admin, 'configure'),
-            ]
+        ]
         CM.ChatChannel(
             project_id=self.config.project_id,
             app_config_id=self.config._id,
@@ -108,15 +109,16 @@ class ForgeChatApp(Application):
     def uninstall(self, project):
         "Remove all the tool's artifacts from the database"
         CM.ChatChannel.query.remove(dict(
-                project_id=self.config.project_id,
-                app_config_id=self.config._id))
+            project_id=self.config.project_id,
+            app_config_id=self.config._id))
         super(ForgeChatApp, self).uninstall(project)
 
+
 class AdminController(DefaultAdminController):
 
     @with_trailing_slash
     def index(self, **kw):
-        redirect(c.project.url()+'admin/tools')
+        redirect(c.project.url() + 'admin/tools')
 
     @expose()
     @require_post()
@@ -130,6 +132,7 @@ class AdminController(DefaultAdminController):
         flash('Chat options updated')
         super(AdminController, self).configure(channel=channel)
 
+
 class RootController(BaseController):
 
     @expose()
@@ -159,8 +162,9 @@ class RootController(BaseController):
 
     @expose()
     def _lookup(self, y, m, d, *rest):
-        y,m,d = int(y), int(m), int(d)
-        return DayController(date(y,m,d)), rest
+        y, m, d = int(y), int(m), int(d)
+        return DayController(date(y, m, d)), rest
+
 
 class DayController(RootController):
 
@@ -171,8 +175,8 @@ class DayController(RootController):
     def index(self, **kw):
         q = dict(
             timestamp={
-                '$gte':datetime.combine(self.day, time.min),
-                '$lte':datetime.combine(self.day, time.max)})
+                '$gte': datetime.combine(self.day, time.min),
+                '$lte': datetime.combine(self.day, time.max)})
         messages = CM.ChatMessage.query.find(q).sort('timestamp').all()
         prev = c.app.url + (self.day - timedelta(days=1)).strftime('%Y/%m/%d/')
         next = c.app.url + (self.day + timedelta(days=1)).strftime('%Y/%m/%d/')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeChat/forgechat/model/chat.py
----------------------------------------------------------------------
diff --git a/ForgeChat/forgechat/model/chat.py b/ForgeChat/forgechat/model/chat.py
index d2baeda..3907101 100644
--- a/ForgeChat/forgechat/model/chat.py
+++ b/ForgeChat/forgechat/model/chat.py
@@ -31,18 +31,20 @@ class ChatChannel(MappedClass):
         name = 'globals'
         session = M.main_orm_session
         indexes = ['project_id']
-        unique_indexes = [ 'channel' ]
+        unique_indexes = ['channel']
 
     _id = FieldProperty(S.ObjectId)
     project_id = FieldProperty(S.ObjectId)
     app_config_id = FieldProperty(S.ObjectId)
     channel = FieldProperty(str)
-    
+
+
 class ChatMessage(M.Artifact):
+
     class __mongometa__:
-        name='chat_message'
-        indexes = [ 'timestamp' ]
-    type_s='Chat Message'
+        name = 'chat_message'
+        indexes = ['timestamp']
+    type_s = 'Chat Message'
 
     timestamp = FieldProperty(datetime, if_missing=datetime.utcnow)
     sender = FieldProperty(str, if_missing='')
@@ -50,7 +52,6 @@ class ChatMessage(M.Artifact):
     text = FieldProperty(str, if_missing='')
     text_cache = FieldProperty(MarkdownCache)
 
-
     def index_id(self):
         id = 'Chat-%s:%s:%s.%s' % (
             self.channel,
@@ -73,7 +74,7 @@ class ChatMessage(M.Artifact):
                 + str(self._id))
 
     def shorthand_id(self):
-        return str(self._id) # pragma no cover
+        return str(self._id)  # pragma no cover
 
     @property
     def sender_short(self):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeChat/setup.py
----------------------------------------------------------------------
diff --git a/ForgeChat/setup.py b/ForgeChat/setup.py
index 4f01472..6cb2c59 100644
--- a/ForgeChat/setup.py
+++ b/ForgeChat/setup.py
@@ -16,7 +16,8 @@
 #       under the License.
 
 from setuptools import setup, find_packages
-import sys, os
+import sys
+import os
 
 from forgechat.version import __version__
 
@@ -25,7 +26,8 @@ setup(name='ForgeChat',
       description="",
       long_description="""\
 """,
-      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[],
       keywords='',
       author='',
       author_email='',

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeDiscussion/forgediscussion/controllers/forum.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/forum.py b/ForgeDiscussion/forgediscussion/controllers/forum.py
index 50ed7fb..fd2b816 100644
--- a/ForgeDiscussion/forgediscussion/controllers/forum.py
+++ b/ForgeDiscussion/forgediscussion/controllers/forum.py
@@ -39,27 +39,31 @@ from forgediscussion import tasks
 
 log = logging.getLogger(__name__)
 
+
 class pass_validator(object):
+
     def validate(self, v, s):
         return v
-pass_validator=pass_validator()
+pass_validator = pass_validator()
+
 
 class ModelConfig(object):
-    Discussion=DM.Forum
-    Thread=DM.ForumThread
-    Post=DM.ForumPost
-    Attachment=M.DiscussionAttachment
+    Discussion = DM.Forum
+    Thread = DM.ForumThread
+    Post = DM.ForumPost
+    Attachment = M.DiscussionAttachment
+
 
 class WidgetConfig(object):
     # Forms
     subscription_form = DW.SubscriptionForm()
-    subscribe_form=SubscribeForm()
+    subscribe_form = SubscribeForm()
     edit_post = DW.EditPost(show_subject=True)
     moderate_post = FW.ModeratePost()
     moderate_thread = FW.ModerateThread()
     flag_post = DW.FlagPost()
     post_filter = DW.PostFilter()
-    moderate_posts=DW.ModeratePosts()
+    moderate_posts = DW.ModeratePosts()
     # Other widgets
     discussion = FW.Forum()
     thread = FW.Thread()
@@ -68,9 +72,10 @@ class WidgetConfig(object):
     announcements_table = FW.AnnouncementsTable()
     discussion_header = FW.ForumHeader()
 
+
 class ForumController(DiscussionController):
-    M=ModelConfig
-    W=WidgetConfig
+    M = ModelConfig
+    W = WidgetConfig
 
     def _check_security(self):
         require_access(self.discussion, 'read')
@@ -98,13 +103,14 @@ class ForumController(DiscussionController):
                    limit=validators.Int(if_empty=25, if_invalid=25)))
     def index(self, threads=None, limit=25, page=0, count=0, **kw):
         if self.discussion.deleted:
-            redirect(self.discussion.url()+'deleted')
+            redirect(self.discussion.url() + 'deleted')
         limit, page, start = g.handle_paging(limit, page)
-        c.subscribed=M.Mailbox.subscribed(artifact=self.discussion)
+        c.subscribed = M.Mailbox.subscribed(artifact=self.discussion)
         threads = DM.ForumThread.query.find(dict(discussion_id=self.discussion._id, num_replies={'$gt': 0})) \
                                       .sort([('flags', pymongo.DESCENDING), ('last_post_date', pymongo.DESCENDING)])
-        response =  super(ForumController, self).index(threads=threads.skip(start).limit(int(limit)).all(),
-                                                       limit=limit, page=page, count=threads.count(), **kw)
+        response = super(
+            ForumController, self).index(threads=threads.skip(start).limit(int(limit)).all(),
+                                         limit=limit, page=page, count=threads.count(), **kw)
         c.discussion_header = self.W.discussion_header
         c.whole_forum_subscription_form = self.W.subscribe_form
         return response
@@ -134,7 +140,7 @@ class ForumThreadController(ThreadController):
                    limit=validators.Int(if_empty=25, if_invalid=25)))
     def index(self, limit=25, page=0, count=0, **kw):
         if self.thread.discussion.deleted and not has_access(c.app, 'configure')():
-            redirect(self.thread.discussion.url()+'deleted')
+            redirect(self.thread.discussion.url() + 'deleted')
         return super(ForumThreadController, self).index(limit=limit, page=page, count=count, show_moderate=True, **kw)
 
     @h.vardec
@@ -144,7 +150,7 @@ class ForumThreadController(ThreadController):
     def moderate(self, **kw):
         require_access(self.thread, 'moderate')
         if self.thread.discussion.deleted and not has_access(c.app, 'configure')():
-            redirect(self.thread.discussion.url()+'deleted')
+            redirect(self.thread.discussion.url() + 'deleted')
         args = self.W.moderate_thread.validate(kw, None)
         tasks.calc_forum_stats.post(self.thread.discussion.shortname)
         if args.pop('delete', None):
@@ -158,6 +164,7 @@ class ForumThreadController(ThreadController):
         self.thread.flags = args.pop('flags', [])
         redirect(self.thread.url())
 
+
 class ForumPostController(PostController):
 
     @h.vardec
@@ -166,7 +173,7 @@ class ForumPostController(PostController):
     @utils.AntiSpam.validate('Spambot protection engaged')
     def index(self, **kw):
         if self.thread.discussion.deleted and not has_access(c.app, 'configure')():
-            redirect(self.thread.discussion.url()+'deleted')
+            redirect(self.thread.discussion.url() + 'deleted')
         return super(ForumPostController, self).index(**kw)
 
     @expose()
@@ -175,7 +182,7 @@ class ForumPostController(PostController):
     def moderate(self, **kw):
         require_access(self.post.thread, 'moderate')
         if self.thread.discussion.deleted and not has_access(c.app, 'configure')():
-            redirect(self.thread.discussion.url()+'deleted')
+            redirect(self.thread.discussion.url() + 'deleted')
         args = self.W.moderate_post.validate(kw, None)
         tasks.calc_thread_stats.post(self.post.thread._id)
         tasks.calc_forum_stats(self.post.discussion.shortname)
@@ -185,5 +192,6 @@ class ForumPostController(PostController):
             redirect(request.referer)
         super(ForumPostController, self).moderate(**kw)
 
+
 class ForumModerationController(ModerationController):
     PostModel = DM.ForumPost

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeDiscussion/forgediscussion/controllers/root.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index d0526dc..82f4187 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -51,13 +51,14 @@ from forgediscussion.widgets.admin import AddForumShort
 
 log = logging.getLogger(__name__)
 
+
 class RootController(BaseController, DispatchIndex, FeedController):
 
     class W(object):
-        forum_subscription_form=FW.ForumSubscriptionForm()
-        new_topic=DW.NewTopicPost(submit_text='Post')
-        announcements_table=FW.AnnouncementsTable()
-        add_forum=AddForumShort()
+        forum_subscription_form = FW.ForumSubscriptionForm()
+        new_topic = DW.NewTopicPost(submit_text='Post')
+        announcements_table = FW.AnnouncementsTable()
+        add_forum = AddForumShort()
         search_results = SearchResults()
         search_help = SearchHelp(comments=False, history=False)
 
@@ -71,13 +72,13 @@ class RootController(BaseController, DispatchIndex, FeedController):
         c.new_topic = self.W.new_topic
         c.add_forum = self.W.add_forum
         c.announcements_table = self.W.announcements_table
-        announcements=model.ForumThread.query.find(dict(
-                app_config_id=c.app.config._id,
-                flags='Announcement',
-                )).all()
+        announcements = model.ForumThread.query.find(dict(
+            app_config_id=c.app.config._id,
+            flags='Announcement',
+        )).all()
         forums = model.Forum.query.find(dict(
-                        app_config_id=c.app.config._id,
-                        parent_id=None, deleted=False)).all()
+            app_config_id=c.app.config._id,
+            parent_id=None, deleted=False)).all()
         forums = [f for f in forums if h.has_access(f, 'read')()]
         return dict(forums=forums,
                     announcements=announcements,
@@ -105,7 +106,8 @@ class RootController(BaseController, DispatchIndex, FeedController):
                                              deleted=False))
         c.new_topic = self.W.new_topic
         my_forums = []
-        forum_name = h.really_unicode(unquote(forum_name)) if forum_name else None
+        forum_name = h.really_unicode(unquote(
+            forum_name)) if forum_name else None
         current_forum = None
         for f in forums:
             if forum_name == f.shortname:
@@ -128,7 +130,7 @@ class RootController(BaseController, DispatchIndex, FeedController):
             redirect(request.referrer)
         require_access(discussion, 'post')
         thd = discussion.get_discussion_thread(dict(
-                headers=dict(Subject=subject)))[0]
+            headers=dict(Subject=subject)))[0]
         post = thd.post(subject, text)
         flash('Message posted')
         redirect(thd.url())
@@ -190,9 +192,10 @@ class RootController(BaseController, DispatchIndex, FeedController):
         thread = kw.pop('thread', [])
         objs = []
         for data in forum:
-            objs.append(dict(obj=model.Forum.query.get(shortname=data['shortname'],
-                                                       app_config_id=c.app.config._id),
-                             subscribed=bool(data.get('subscribed'))))
+            objs.append(
+                dict(obj=model.Forum.query.get(shortname=data['shortname'],
+                                               app_config_id=c.app.config._id),
+                     subscribed=bool(data.get('subscribed'))))
         for data in thread:
             objs.append(dict(obj=model.Thread.query.get(_id=data['id']),
                              subscribed=bool(data.get('subscribed'))))
@@ -212,7 +215,7 @@ class RootController(BaseController, DispatchIndex, FeedController):
         """
         return FeedArgs(
             dict(project_id=project._id, app_config_id=app.config._id),
-             'Recent posts to %s' % app.config.options.mount_label,
+            'Recent posts to %s' % app.config.options.mount_label,
             app.url)
 
     @without_trailing_slash
@@ -278,7 +281,8 @@ class RootController(BaseController, DispatchIndex, FeedController):
 
             next_expected_date = begin
             for d in mongo_data:
-                this_date = datetime(d['_id']['year'], d['_id']['month'], d['_id']['day'])
+                this_date = datetime(
+                    d['_id']['year'], d['_id']['month'], d['_id']['day'])
                 for day in h.daterange(next_expected_date, this_date):
                     yield item(day, 0)
                 yield item(this_date, d['posts'])
@@ -306,9 +310,9 @@ class RootRestController(BaseController):
     def index(self, limit=100, page=0, **kw):
         limit, page, start = g.handle_paging(int(limit), int(page))
         forums = model.Forum.query.find(dict(
-                        app_config_id=c.app.config._id,
-                        parent_id=None, deleted=False)
-                ).sort([('shortname', pymongo.ASCENDING)]).skip(start).limit(limit)
+            app_config_id=c.app.config._id,
+            parent_id=None, deleted=False)
+        ).sort([('shortname', pymongo.ASCENDING)]).skip(start).limit(limit)
         count = forums.count()
         json = dict(forums=[dict(_id=f._id,
                                  name=f.name,
@@ -326,10 +330,12 @@ class RootRestController(BaseController):
     @expose('json:')
     def validate_import(self, doc=None, username_mapping=None, **kw):
         require_access(c.project, 'admin')
-        if username_mapping is None: username_mapping = {}
+        if username_mapping is None:
+            username_mapping = {}
         try:
             doc = json.loads(doc)
-            warnings, doc = import_support.validate_import(doc, username_mapping)
+            warnings, doc = import_support.validate_import(
+                doc, username_mapping)
             return dict(warnings=warnings, errors=[])
         except Exception, e:
             raise
@@ -338,12 +344,14 @@ class RootRestController(BaseController):
 
     @expose('json:')
     def perform_import(
-        self, doc=None, username_mapping=None, default_username=None, create_users=False,
-        **kw):
+            self, doc=None, username_mapping=None, default_username=None, create_users=False,
+            **kw):
         require_access(c.project, 'admin')
-        if username_mapping is None: username_mapping = '{}'
+        if username_mapping is None:
+            username_mapping = '{}'
         if c.api_token.get_capability('import') != [c.project.neighborhood.name, c.project.shortname]:
-            log.error('Import capability is not enabled for %s', c.project.shortname)
+            log.error('Import capability is not enabled for %s',
+                      c.project.shortname)
             raise exc.HTTPForbidden(detail='Import is not allowed')
         try:
             doc = json.loads(doc)
@@ -372,7 +380,8 @@ class ForumRestController(BaseController):
     @expose('json:')
     def index(self, limit=100, page=0, **kw):
         limit, page, start = g.handle_paging(int(limit), int(page))
-        topics = model.Forum.thread_class().query.find(dict(discussion_id=self.forum._id))
+        topics = model.Forum.thread_class().query.find(
+            dict(discussion_id=self.forum._id))
         topics = topics.sort([('flags', pymongo.DESCENDING),
                               ('last_post_date', pymongo.DESCENDING)])
         topics = topics.skip(start).limit(limit)
@@ -404,6 +413,7 @@ class ForumRestController(BaseController):
                 return ForumTopicRestController(self.forum, topic), remainder
         raise exc.HTTPNotFound()
 
+
 class ForumTopicRestController(BaseController):
 
     def __init__(self, forum, topic):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeDiscussion/forgediscussion/forum_main.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/forum_main.py b/ForgeDiscussion/forgediscussion/forum_main.py
index 1e55a2b..b9f033c 100644
--- a/ForgeDiscussion/forgediscussion/forum_main.py
+++ b/ForgeDiscussion/forgediscussion/forum_main.py
@@ -48,13 +48,16 @@ from widgets.admin import OptionsAdmin, AddForum
 
 log = logging.getLogger(__name__)
 
+
 class W:
     options_admin = OptionsAdmin()
     add_forum = AddForum()
 
+
 class ForgeDiscussionApp(Application):
     __version__ = version.__version__
-    permissions = ['configure', 'read', 'unmoderated_post', 'post', 'moderate', 'admin']
+    permissions = ['configure', 'read',
+                   'unmoderated_post', 'post', 'moderate', 'admin']
     permissions_desc = {
         'configure': 'Create new forums.',
         'read': 'View posts.',
@@ -63,22 +66,22 @@ class ForgeDiscussionApp(Application):
     config_options = Application.config_options + [
         ConfigOption('PostingPolicy',
                      schema.OneOf('ApproveOnceModerated', 'ModerateAll'), 'ApproveOnceModerated')
-        ]
-    PostClass=DM.ForumPost
-    AttachmentClass=DM.ForumAttachment
-    searchable=True
-    exportable=True
-    tool_label='Discussion'
-    tool_description="""
+    ]
+    PostClass = DM.ForumPost
+    AttachmentClass = DM.ForumAttachment
+    searchable = True
+    exportable = True
+    tool_label = 'Discussion'
+    tool_description = """
         Collaborate with your community in your forum.
     """
-    default_mount_label='Discussion'
-    default_mount_point='discussion'
-    ordinal=7
-    icons={
-        24:'images/forums_24.png',
-        32:'images/forums_32.png',
-        48:'images/forums_48.png'
+    default_mount_label = 'Discussion'
+    default_mount_point = 'discussion'
+    ordinal = 7
+    icons = {
+        24: 'images/forums_24.png',
+        32: 'images/forums_32.png',
+        48: 'images/forums_48.png'
     }
 
     def __init__(self, project, config):
@@ -98,7 +101,7 @@ class ForgeDiscussionApp(Application):
         log.info('Message from %s (%s)',
                  topic, self.config.options.mount_point)
         log.info('Headers are: %s', message['headers'])
-        shortname=urllib.unquote_plus(topic.replace('.', '/'))
+        shortname = urllib.unquote_plus(topic.replace('.', '/'))
         forum = DM.Forum.query.get(
             shortname=shortname, app_config_id=self.config._id)
         if forum is None:
@@ -110,9 +113,9 @@ class ForgeDiscussionApp(Application):
         '''Apps should provide their entries to be added to the main nav
         :return: a list of :class:`SitemapEntries <allura.app.SitemapEntry>`
         '''
-        return [ SitemapEntry(
-                self.config.options.mount_label,
-                '.')]
+        return [SitemapEntry(
+            self.config.options.mount_label,
+            '.')]
 
     @property
     @h.exceptionless([], log)
@@ -120,7 +123,7 @@ class ForgeDiscussionApp(Application):
         menu_id = self.config.options.mount_label
         with h.push_config(c, app=self):
             return [
-                SitemapEntry(menu_id, '.')[self.sidebar_menu()] ]
+                SitemapEntry(menu_id, '.')[self.sidebar_menu()]]
 
     @property
     def forums(self):
@@ -132,12 +135,13 @@ class ForgeDiscussionApp(Application):
 
     def subforums_of(self, parent_id):
         return DM.Forum.query.find(dict(
-                app_config_id=self.config._id,
-                parent_id=parent_id,
-                )).all()
+            app_config_id=self.config._id,
+            parent_id=parent_id,
+        )).all()
 
     def admin_menu(self):
-        admin_url = c.project.url() + 'admin/' + self.config.options.mount_point + '/'
+        admin_url = c.project.url() + 'admin/' + \
+            self.config.options.mount_point + '/'
         links = []
         if has_access(self, 'configure')():
             links.append(SitemapEntry('Forums', admin_url + 'forums'))
@@ -150,35 +154,44 @@ class ForgeDiscussionApp(Application):
             moderate_link = None
             forum_links = []
             forums = DM.Forum.query.find(dict(
-                            app_config_id=c.app.config._id,
-                            parent_id=None, deleted=False))
+                app_config_id=c.app.config._id,
+                parent_id=None, deleted=False))
             for f in forums:
-                if has_access(f,'read')():
+                if has_access(f, 'read')():
                     if f.url() in request.url and h.has_access(f, 'moderate')():
-                        moderate_link = SitemapEntry('Moderate', "%smoderate/" % f.url(), ui_icon=g.icons['pencil'],
-                        small = DM.ForumPost.query.find({'discussion_id':f._id, 'status':{'$ne': 'ok'}}).count())
-                    forum_links.append(SitemapEntry(f.name, f.url(), small=f.num_topics))
+                        moderate_link = SitemapEntry(
+                            'Moderate', "%smoderate/" % f.url(), ui_icon=g.icons['pencil'],
+                            small=DM.ForumPost.query.find({'discussion_id': f._id, 'status': {'$ne': 'ok'}}).count())
+                    forum_links.append(
+                        SitemapEntry(f.name, f.url(), small=f.num_topics))
             url = c.app.url + 'create_topic/'
-            url = h.urlquote(url + c.forum.shortname if getattr(c, 'forum', None) and c.forum else url)
-            l.append(SitemapEntry('Create Topic', url, ui_icon=g.icons['plus']))
+            url = h.urlquote(
+                url + c.forum.shortname if getattr(c, 'forum', None) and c.forum else url)
+            l.append(
+                SitemapEntry('Create Topic', url, ui_icon=g.icons['plus']))
             if has_access(c.app, 'configure')():
-                l.append(SitemapEntry('Add Forum', c.app.url + 'new_forum', ui_icon=g.icons['conversation']))
-                l.append(SitemapEntry('Admin Forums', c.project.url()+'admin/'+self.config.options.mount_point+'/forums', ui_icon=g.icons['pencil']))
+                l.append(SitemapEntry('Add Forum', c.app.url +
+                         'new_forum', ui_icon=g.icons['conversation']))
+                l.append(SitemapEntry('Admin Forums', c.project.url() + 'admin/' +
+                         self.config.options.mount_point + '/forums', ui_icon=g.icons['pencil']))
             if moderate_link:
                 l.append(moderate_link)
-            # if we are in a thread and not anonymous, provide placeholder links to use in js
+            # if we are in a thread and not anonymous, provide placeholder
+            # links to use in js
             if '/thread/' in request.url and c.user not in (None, M.User.anonymous()):
                 l.append(SitemapEntry(
-                        'Mark as Spam', 'flag_as_spam',
-                        ui_icon=g.icons['flag'], className='sidebar_thread_spam'))
-            l.append(SitemapEntry('Stats Graph', c.app.url + 'stats', ui_icon=g.icons['stats']))
+                    'Mark as Spam', 'flag_as_spam',
+                    ui_icon=g.icons['flag'], className='sidebar_thread_spam'))
+            l.append(SitemapEntry('Stats Graph', c.app.url +
+                     'stats', ui_icon=g.icons['stats']))
             if forum_links:
                 l.append(SitemapEntry('Forums'))
                 l = l + forum_links
             l.append(SitemapEntry('Help'))
-            l.append(SitemapEntry('Formatting Help', c.app.url + 'markdown_syntax'))
+            l.append(
+                SitemapEntry('Formatting Help', c.app.url + 'markdown_syntax'))
             return l
-        except: # pragma no cover
+        except:  # pragma no cover
             log.exception('sidebar_menu')
             return []
 
@@ -198,7 +211,7 @@ class ForgeDiscussionApp(Application):
             M.ACE.allow(role_developer, 'moderate'),
             M.ACE.allow(role_admin, 'configure'),
             M.ACE.allow(role_admin, 'admin'),
-            ]
+        ]
 
         utils.create_forum(self, new_forum=dict(
             shortname='general',
@@ -226,6 +239,7 @@ class ForgeDiscussionApp(Application):
             json.dump(forum, f, cls=jsonify.GenericJSON, indent=2)
         f.write(']}')
 
+
 class ForumAdminController(DefaultAdminController):
 
     def _check_security(self):
@@ -252,13 +266,14 @@ class ForumAdminController(DefaultAdminController):
     @expose()
     @require_post()
     def update_forums(self, forum=None, **kw):
-        if forum is None: forum = []
+        if forum is None:
+            forum = []
         for f in forum:
             forum = DM.Forum.query.get(_id=ObjectId(str(f['id'])))
             if f.get('delete'):
-                forum.deleted=True
+                forum.deleted = True
             elif f.get('undelete'):
-                forum.deleted=False
+                forum.deleted = False
             else:
                 if '.' in f['shortname'] or '/' in f['shortname'] or ' ' in f['shortname']:
                     flash('Shortname cannot contain space . or /', 'error')
@@ -269,7 +284,8 @@ class ForumAdminController(DefaultAdminController):
                 forum.monitoring_email = f['monitoring_email']
                 if 'members_only' in f:
                     if 'anon_posts' in f:
-                        flash('You cannot have anonymous posts in a members only forum.', 'warning')
+                        flash(
+                            'You cannot have anonymous posts in a members only forum.', 'warning')
                         forum.anon_posts = False
                         del f['anon_posts']
                     forum.members_only = True

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c93733ac/ForgeDiscussion/forgediscussion/import_support.py
----------------------------------------------------------------------
diff --git a/ForgeDiscussion/forgediscussion/import_support.py b/ForgeDiscussion/forgediscussion/import_support.py
index 60aff57..5318ec5 100644
--- a/ForgeDiscussion/forgediscussion/import_support.py
+++ b/ForgeDiscussion/forgediscussion/import_support.py
@@ -30,14 +30,17 @@ from forgediscussion import model as DM
 
 log = logging.getLogger(__name__)
 
+
 def validate_import(json, username_mapping, default_username=None):
     warnings = []
     schema = make_schema(username_mapping, default_username, warnings)
     json = schema.validate(json)
     return warnings, json
 
+
 def perform_import(json, username_mapping, default_username=None, create_users=False):
-    if create_users: default_username=create_user
+    if create_users:
+        default_username = create_user
 
     # Validate the import, create missing users
     warnings, json = validate_import(json, username_mapping, default_username)
@@ -69,42 +72,44 @@ def perform_import(json, username_mapping, default_username=None, create_users=F
                 subject=head['subject'])
             for p in posts:
                 p = create_post(f._id, t._id, p)
-            t.first_post_id=p._id
+            t.first_post_id = p._id
             ThreadLocalORMSession.flush_all()
             t.update_stats()
         ThreadLocalORMSession.flush_all()
         f.update_stats()
     return warnings
 
+
 def make_schema(user_name_map, default_username, warnings):
     USER = AlluraUser(user_name_map, default_username, warnings)
     TIMESTAMP = TimeStamp()
 
     POST = {
-        'msg_id':str,
-        'is_followup_to':str,
-        'is_deleted':str,
-        'thread_id':str,
-        'poster_name':str,
-        'poster_user':USER,
-        'subject':str,
-        'date':TIMESTAMP,
-        'body':str,
-        }
+        'msg_id': str,
+        'is_followup_to': str,
+        'is_deleted': str,
+        'thread_id': str,
+        'poster_name': str,
+        'poster_user': USER,
+        'subject': str,
+        'date': TIMESTAMP,
+        'body': str,
+    }
 
     FORUM = {
         'name': str,
         'description': str,
-        'threads': { str: [ POST ] },
-        }
+        'threads': {str: [POST]},
+    }
 
     result = S.SchemaItem.make({
-            'class':str,
-            'trackers':[None],
-            'forums': { str: FORUM }
-            })
+        'class': str,
+        'trackers': [None],
+        'forums': {str: FORUM}
+    })
     return result
 
+
 class AlluraUser(S.FancySchemaItem):
 
     def __init__(self, mapping, default_username, warnings, **kw):
@@ -131,6 +136,7 @@ class AlluraUser(S.FancySchemaItem):
     def _from_python(self, value, state):
         return value.username
 
+
 class TimeStamp(S.FancySchemaItem):
 
     def _validate(self, value, **kwargs):
@@ -141,6 +147,7 @@ class TimeStamp(S.FancySchemaItem):
         value = datetime.utcfromtimestamp(value)
         return value
 
+
 def create_user(json_username):
     allura_username = c.project.shortname + '-' + json_username
     while True:
@@ -156,6 +163,7 @@ def create_user(json_username):
             raise
     return allura_username
 
+
 def create_post(discussion_id, thread_id, json_post):
     p = DM.ForumPost(
         _id='%s@import' % (json_post.msg_id),