You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by he...@apache.org on 2015/05/29 22:41:07 UTC

[45/45] allura git commit: [#7878] Used 2to3 to see what issues would come up

[#7878] Used 2to3 to see what issues would come up


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/d52f8e2a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/d52f8e2a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/d52f8e2a

Branch: refs/heads/hs/7878
Commit: d52f8e2a82061780d436265c83ccf970d373d172
Parents: 80bd662
Author: Heith Seewald <hs...@slashdotmedia.com>
Authored: Fri May 29 16:39:32 2015 -0400
Committer: Heith Seewald <hs...@slashdotmedia.com>
Committed: Fri May 29 16:39:32 2015 -0400

----------------------------------------------------------------------
 .../Untitled-checkpoint.ipynb                   |    6 +
 Allura/LICENSE                                  |    3 -
 Allura/allura/__init__.py                       |    4 +
 Allura/allura/app.py                            |   37 +-
 Allura/allura/command/__init__.py               |   18 +-
 Allura/allura/command/base.py                   |    6 +-
 Allura/allura/command/create_neighborhood.py    |    4 +
 .../allura/command/create_trove_categories.py   |    6 +-
 Allura/allura/command/reclone_repo.py           |    4 +
 Allura/allura/command/script.py                 |   12 +-
 .../allura/command/set_neighborhood_features.py |    4 +
 Allura/allura/command/show_models.py            |   32 +-
 Allura/allura/command/smtp_server.py            |    4 +
 Allura/allura/command/taskd.py                  |   10 +-
 Allura/allura/command/taskd_cleanup.py          |    6 +-
 Allura/allura/config/app_cfg.py                 |    8 +-
 Allura/allura/config/environment.py             |    4 +
 Allura/allura/config/middleware.py              |   10 +-
 Allura/allura/config/resources.py               |    4 +
 Allura/allura/controllers/__init__.py           |    4 +
 Allura/allura/controllers/attachments.py        |   10 +-
 Allura/allura/controllers/auth.py               |   22 +-
 Allura/allura/controllers/base.py               |    6 +-
 .../allura/controllers/basetest_project_root.py |   12 +-
 Allura/allura/controllers/discuss.py            |   29 +-
 Allura/allura/controllers/error.py              |    4 +
 Allura/allura/controllers/feed.py               |    4 +
 Allura/allura/controllers/project.py            |   53 +-
 Allura/allura/controllers/repository.py         |   14 +-
 Allura/allura/controllers/rest.py               |   16 +-
 Allura/allura/controllers/root.py               |    4 +
 Allura/allura/controllers/search.py             |    6 +-
 Allura/allura/controllers/secure.py             |    4 +
 Allura/allura/controllers/site_admin.py         |   12 +-
 Allura/allura/controllers/static.py             |    6 +-
 Allura/allura/controllers/task.py               |    4 +
 Allura/allura/controllers/template.py           |    4 +
 Allura/allura/controllers/trovecategories.py    |    8 +-
 Allura/allura/eventslistener.py                 |    4 +
 Allura/allura/ext/admin/__init__.py             |    4 +
 Allura/allura/ext/admin/admin_main.py           |   34 +-
 Allura/allura/ext/admin/widgets.py              |    4 +
 Allura/allura/ext/project_home/__init__.py      |    4 +
 Allura/allura/ext/project_home/project_main.py  |    4 +
 Allura/allura/ext/search/__init__.py            |    4 +
 Allura/allura/ext/search/search_main.py         |    4 +
 Allura/allura/ext/user_profile/__init__.py      |    4 +
 Allura/allura/ext/user_profile/user_main.py     |    6 +-
 Allura/allura/lib/AsciiDammit.py                |   22 +-
 Allura/allura/lib/app_globals.py                |   27 +-
 Allura/allura/lib/base.py                       |   10 +-
 Allura/allura/lib/custom_middleware.py          |    6 +-
 Allura/allura/lib/decorators.py                 |   11 +-
 Allura/allura/lib/diff.py                       |    4 +
 Allura/allura/lib/exceptions.py                 |    8 +-
 Allura/allura/lib/gravatar.py                   |    8 +-
 Allura/allura/lib/helpers.py                    |   60 +-
 Allura/allura/lib/import_api.py                 |   20 +-
 Allura/allura/lib/macro.py                      |   14 +-
 Allura/allura/lib/mail_util.py                  |   30 +-
 Allura/allura/lib/markdown_extensions.py        |    9 +-
 Allura/allura/lib/package_path_loader.py        |    6 +-
 Allura/allura/lib/patches.py                    |    8 +-
 Allura/allura/lib/phone/__init__.py             |   74 -
 Allura/allura/lib/phone/nexmo.py                |   89 -
 Allura/allura/lib/plugin.py                     |   70 +-
 Allura/allura/lib/repository.py                 |    8 +-
 Allura/allura/lib/search.py                     |   22 +-
 Allura/allura/lib/security.py                   |   17 +-
 Allura/allura/lib/solr.py                       |   10 +-
 Allura/allura/lib/spam/__init__.py              |    4 +
 Allura/allura/lib/spam/akismetfilter.py         |    6 +-
 Allura/allura/lib/spam/mollomfilter.py          |    6 +-
 Allura/allura/lib/stats.py                      |    8 +-
 Allura/allura/lib/utils.py                      |   42 +-
 Allura/allura/lib/validators.py                 |   12 +-
 Allura/allura/lib/widgets/__init__.py           |    4 +
 Allura/allura/lib/widgets/analytics.py          |    4 +
 Allura/allura/lib/widgets/auth_widgets.py       |    4 +
 Allura/allura/lib/widgets/discuss.py            |   12 +-
 Allura/allura/lib/widgets/form_fields.py        |   14 +-
 Allura/allura/lib/widgets/forms.py              |   25 +-
 Allura/allura/lib/widgets/macros.py             |    4 +
 Allura/allura/lib/widgets/oauth_widgets.py      |    4 +
 Allura/allura/lib/widgets/project_list.py       |   14 +-
 Allura/allura/lib/widgets/repo.py               |    4 +
 Allura/allura/lib/widgets/search.py             |    4 +
 Allura/allura/lib/widgets/subscriptions.py      |    4 +
 Allura/allura/lib/widgets/user_profile.py       |    4 +
 Allura/allura/lib/widgets/vote.py               |    4 +
 Allura/allura/lib/zarkov_helpers.py             |    4 +
 Allura/allura/model/__init__.py                 |    4 +
 Allura/allura/model/artifact.py                 |   18 +-
 Allura/allura/model/attachments.py              |    4 +
 Allura/allura/model/auth.py                     |   30 +-
 Allura/allura/model/discuss.py                  |   38 +-
 Allura/allura/model/filesystem.py               |    6 +-
 Allura/allura/model/index.py                    |   14 +-
 Allura/allura/model/monq_model.py               |    8 +-
 Allura/allura/model/neighborhood.py             |    6 +-
 Allura/allura/model/notification.py             |    8 +-
 Allura/allura/model/oauth.py                    |    4 +
 Allura/allura/model/project.py                  |   42 +-
 Allura/allura/model/repo.py                     |    4 +
 Allura/allura/model/repo_refresh.py             |   90 +-
 Allura/allura/model/repository.py               |   53 +-
 Allura/allura/model/session.py                  |    6 +-
 Allura/allura/model/stats.py                    |    5 +
 Allura/allura/model/timeline.py                 |    6 +-
 Allura/allura/model/types.py                    |    4 +
 Allura/allura/model/webhook.py                  |   12 +-
 Allura/allura/nf/allura/css/allura.css          |   10 +-
 .../allura/public/nf/js/phone-verification.js   |  169 --
 Allura/allura/public/nf/js/react.min.js         |   16 -
 Allura/allura/scripts/__init__.py               |    6 +-
 .../allura/scripts/create_deleted_comments.py   |  110 -
 Allura/allura/scripts/refresh_last_commits.py   |   12 +-
 Allura/allura/scripts/refreshrepo.py            |    4 +
 Allura/allura/scripts/reindex_projects.py       |    6 +-
 Allura/allura/scripts/reindex_users.py          |    6 +-
 .../allura/scripts/remove_duplicate_troves.py   |   12 +-
 Allura/allura/scripts/scripttask.py             |    4 +
 Allura/allura/scripts/trac_export.py            |   28 +-
 Allura/allura/scripts/trim_emails.py            |    4 +
 Allura/allura/scripts/update_checkout_url.py    |    4 +
 Allura/allura/tasks/activity_tasks.py           |    4 +
 Allura/allura/tasks/admin_tasks.py              |    4 +
 Allura/allura/tasks/event_tasks.py              |    6 +-
 Allura/allura/tasks/export_tasks.py             |   14 +-
 Allura/allura/tasks/index_tasks.py              |    6 +-
 Allura/allura/tasks/mail_tasks.py               |   18 +-
 Allura/allura/tasks/notification_tasks.py       |    4 +
 Allura/allura/tasks/repo_tasks.py               |    4 +
 Allura/allura/templates/__init__.py             |    4 +
 Allura/allura/templates/mail/commits.md         |   36 +
 .../templates/neighborhood_add_project.html     |   18 +-
 .../templates/phone_verification_fragment.html  |   73 -
 .../widgets/neighborhood_add_project.html       |   10 +-
 Allura/allura/tests/__init__.py                 |    4 +
 Allura/allura/tests/decorators.py               |    4 +
 Allura/allura/tests/functional/__init__.py      |    4 +
 Allura/allura/tests/functional/test_admin.py    |  106 +-
 Allura/allura/tests/functional/test_auth.py     |   18 +-
 Allura/allura/tests/functional/test_discuss.py  |   83 +-
 Allura/allura/tests/functional/test_feeds.py    |    6 +-
 Allura/allura/tests/functional/test_gravatar.py |    8 +-
 Allura/allura/tests/functional/test_home.py     |   20 +-
 .../tests/functional/test_neighborhood.py       |  109 +-
 Allura/allura/tests/functional/test_rest.py     |   10 +-
 Allura/allura/tests/functional/test_root.py     |    4 +
 Allura/allura/tests/functional/test_search.py   |    4 +
 .../allura/tests/functional/test_site_admin.py  |   28 +-
 Allura/allura/tests/functional/test_static.py   |    4 +
 .../allura/tests/functional/test_subscriber.py  |    4 +
 .../allura/tests/functional/test_tool_list.py   |    4 +
 .../tests/functional/test_trovecategory.py      |    4 +
 .../tests/functional/test_user_profile.py       |   18 +-
 Allura/allura/tests/model/__init__.py           |    4 +
 Allura/allura/tests/model/test_artifact.py      |    4 +
 Allura/allura/tests/model/test_auth.py          |   10 +-
 Allura/allura/tests/model/test_discussion.py    |   14 +-
 Allura/allura/tests/model/test_filesystem.py    |   16 +-
 Allura/allura/tests/model/test_monq.py          |    4 +
 Allura/allura/tests/model/test_neighborhood.py  |   14 +-
 Allura/allura/tests/model/test_notification.py  |    4 +
 Allura/allura/tests/model/test_project.py       |    8 +-
 Allura/allura/tests/model/test_repo.py          |   10 +-
 .../tests/templates/jinja_master/test_lib.py    |    4 +
 Allura/allura/tests/test_app.py                 |    4 +
 Allura/allura/tests/test_commands.py            |    8 +-
 Allura/allura/tests/test_decorators.py          |    4 +
 Allura/allura/tests/test_diff.py                |   46 +-
 Allura/allura/tests/test_dispatch.py            |    4 +
 Allura/allura/tests/test_globals.py             |   52 +-
 Allura/allura/tests/test_helpers.py             |   46 +-
 Allura/allura/tests/test_mail_util.py           |   20 +-
 Allura/allura/tests/test_markdown.py            |    4 +
 Allura/allura/tests/test_plugin.py              |  118 +-
 Allura/allura/tests/test_scripttask.py          |    4 +
 Allura/allura/tests/test_security.py            |    4 +
 Allura/allura/tests/test_tasks.py               |   68 +-
 Allura/allura/tests/test_utils.py               |   27 +-
 Allura/allura/tests/test_validators.py          |    4 +
 Allura/allura/tests/test_webhooks.py            |  150 +-
 Allura/allura/tests/test_zarkov_helpers.py      |    4 +
 Allura/allura/tests/tscript.py                  |    6 +-
 Allura/allura/tests/tscript_error.py            |    4 +
 Allura/allura/tests/unit/__init__.py            |    4 +
 .../allura/tests/unit/controllers/test_auth.py  |    4 +
 .../test_discussion_moderation_controller.py    |   13 +-
 .../unit/controllers/test_dispatch_index.py     |    4 +
 Allura/allura/tests/unit/factories.py           |    4 +
 Allura/allura/tests/unit/patches.py             |    4 +
 Allura/allura/tests/unit/phone/__init__.py      |   16 -
 Allura/allura/tests/unit/phone/test_nexmo.py    |  136 --
 .../tests/unit/phone/test_phone_service.py      |   57 -
 Allura/allura/tests/unit/spam/test_akismet.py   |   16 +-
 Allura/allura/tests/unit/spam/test_mollom.py    |   16 +-
 .../allura/tests/unit/spam/test_spam_filter.py  |    4 +
 Allura/allura/tests/unit/test_app.py            |    4 +
 Allura/allura/tests/unit/test_artifact.py       |    4 +
 Allura/allura/tests/unit/test_discuss.py        |    4 +
 .../allura/tests/unit/test_helpers/test_ago.py  |    4 +
 .../tests/unit/test_helpers/test_set_context.py |    4 +
 .../tests/unit/test_ldap_auth_provider.py       |   20 +-
 Allura/allura/tests/unit/test_mixins.py         |    4 +
 .../tests/unit/test_package_path_loader.py      |    4 +
 Allura/allura/tests/unit/test_post_model.py     |    4 +
 Allura/allura/tests/unit/test_project.py        |   22 +-
 Allura/allura/tests/unit/test_repo.py           |    4 +
 Allura/allura/tests/unit/test_session.py        |   10 +-
 Allura/allura/tests/unit/test_sitemapentry.py   |    4 +
 Allura/allura/tests/unit/test_solr.py           |    4 +
 Allura/allura/version.py                        |    4 +
 Allura/allura/webhooks.py                       |   27 +-
 Allura/allura/websetup/__init__.py              |    8 +-
 Allura/allura/websetup/bootstrap.py             |    6 +-
 Allura/allura/websetup/schema.py                |    4 +
 Allura/development.ini                          |    8 -
 Allura/docs/conf.py                             |    8 +-
 Allura/ez_setup/__init__.py                     |   26 +-
 Allura/ldap-setup.py                            |   12 +-
 Allura/ldap-userconfig.py                       |   10 +-
 Allura/setup.py                                 |    9 +-
 Allura/test-light.py                            |    4 +
 AlluraTest/alluratest/controller.py             |    4 +
 AlluraTest/alluratest/test_syntax.py            |    8 +-
 AlluraTest/alluratest/validation.py             |    6 +-
 AlluraTest/setup.py                             |    4 +
 ForgeActivity/forgeactivity/__init__.py         |    6 +-
 ForgeActivity/forgeactivity/config/resources.py |    4 +
 ForgeActivity/forgeactivity/main.py             |   14 +-
 .../forgeactivity/tests/functional/test_root.py |    4 +
 ForgeActivity/forgeactivity/widgets/follow.py   |    6 +-
 ForgeActivity/setup.py                          |    4 +
 ForgeBlog/forgeblog/command/base.py             |    4 +
 ForgeBlog/forgeblog/command/rssfeeds.py         |   13 +-
 ForgeBlog/forgeblog/main.py                     |   14 +-
 ForgeBlog/forgeblog/model/__init__.py           |    6 +-
 ForgeBlog/forgeblog/model/blog.py               |    6 +-
 .../forgeblog/tests/functional/test_rest.py     |    4 +
 .../forgeblog/tests/functional/test_root.py     |    4 +
 ForgeBlog/forgeblog/tests/test_app.py           |    4 +
 ForgeBlog/forgeblog/tests/test_commands.py      |   14 +-
 ForgeBlog/forgeblog/tests/test_roles.py         |    4 +
 ForgeBlog/forgeblog/tests/unit/__init__.py      |    4 +
 .../forgeblog/tests/unit/test_blog_post.py      |    4 +
 ForgeBlog/forgeblog/version.py                  |    4 +
 ForgeBlog/forgeblog/widgets.py                  |    4 +
 ForgeBlog/setup.py                              |    4 +
 ForgeChat/forgechat/command.py                  |    6 +-
 ForgeChat/forgechat/main.py                     |    4 +
 ForgeChat/forgechat/model/__init__.py           |    6 +-
 ForgeChat/forgechat/model/chat.py               |    4 +
 .../forgechat/tests/functional/test_root.py     |    4 +
 ForgeChat/forgechat/version.py                  |    4 +
 ForgeChat/setup.py                              |    4 +
 .../forgediscussion/controllers/__init__.py     |    6 +-
 .../forgediscussion/controllers/forum.py        |    4 +
 .../forgediscussion/controllers/root.py         |   11 +-
 ForgeDiscussion/forgediscussion/forum_main.py   |   17 +-
 .../forgediscussion/import_support.py           |   15 +-
 .../forgediscussion/model/__init__.py           |    6 +-
 ForgeDiscussion/forgediscussion/model/forum.py  |    4 +
 ForgeDiscussion/forgediscussion/site_stats.py   |    8 +-
 ForgeDiscussion/forgediscussion/tasks.py        |    4 +
 .../tests/functional/test_forum.py              |  103 +-
 .../tests/functional/test_forum_admin.py        |   26 +-
 .../tests/functional/test_import.py             |    4 +
 .../tests/functional/test_rest.py               |   19 +-
 .../forgediscussion/tests/test_app.py           |   24 +-
 .../forgediscussion/tests/test_forum_roles.py   |    4 +
 ForgeDiscussion/forgediscussion/utils.py        |    4 +
 ForgeDiscussion/forgediscussion/version.py      |    4 +
 .../forgediscussion/widgets/__init__.py         |   10 +-
 .../forgediscussion/widgets/admin.py            |    6 +-
 .../forgediscussion/widgets/forum_widgets.py    |    4 +
 ForgeDiscussion/setup.py                        |    4 +
 ForgeGit/forgegit/controllers.py                |    4 +
 ForgeGit/forgegit/git_main.py                   |    4 +
 ForgeGit/forgegit/model/__init__.py             |    6 +-
 ForgeGit/forgegit/model/git_repo.py             |   10 +-
 ForgeGit/forgegit/tests/__init__.py             |    4 +
 ForgeGit/forgegit/tests/functional/test_auth.py |    4 +
 .../tests/functional/test_controllers.py        |   22 +-
 .../forgegit/tests/model/test_repository.py     |  158 +-
 ForgeGit/forgegit/tests/test_git_app.py         |    4 +
 ForgeGit/forgegit/tests/test_tasks.py           |    4 +
 ForgeGit/forgegit/version.py                    |    4 +
 ForgeGit/setup.py                               |    4 +
 ForgeImporters/docs/conf.py                     |    8 +-
 ForgeImporters/forgeimporters/base.py           |   24 +-
 ForgeImporters/forgeimporters/forge/tracker.py  |    4 +
 .../forgeimporters/github/__init__.py           |    8 +-
 ForgeImporters/forgeimporters/github/code.py    |    4 +
 ForgeImporters/forgeimporters/github/project.py |    4 +
 ForgeImporters/forgeimporters/github/tasks.py   |    4 +
 .../forgeimporters/github/tests/test_code.py    |   12 +-
 .../forgeimporters/github/tests/test_oauth.py   |    4 +
 .../forgeimporters/github/tests/test_tracker.py |   12 +-
 .../forgeimporters/github/tests/test_utils.py   |   20 +-
 .../forgeimporters/github/tests/test_wiki.py    |  176 +-
 ForgeImporters/forgeimporters/github/tracker.py |   24 +-
 ForgeImporters/forgeimporters/github/utils.py   |   10 +-
 ForgeImporters/forgeimporters/github/wiki.py    |   24 +-
 .../forgeimporters/google/__init__.py           |   30 +-
 ForgeImporters/forgeimporters/google/code.py    |    8 +-
 ForgeImporters/forgeimporters/google/project.py |    4 +
 ForgeImporters/forgeimporters/google/tasks.py   |    4 +
 .../forgeimporters/google/tests/test_code.py    |   10 +-
 .../forgeimporters/google/tests/test_init.py    |    4 +
 ForgeImporters/forgeimporters/google/tracker.py |   24 +-
 .../forgeimporters/tests/forge/test_tracker.py  |   10 +-
 .../tests/github/functional/test_github.py      |    4 +
 .../tests/github/test_extractor.py              |   44 +-
 .../forgeimporters/tests/github/test_tasks.py   |    4 +
 .../forgeimporters/tests/github/test_tracker.py |   10 +-
 .../tests/google/functional/test_tracker.py     |    4 +
 .../tests/google/test_extractor.py              |   26 +-
 .../forgeimporters/tests/google/test_tasks.py   |    4 +
 .../forgeimporters/tests/google/test_tracker.py |   10 +-
 .../forgeimporters/tests/test_base.py           |    4 +
 ForgeImporters/forgeimporters/trac/__init__.py  |    4 +
 ForgeImporters/forgeimporters/trac/project.py   |    4 +
 .../forgeimporters/trac/tests/test_tickets.py   |   12 +-
 ForgeImporters/forgeimporters/trac/tickets.py   |    7 +-
 ForgeImporters/setup.py                         |    4 +
 ForgeLink/forgelink/link_main.py                |    4 +
 .../forgelink/tests/functional/test_rest.py     |   18 +-
 .../forgelink/tests/functional/test_root.py     |   10 +-
 ForgeLink/forgelink/tests/test_app.py           |    4 +
 ForgeLink/forgelink/version.py                  |    4 +
 ForgeLink/setup.py                              |    4 +
 ForgeSVN/forgesvn/controllers.py                |    4 +
 ForgeSVN/forgesvn/model/__init__.py             |    6 +-
 ForgeSVN/forgesvn/model/svn.py                  |   12 +-
 ForgeSVN/forgesvn/svn_main.py                   |    6 +-
 ForgeSVN/forgesvn/tests/__init__.py             |    4 +
 ForgeSVN/forgesvn/tests/functional/test_auth.py |    4 +
 .../tests/functional/test_controllers.py        |    6 +-
 .../forgesvn/tests/model/test_repository.py     |  152 +-
 .../tests/model/test_svnimplementation.py       |    4 +
 ForgeSVN/forgesvn/tests/test_svn_app.py         |    4 +
 ForgeSVN/forgesvn/tests/test_tasks.py           |    4 +
 ForgeSVN/forgesvn/version.py                    |    4 +
 ForgeSVN/forgesvn/widgets.py                    |    4 +
 ForgeSVN/setup.py                               |    6 +-
 ForgeShortUrl/forgeshorturl/main.py             |    4 +
 ForgeShortUrl/forgeshorturl/model/__init__.py   |    4 +
 ForgeShortUrl/forgeshorturl/model/shorturl.py   |    4 +
 .../forgeshorturl/tests/functional/test.py      |    4 +
 .../forgeshorturl/widgets/short_url.py          |    4 +
 ForgeShortUrl/setup.py                          |    4 +
 .../forgetracker/command/fix_discussion.py      |    4 +
 ForgeTracker/forgetracker/config/resources.py   |    4 +
 ForgeTracker/forgetracker/import_support.py     |   27 +-
 ForgeTracker/forgetracker/model/__init__.py     |    6 +-
 ForgeTracker/forgetracker/model/ticket.py       |   56 +-
 ForgeTracker/forgetracker/plugins.py            |    4 +
 ForgeTracker/forgetracker/search.py             |    8 +-
 ForgeTracker/forgetracker/site_stats.py         |    4 +
 ForgeTracker/forgetracker/tasks.py              |    4 +
 .../tests/command/test_fix_discussion.py        |    4 +
 .../forgetracker/tests/functional/test_rest.py  |    4 +
 .../forgetracker/tests/functional/test_root.py  |  102 +-
 ForgeTracker/forgetracker/tests/test_app.py     |    6 +-
 .../forgetracker/tests/test_tracker_roles.py    |    4 +
 .../forgetracker/tests/unit/__init__.py         |    4 +
 .../tests/unit/test_globals_model.py            |    4 +
 .../tests/unit/test_milestone_controller.py     |    8 +-
 .../tests/unit/test_root_controller.py          |    4 +
 .../forgetracker/tests/unit/test_search.py      |    4 +
 .../unit/test_ticket_custom_fields_form.py      |    4 +
 .../forgetracker/tests/unit/test_ticket_form.py |    4 +
 .../tests/unit/test_ticket_model.py             |   38 +-
 ForgeTracker/forgetracker/tracker_main.py       |   32 +-
 ForgeTracker/forgetracker/version.py            |    4 +
 ForgeTracker/forgetracker/widgets/admin.py      |    4 +
 .../forgetracker/widgets/admin_custom_fields.py |    4 +
 ForgeTracker/forgetracker/widgets/bin_form.py   |    4 +
 .../forgetracker/widgets/ticket_form.py         |    6 +-
 .../forgetracker/widgets/ticket_search.py       |    6 +-
 ForgeTracker/setup.py                           |    4 +
 .../forgeuserstats/controllers/userstats.py     |    8 +-
 ForgeUserStats/forgeuserstats/main.py           |    8 +-
 ForgeUserStats/forgeuserstats/model/stats.py    |    4 +
 .../forgeuserstats/tests/test_model.py          |   12 +-
 .../forgeuserstats/tests/test_stats.py          |    4 +
 ForgeUserStats/forgeuserstats/version.py        |    4 +
 ForgeUserStats/forgeuserstats/widgets/forms.py  |    4 +
 ForgeUserStats/setup.py                         |    4 +
 ForgeWiki/forgewiki/converters.py               |    6 +-
 ForgeWiki/forgewiki/model/__init__.py           |    6 +-
 ForgeWiki/forgewiki/model/wiki.py               |    6 +-
 .../forgewiki/tests/functional/test_rest.py     |   10 +-
 .../forgewiki/tests/functional/test_root.py     |   24 +-
 ForgeWiki/forgewiki/tests/test_app.py           |    4 +
 ForgeWiki/forgewiki/tests/test_converters.py    |    4 +
 ForgeWiki/forgewiki/tests/test_models.py        |    4 +
 ForgeWiki/forgewiki/tests/test_wiki_roles.py    |    4 +
 ForgeWiki/forgewiki/version.py                  |    4 +
 ForgeWiki/forgewiki/widgets/wiki.py             |    4 +
 ForgeWiki/forgewiki/wiki_main.py                |   15 +-
 ForgeWiki/setup.py                              |    4 +
 LICENSE                                         |    3 -
 __init__.py                                     |   27 +
 app.py                                          |  929 ++++++++
 command/__init__.py                             |   28 +
 command/base.py                                 |  131 ++
 command/create_neighborhood.py                  |  107 +
 command/create_trove_categories.py              | 2033 ++++++++++++++++++
 command/reclone_repo.py                         |   74 +
 command/script.py                               |   98 +
 command/set_neighborhood_features.py            |   96 +
 command/show_models.py                          |  390 ++++
 command/smtp_server.py                          |   66 +
 command/taskd.py                                |  230 ++
 command/taskd_cleanup.py                        |  210 ++
 config/__init__.py                              |   18 +
 config/app_cfg.py                               |  141 ++
 config/environment.py                           |   35 +
 config/middleware.py                            |  226 ++
 config/resources.py                             |   58 +
 controllers/__init__.py                         |   27 +
 controllers/attachments.py                      |  106 +
 controllers/auth.py                             | 1065 +++++++++
 controllers/base.py                             |   58 +
 controllers/basetest_project_root.py            |  219 ++
 controllers/discuss.py                          |  533 +++++
 controllers/error.py                            |   44 +
 controllers/feed.py                             |  115 +
 controllers/project.py                          | 1050 +++++++++
 controllers/repository.py                       |  796 +++++++
 controllers/rest.py                             |  318 +++
 controllers/root.py                             |  114 +
 controllers/search.py                           |  137 ++
 controllers/secure.py                           |   27 +
 controllers/site_admin.py                       |  584 +++++
 controllers/static.py                           |   56 +
 controllers/task.py                             |   37 +
 controllers/template.py                         |   60 +
 controllers/trovecategories.py                  |  252 +++
 eventslistener.py                               |   90 +
 ext/__init__.py                                 |   16 +
 ext/admin/__init__.py                           |   22 +
 ext/admin/admin_main.py                         | 1235 +++++++++++
 ext/admin/templates/__init__.py                 |   16 +
 ext/admin/templates/widgets/__init__.py         |   16 +
 ext/admin/widgets.py                            |  247 +++
 ext/project_home/__init__.py                    |   22 +
 ext/project_home/project_main.py                |   95 +
 ext/search/__init__.py                          |   22 +
 ext/search/search_main.py                       |   98 +
 ext/user_profile/__init__.py                    |   22 +
 ext/user_profile/templates/__init__.py          |   16 +
 ext/user_profile/user_main.py                   |  368 ++++
 fuse/accessfs.py                                |   14 +-
 lib/AsciiDammit.py                              |  227 ++
 lib/__init__.py                                 |   18 +
 lib/app_globals.py                              |  639 ++++++
 lib/base.py                                     |   77 +
 lib/custom_middleware.py                        |  325 +++
 lib/decorators.py                               |  218 ++
 lib/diff.py                                     |  121 ++
 lib/exceptions.py                               |  101 +
 lib/gravatar.py                                 |   90 +
 lib/helpers.py                                  | 1231 +++++++++++
 lib/import_api.py                               |   68 +
 lib/macro.py                                    |  477 ++++
 lib/mail_util.py                                |  290 +++
 lib/markdown_extensions.py                      |  569 +++++
 lib/package_path_loader.py                      |  288 +++
 lib/patches.py                                  |  127 ++
 lib/phone/__init__.py                           |   78 +
 lib/phone/nexmo.py                              |   93 +
 lib/plugin.py                                   | 1502 +++++++++++++
 lib/repository.py                               |  337 +++
 lib/search.py                                   |  336 +++
 lib/security.py                                 |  501 +++++
 lib/solr.py                                     |  190 ++
 lib/spam/__init__.py                            |   57 +
 lib/spam/akismetfilter.py                       |  107 +
 lib/spam/mollomfilter.py                        |   97 +
 lib/stats.py                                    |   89 +
 lib/utils.py                                    |  612 ++++++
 lib/validators.py                               |  424 ++++
 lib/widgets/__init__.py                         |   26 +
 lib/widgets/analytics.py                        |   29 +
 lib/widgets/auth_widgets.py                     |  100 +
 lib/widgets/discuss.py                          |  500 +++++
 lib/widgets/form_fields.py                      |  554 +++++
 lib/widgets/forms.py                            | 1173 ++++++++++
 lib/widgets/macros.py                           |   62 +
 lib/widgets/oauth_widgets.py                    |   47 +
 lib/widgets/project_list.py                     |  144 ++
 lib/widgets/repo.py                             |  118 +
 lib/widgets/search.py                           |   64 +
 lib/widgets/subscriptions.py                    |   92 +
 lib/widgets/user_profile.py                     |   53 +
 lib/widgets/vote.py                             |   35 +
 lib/zarkov_helpers.py                           |   43 +
 model/__init__.py                               |   54 +
 model/artifact.py                               |  952 ++++++++
 model/attachments.py                            |   89 +
 model/auth.py                                   | 1028 +++++++++
 model/discuss.py                                |  793 +++++++
 model/filesystem.py                             |  211 ++
 model/index.py                                  |  271 +++
 model/monq_model.py                             |  297 +++
 model/neighborhood.py                           |  295 +++
 model/notification.py                           |  721 +++++++
 model/oauth.py                                  |  148 ++
 model/project.py                                | 1280 +++++++++++
 model/repo.py                                   |   30 +
 model/repo_refresh.py                           |  587 +++++
 model/repository.py                             | 1988 +++++++++++++++++
 model/session.py                                |  275 +++
 model/stats.py                                  |  619 ++++++
 model/timeline.py                               |  150 ++
 model/types.py                                  |  118 +
 model/webhook.py                                |   76 +
 rat-excludes.txt                                |    1 -
 scripts/ApacheAccessHandler.py                  |    4 +
 scripts/__init__.py                             |   22 +
 scripts/add_user_to_group.py                    |    4 +
 scripts/allura_import.py                        |   10 +-
 scripts/changelog.py                            |   10 +-
 scripts/create-allura-sitemap.py                |   12 +-
 scripts/create-moved-tickets.py                 |   10 +-
 scripts/create_deleted_comments.py              |  114 +
 scripts/fix-wiki-page-names.py                  |    4 +
 scripts/import_trove_categories.py              |    4 +
 scripts/migrations/000-fix-tracker-fields.py    |    4 +
 scripts/migrations/001-restore-labels.py        |    4 +
 .../002-fix-tracker-thread-subjects.py          |    4 +
 scripts/migrations/003-migrate_project_roles.py |    4 +
 .../004-make-attachments-polymorphic.py         |    4 +
 ...005-remove_duplicate_ticket_notifications.py |   12 +-
 scripts/migrations/006-migrate-artifact-refs.py |    4 +
 scripts/migrations/007-update-acls.py           |   12 +-
 .../migrations/008-remove-forumpost-subject.py  |    4 +
 scripts/migrations/009-set_landing_page.py      |    4 +
 scripts/migrations/010-fix-home-permissions.py  |    4 +
 scripts/migrations/011-fix-subroles.py          |    4 +
 scripts/migrations/012-uninstall-home.py        |    4 +
 scripts/migrations/013-update-ordinals.py       |    4 +
 .../015-add-neighborhood_id-to-blog-posts.py    |    4 +
 scripts/migrations/018-add-svn-checkout-url.py  |    4 +
 .../migrations/020-remove-wiki-title-slashes.py |    8 +-
 .../migrations/022-change-anon-display-name.py  |    4 +
 .../024-migrate-custom-profile-text.py          |    4 +
 scripts/migrations/025-add-is-nbhd-project.py   |    4 +
 scripts/migrations/026-install-activity-tool.py |    4 +
 .../027-change-ticket-write-permissions.py      |    4 +
 scripts/migrations/028-remove-svn-trees.py      |   10 +-
 .../migrations/029-set-mailbox-queue_empty.py   |    4 +
 .../migrations/031-set-user-pending-to-false.py |    6 +-
 scripts/new_ticket.py                           |   14 +-
 scripts/open_relay.py                           |    4 +
 scripts/perf/benchmark-scm.py                   |   10 +-
 scripts/perf/call_count.py                      |   12 +-
 scripts/perf/generate-projects.py               |   10 +-
 scripts/perf/md_perf.py                         |   20 +-
 scripts/perf/sstress.py                         |    8 +-
 scripts/perf/test_git_lcd.py                    |    8 +-
 scripts/prep-scm-sandbox.py                     |   16 +-
 scripts/prepare-allura-tickets-for-import.py    |    4 +
 scripts/project-import.py                       |    8 +-
 scripts/publicize-neighborhood.py               |    4 +
 scripts/recover-user-databases.py               |    4 +
 scripts/refresh_last_commits.py                 |  193 ++
 scripts/refreshrepo.py                          |  203 ++
 scripts/reindex_projects.py                     |  117 +
 scripts/reindex_users.py                        |   93 +
 scripts/remove_duplicate_troves.py              |  134 ++
 scripts/rethumb.py                              |    6 +-
 scripts/scripttask.py                           |   99 +
 scripts/scrub-allura-data.py                    |    4 +
 scripts/setup-scm-server.py                     |    4 +
 scripts/teamforge-import.py                     |    6 +-
 scripts/test-branches-against-tickets.py        |    4 +
 scripts/trac_export.py                          |  312 ++-
 scripts/trim_emails.py                          |   58 +
 scripts/update_checkout_url.py                  |   57 +
 scripts/wiki-copy.py                            |   16 +-
 scripts/wiki-export.py                          |    4 +
 scripts/wiki-post.py                            |   10 +-
 tasks/__init__.py                               |   16 +
 tasks/activity_tasks.py                         |   29 +
 tasks/admin_tasks.py                            |   43 +
 tasks/event_tasks.py                            |   40 +
 tasks/export_tasks.py                           |  132 ++
 tasks/index_tasks.py                            |  138 ++
 tasks/mail_tasks.py                             |  209 ++
 tasks/notification_tasks.py                     |   29 +
 tasks/repo_tasks.py                             |  176 ++
 templates/__init__.py                           |   24 +
 templates/discussion/__init__.py                |   16 +
 templates/macro/__init__.py                     |   16 +
 templates/oembed/__init__.py                    |   16 +
 templates/repo/__init__.py                      |   16 +
 templates/widgets/__init__.py                   |   16 +
 tests/__init__.py                               |   39 +
 tests/decorators.py                             |  201 ++
 tests/functional/__init__.py                    |   24 +
 tests/functional/test_admin.py                  | 1351 ++++++++++++
 tests/functional/test_auth.py                   | 1798 ++++++++++++++++
 tests/functional/test_discuss.py                |  327 +++
 tests/functional/test_feeds.py                  |  100 +
 tests/functional/test_gravatar.py               |   55 +
 tests/functional/test_home.py                   |  171 ++
 tests/functional/test_neighborhood.py           | 1057 +++++++++
 tests/functional/test_rest.py                   |  355 +++
 tests/functional/test_root.py                   |  186 ++
 tests/functional/test_search.py                 |   37 +
 tests/functional/test_site_admin.py             |  575 +++++
 tests/functional/test_static.py                 |   30 +
 tests/functional/test_subscriber.py             |   43 +
 tests/functional/test_tool_list.py              |   48 +
 tests/functional/test_trovecategory.py          |  124 ++
 tests/functional/test_user_profile.py           |  180 ++
 tests/model/__init__.py                         |   24 +
 tests/model/test_artifact.py                    |  229 ++
 tests/model/test_auth.py                        |  420 ++++
 tests/model/test_discussion.py                  |  519 +++++
 tests/model/test_filesystem.py                  |  220 ++
 tests/model/test_monq.py                        |   46 +
 tests/model/test_neighborhood.py                |   97 +
 tests/model/test_notification.py                |  487 +++++
 tests/model/test_project.py                     |  191 ++
 tests/model/test_repo.py                        |  816 +++++++
 tests/templates/__init__.py                     |   17 +
 tests/templates/jinja_master/__init__.py        |   17 +
 tests/templates/jinja_master/test_lib.py        |   86 +
 tests/test_app.py                               |   71 +
 tests/test_commands.py                          |  478 ++++
 tests/test_decorators.py                        |   60 +
 tests/test_diff.py                              |  150 ++
 tests/test_dispatch.py                          |   38 +
 tests/test_globals.py                           |  858 ++++++++
 tests/test_helpers.py                           |  568 +++++
 tests/test_mail_util.py                         |  238 ++
 tests/test_markdown.py                          |  152 ++
 tests/test_plugin.py                            |  416 ++++
 tests/test_scripttask.py                        |   47 +
 tests/test_security.py                          |  196 ++
 tests/test_tasks.py                             |  593 +++++
 tests/test_utils.py                             |  321 +++
 tests/test_validators.py                        |  291 +++
 tests/test_webhooks.py                          |  899 ++++++++
 tests/test_zarkov_helpers.py                    |   57 +
 tests/tscript.py                                |   33 +
 tests/tscript_error.py                          |   23 +
 tests/unit/__init__.py                          |   47 +
 tests/unit/controllers/__init__.py              |   16 +
 tests/unit/controllers/test_auth.py             |   35 +
 .../test_discussion_moderation_controller.py    |  116 +
 tests/unit/controllers/test_dispatch_index.py   |   45 +
 tests/unit/factories.py                         |   90 +
 tests/unit/patches.py                           |   56 +
 tests/unit/phone/__init__.py                    |   16 +
 tests/unit/phone/test_nexmo.py                  |  140 ++
 tests/unit/phone/test_phone_service.py          |   61 +
 tests/unit/spam/__init__.py                     |   16 +
 tests/unit/spam/test_akismet.py                 |  141 ++
 tests/unit/spam/test_mollom.py                  |  100 +
 tests/unit/spam/test_spam_filter.py             |   62 +
 tests/unit/test_app.py                          |  118 +
 tests/unit/test_artifact.py                     |   33 +
 tests/unit/test_discuss.py                      |   43 +
 tests/unit/test_helpers/__init__.py             |   16 +
 tests/unit/test_helpers/test_ago.py             |   68 +
 tests/unit/test_helpers/test_set_context.py     |  121 ++
 tests/unit/test_ldap_auth_provider.py           |  156 ++
 tests/unit/test_mixins.py                       |   91 +
 tests/unit/test_package_path_loader.py          |  232 ++
 tests/unit/test_post_model.py                   |   56 +
 tests/unit/test_project.py                      |  105 +
 tests/unit/test_repo.py                         |  361 ++++
 tests/unit/test_session.py                      |  258 +++
 tests/unit/test_sitemapentry.py                 |   38 +
 tests/unit/test_solr.py                         |  238 ++
 version.py                                      |   23 +
 webhooks.py                                     |  493 +++++
 websetup/__init__.py                            |   42 +
 websetup/bootstrap.py                           |  357 +++
 websetup/schema.py                              |   55 +
 687 files changed, 60024 insertions(+), 2805 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/.ipynb_checkpoints/Untitled-checkpoint.ipynb
----------------------------------------------------------------------
diff --git a/Allura/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/Allura/.ipynb_checkpoints/Untitled-checkpoint.ipynb
new file mode 100644
index 0000000..286dcb3
--- /dev/null
+++ b/Allura/.ipynb_checkpoints/Untitled-checkpoint.ipynb
@@ -0,0 +1,6 @@
+{
+ "cells": [],
+ "metadata": {},
+ "nbformat": 4,
+ "nbformat_minor": 0
+}

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/LICENSE
----------------------------------------------------------------------
diff --git a/Allura/LICENSE b/Allura/LICENSE
index a447b69..d2b93e1 100644
--- a/Allura/LICENSE
+++ b/Allura/LICENSE
@@ -242,6 +242,3 @@ For details, see allura/public/nf/js/sylvester.js
 
 Modernizr, which is available under the MIT license.
 For details, see allura/public/nf/js/modernizr.js
-
-React.js, which is available under the BSD license.
-For details, see Allura/allura/public/nf/js/react.min.js

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/__init__.py b/Allura/allura/__init__.py
index ebf903b..ef58e09 100644
--- a/Allura/allura/__init__.py
+++ b/Allura/allura/__init__.py
@@ -18,6 +18,10 @@
 #       under the License.
 
 """The allura package"""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 from paste.registry import StackedObjectProxy
 
 credentials = StackedObjectProxy(name='credentials')

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/app.py
----------------------------------------------------------------------
diff --git a/Allura/allura/app.py b/Allura/allura/app.py
index 3e226db..102c538 100644
--- a/Allura/allura/app.py
+++ b/Allura/allura/app.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -18,7 +22,7 @@
 import os
 import logging
 from urllib import basejoin
-from cStringIO import StringIO
+from io import StringIO
 from collections import defaultdict
 from xml.etree import ElementTree as ET
 
@@ -43,6 +47,7 @@ from allura.controllers import BaseController
 from allura.lib.decorators import require_post, memoize
 from allura.lib.utils import permanent_redirect, ConfigProxy
 from allura import model as M
+import collections
 
 log = logging.getLogger(__name__)
 
@@ -67,7 +72,7 @@ class ConfigOption(object):
         """Return the default value for this ConfigOption.
 
         """
-        if callable(self._default):
+        if isinstance(self._default, collections.Callable):
             return self._default()
         return self._default
 
@@ -135,7 +140,7 @@ class SitemapEntry(object):
         """
         lbl = self.label
         url = self.url
-        if callable(lbl):
+        if isinstance(lbl, collections.Callable):
             lbl = lbl(app)
         if url is not None:
             url = basejoin(app.url, url)
@@ -549,7 +554,7 @@ class Application(object):
         :return: a list of :class:`WebhookSender <allura.webhooks.WebhookSender>`
         """
         tool_name = self.config.tool_name.lower()
-        webhooks = [w for w in g.entry_points['webhooks'].itervalues()
+        webhooks = [w for w in g.entry_points['webhooks'].values()
                     if tool_name in w.triggered_by]
         return webhooks
 
@@ -660,7 +665,7 @@ class Application(object):
 
         Set exportable to True for applications implementing this.
         """
-        raise NotImplementedError, 'bulk_export'
+        raise NotImplementedError('bulk_export')
 
     def doap(self, parent):
         """App's representation for DOAP API.
@@ -738,7 +743,7 @@ class DefaultAdminController(BaseController):
     @require_post()
     def unblock_user(self, user_id=None, perm=None):
         try:
-            user_id = map(ObjectId, user_id)
+            user_id = list(map(ObjectId, user_id))
         except InvalidId:
             user_id = []
         users = model.User.query.find({'_id': {'$in': user_id}}).all()
@@ -759,7 +764,7 @@ class DefaultAdminController(BaseController):
         """Render the permissions management web page.
 
         """
-        from ext.admin.widgets import PermissionCard, BlockUser, BlockList
+        from .ext.admin.widgets import PermissionCard, BlockUser, BlockList
         c.card = PermissionCard()
         c.block_user = BlockUser()
         c.block_list = BlockList()
@@ -862,9 +867,9 @@ class DefaultAdminController(BaseController):
             new_group_ids = args.get('new', [])
             del_group_ids = []
             group_ids = args.get('value', [])
-            if isinstance(new_group_ids, basestring):
+            if isinstance(new_group_ids, str):
                 new_group_ids = [new_group_ids]
-            if isinstance(group_ids, basestring):
+            if isinstance(group_ids, str):
                 group_ids = [group_ids]
 
             for acl in old_acl:
@@ -872,18 +877,18 @@ class DefaultAdminController(BaseController):
                     del_group_ids.append(str(acl['role_id']))
 
             get_role = lambda _id: model.ProjectRole.query.get(_id=ObjectId(_id))
-            groups = map(get_role, group_ids)
-            new_groups = map(get_role, new_group_ids)
-            del_groups = map(get_role, del_group_ids)
+            groups = list(map(get_role, group_ids))
+            new_groups = list(map(get_role, new_group_ids))
+            del_groups = list(map(get_role, del_group_ids))
 
             if new_groups or del_groups:
                 model.AuditLog.log('updated "%s" permission: "%s" => "%s" for %s' % (
                     perm,
-                    ', '.join(map(lambda role: role.name, filter(None, groups + del_groups))),
-                    ', '.join(map(lambda role: role.name, filter(None, groups + new_groups))),
+                    ', '.join([role.name for role in [_f for _f in groups + del_groups if _f]]),
+                    ', '.join([role.name for role in [_f for _f in groups + new_groups if _f]]),
                     self.app.config.options['mount_point']))
 
-            role_ids = map(ObjectId, group_ids + new_group_ids)
+            role_ids = list(map(ObjectId, group_ids + new_group_ids))
             self.app.config.acl += [
                 model.ACE.allow(r, perm) for r in role_ids]
 
@@ -921,4 +926,4 @@ class WebhooksLookup(BaseController):
         for hook in self.app._webhooks:
             if hook.type == name and hook.controller:
                 return hook.controller(hook, self.app), remainder
-        raise exc.HTTPNotFound, name
+        raise exc.HTTPNotFound(name)

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/__init__.py b/Allura/allura/command/__init__.py
index 24254aa..051d97f 100644
--- a/Allura/allura/command/__init__.py
+++ b/Allura/allura/command/__init__.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -15,10 +19,10 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from base import Command
-from show_models import ShowModelsCommand, ReindexCommand, EnsureIndexCommand
-from script import ScriptCommand, SetToolAccessCommand
-from smtp_server import SMTPServerCommand
-from create_neighborhood import CreateNeighborhoodCommand, UpdateNeighborhoodCommand
-from create_trove_categories import CreateTroveCategoriesCommand
-from set_neighborhood_features import SetNeighborhoodFeaturesCommand
+from .base import Command
+from .show_models import ShowModelsCommand, ReindexCommand, EnsureIndexCommand
+from .script import ScriptCommand, SetToolAccessCommand
+from .smtp_server import SMTPServerCommand
+from .create_neighborhood import CreateNeighborhoodCommand, UpdateNeighborhoodCommand
+from .create_trove_categories import CreateTroveCategoriesCommand
+from .set_neighborhood_features import SetNeighborhoodFeaturesCommand

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/base.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/base.py b/Allura/allura/command/base.py
index 3d619fc..48fa41d 100644
--- a/Allura/allura/command/base.py
+++ b/Allura/allura/command/base.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -109,7 +113,7 @@ class Command(command.Command):
             # Probably being called from another script (websetup, perhaps?)
             log = logging.getLogger('allura.command')
             conf = pylons.config
-        self.tools = pylons.app_globals.entry_points['tool'].values()
+        self.tools = list(pylons.app_globals.entry_points['tool'].values())
         for ep in iter_entry_points('allura.command_init'):
             log.info('Running command_init for %s', ep.name)
             ep.load()(conf)

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/create_neighborhood.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/create_neighborhood.py b/Allura/allura/command/create_neighborhood.py
index db79bb0..4456308 100644
--- a/Allura/allura/command/create_neighborhood.py
+++ b/Allura/allura/command/create_neighborhood.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/create_trove_categories.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/create_trove_categories.py b/Allura/allura/command/create_trove_categories.py
index eba9244..eca8946 100644
--- a/Allura/allura/command/create_trove_categories.py
+++ b/Allura/allura/command/create_trove_categories.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -62,7 +66,7 @@ class CreateTroveCategoriesCommand(base.Command):
             sys.exit("Couldn't find TroveCategory with trove_cat_id=%s" %
                      trove_cat_id)
         for t in ts:
-            for k, v in attr_dict.iteritems():
+            for k, v in attr_dict.items():
                 setattr(t, k, v)
 
     # patching to avoid a *lot* of event hooks firing, and taking a long long time

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/reclone_repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/reclone_repo.py b/Allura/allura/command/reclone_repo.py
index d401b0b..dcde7d5 100644
--- a/Allura/allura/command/reclone_repo.py
+++ b/Allura/allura/command/reclone_repo.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/script.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/script.py b/Allura/allura/command/script.py
index 1f2c93a..d47167e 100644
--- a/Allura/allura/command/script.py
+++ b/Allura/allura/command/script.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -63,7 +67,7 @@ class ScriptCommand(base.Command):
                     cProfile.run(fp, '%s.profile' %
                                  os.path.basename(self.args[1]))
                 else:
-                    exec fp in ns
+                    exec(fp, ns)
 
 
 class SetToolAccessCommand(base.Command):
@@ -85,10 +89,10 @@ class SetToolAccessCommand(base.Command):
                        ' so removing from list.')
                 continue
             if s not in ('alpha', 'beta'):
-                print 'Unknown tool status %s' % s
+                print('Unknown tool status %s' % s)
                 sys.exit(1)
             extra_status.append(s)
-        print 'Setting project "%s" tool access to production + %r' % (
-            self.args[1], extra_status)
+        print('Setting project "%s" tool access to production + %r' % (
+            self.args[1], extra_status))
         c.project._extra_tool_status = extra_status
         session(c.project).flush()

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/set_neighborhood_features.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/set_neighborhood_features.py b/Allura/allura/command/set_neighborhood_features.py
index 36ba22b..f3fbaac 100644
--- a/Allura/allura/command/set_neighborhood_features.py
+++ b/Allura/allura/command/set_neighborhood_features.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/show_models.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/show_models.py b/Allura/allura/command/show_models.py
index d941e9e..70bbf86 100644
--- a/Allura/allura/command/show_models.py
+++ b/Allura/allura/command/show_models.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -46,7 +50,7 @@ class ShowModelsCommand(base.Command):
         graph = build_model_inheritance_graph()
         for depth, cls in dfs(MappedClass, graph):
             for line in dump_cls(depth, cls):
-                print line
+                print(line)
 
 
 class ReindexCommand(base.Command):
@@ -136,7 +140,7 @@ class ReindexCommand(base.Command):
                     M.artifact_orm_session.clear()
                     try:
                         self._chunked_add_artifacts(ref_ids)
-                    except CompoundError, err:
+                    except CompoundError as err:
                         base.log.exception(
                             'Error indexing artifacts:\n%r', err)
                         base.log.error('%s', err.format_error())
@@ -232,14 +236,14 @@ class EnsureIndexCommand(base.Command):
                 idx = project_indexes[cname]
             idx.extend(mgr.indexes)
         base.log.info('Updating indexes for main DB')
-        for odm_session, db_indexes in main_indexes.iteritems():
+        for odm_session, db_indexes in main_indexes.items():
             db = odm_session.impl.db
-            for name, indexes in db_indexes.iteritems():
+            for name, indexes in db_indexes.items():
                 self._update_indexes(db[name], indexes)
         base.log.info('Updating indexes for project DB')
         db = M.project_doc_session.db
         base.log.info('... DB: %s', db)
-        for name, indexes in project_indexes.iteritems():
+        for name, indexes in project_indexes.items():
             self._update_indexes(db[name], indexes)
         base.log.info('Done updating indexes')
 
@@ -257,7 +261,7 @@ class EnsureIndexCommand(base.Command):
         prev_uindexes = {}
         unique_flag_drop = {}
         unique_flag_add = {}
-        for iname, fields in collection.index_information().iteritems():
+        for iname, fields in collection.index_information().items():
             if iname == '_id_':
                 continue
             keys = tuple(fields['key'])
@@ -272,31 +276,31 @@ class EnsureIndexCommand(base.Command):
                 else:
                     prev_indexes[iname] = keys
 
-        for iname, keys in unique_flag_drop.iteritems():
+        for iname, keys in unique_flag_drop.items():
             self._recreate_index(collection, iname, list(keys), unique=False)
-        for iname, keys in unique_flag_add.iteritems():
+        for iname, keys in unique_flag_add.items():
             self._recreate_index(collection, iname, list(keys), unique=True)
 
         # Ensure all indexes
-        for keys, idx in uindexes.iteritems():
+        for keys, idx in uindexes.items():
             base.log.info('...... ensure %s:%s', collection.name, idx)
             while True:
                 try:
                     collection.ensure_index(idx.index_spec, unique=True)
                     break
-                except DuplicateKeyError, err:
+                except DuplicateKeyError as err:
                     base.log.info('Found dupe key(%s), eliminating dupes', err)
                     self._remove_dupes(collection, idx.index_spec)
-        for keys, idx in indexes.iteritems():
+        for keys, idx in indexes.items():
             base.log.info('...... ensure %s:%s', collection.name, idx)
             collection.ensure_index(idx.index_spec, background=True)
         # Drop obsolete indexes
-        for iname, keys in prev_indexes.iteritems():
+        for iname, keys in prev_indexes.items():
             if keys not in indexes:
                 base.log.info('...... drop index %s:%s',
                               collection.name, iname)
                 collection.drop_index(iname)
-        for iname, keys in prev_uindexes.iteritems():
+        for iname, keys in prev_uindexes.items():
             if keys not in uindexes:
                 base.log.info('...... drop index %s:%s',
                               collection.name, iname)
@@ -337,7 +341,7 @@ class EnsureIndexCommand(base.Command):
 
 def build_model_inheritance_graph():
     graph = dict((m.mapped_class, ([], [])) for m in Mapper.all_mappers())
-    for cls, (parents, children) in graph.iteritems():
+    for cls, (parents, children) in graph.items():
         for b in cls.__bases__:
             if b not in graph:
                 continue

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/smtp_server.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/smtp_server.py b/Allura/allura/command/smtp_server.py
index 40008d7..7e98b88 100644
--- a/Allura/allura/command/smtp_server.py
+++ b/Allura/allura/command/smtp_server.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/taskd.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/taskd.py b/Allura/allura/command/taskd.py
index 409e701..d24eb1f 100644
--- a/Allura/allura/command/taskd.py
+++ b/Allura/allura/command/taskd.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -18,7 +22,7 @@
 import logging
 import os
 import time
-import Queue
+import queue
 from contextlib import contextmanager
 from datetime import datetime, timedelta
 import signal
@@ -32,7 +36,7 @@ from paste.deploy import loadapp
 from paste.deploy.converters import asint
 from webob import Request
 
-import base
+from . import base
 
 faulthandler.enable()
 
@@ -193,7 +197,7 @@ class TaskCommand(base.Command):
         else:
             q = dict(state=self.options.state)
         for t in M.MonQTask.query.find(q):
-            print t
+            print(t)
 
     def _retry(self):
         '''Retry tasks in an error state'''

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/command/taskd_cleanup.py
----------------------------------------------------------------------
diff --git a/Allura/allura/command/taskd_cleanup.py b/Allura/allura/command/taskd_cleanup.py
index 517917f..8d6862a 100644
--- a/Allura/allura/command/taskd_cleanup.py
+++ b/Allura/allura/command/taskd_cleanup.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -23,7 +27,7 @@ import subprocess
 from ming.orm.ormsession import ThreadLocalORMSession
 
 from allura import model as M
-import base
+from . import base
 
 
 class TaskdCleanupCommand(base.Command):

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/config/app_cfg.py
----------------------------------------------------------------------
diff --git a/Allura/allura/config/app_cfg.py b/Allura/allura/config/app_cfg.py
index b21979b..c068f60 100644
--- a/Allura/allura/config/app_cfg.py
+++ b/Allura/allura/config/app_cfg.py
@@ -30,6 +30,10 @@ convert them into boolean, for example, you should use the
     setting = asbool(global_conf.get('the_setting'))
 
 """
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 import logging
 from functools import partial
 
@@ -103,7 +107,7 @@ class ForgeConfig(AppConfig):
         jinja2_env.install_gettext_translations(pylons.i18n)
         jinja2_env.filters['filesizeformat'] = helpers.do_filesizeformat
         jinja2_env.filters['datetimeformat'] = helpers.datetimeformat
-        jinja2_env.filters['filter'] = lambda s,t=None: filter(t and jinja2_env.tests[t], s)
+        jinja2_env.filters['filter'] = lambda s,t=None: list(filter(t and jinja2_env.tests[t], s))
         jinja2_env.filters['map'] = helpers.map_jinja_filter
         jinja2_env.filters['nl2br'] = helpers.nl2br_jinja_filter
         jinja2_env.globals.update({'hasattr': hasattr})
@@ -123,7 +127,7 @@ class JinjaEngine(ew.TemplateEngine):
         try:
             return self._environ.get_template(template_name)
         except jinja2.TemplateNotFound:
-            raise ew.errors.TemplateNotFound, '%s not found' % template_name
+            raise ew.errors.TemplateNotFound('%s not found' % template_name)
 
     def parse(self, template_text, filepath=None):
         return self._environ.from_string(template_text)

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/config/environment.py
----------------------------------------------------------------------
diff --git a/Allura/allura/config/environment.py b/Allura/allura/config/environment.py
index 35676fd..445303a 100644
--- a/Allura/allura/config/environment.py
+++ b/Allura/allura/config/environment.py
@@ -18,6 +18,10 @@
 #       under the License.
 
 """WSGI environment setup for allura."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 
 import pylons.middleware
 import tg

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/config/middleware.py
----------------------------------------------------------------------
diff --git a/Allura/allura/config/middleware.py b/Allura/allura/config/middleware.py
index 840a39c..1e7964d 100644
--- a/Allura/allura/config/middleware.py
+++ b/Allura/allura/config/middleware.py
@@ -18,6 +18,10 @@
 #       under the License.
 
 """WSGI middleware initialization for the allura application."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 import mimetypes
 
 import pylons.middleware
@@ -121,9 +125,9 @@ def _make_core_app(root, global_conf, full_stack=True, **app_conf):
         try:
             import zmq
         except ImportError:
-            raise ImportError, "Unable to import the zmq library. Please"\
+            raise ImportError("Unable to import the zmq library. Please"\
                                " check that zeromq is installed or comment out"\
-                               " the zarkov.host setting in your ini file."
+                               " the zarkov.host setting in your ini file.")
 
     app = tg.TGApp()
 
@@ -207,7 +211,7 @@ def get_tg_vars(context):
     import pylons
     import tg
     from allura.lib import helpers as h
-    from urllib import quote, quote_plus
+    from urllib.parse import quote, quote_plus
     context.setdefault('g', pylons.app_globals)
     context.setdefault('c', pylons.tmpl_context)
     context.setdefault('h', h)

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/config/resources.py
----------------------------------------------------------------------
diff --git a/Allura/allura/config/resources.py b/Allura/allura/config/resources.py
index e8717fe..e24ad0d 100644
--- a/Allura/allura/config/resources.py
+++ b/Allura/allura/config/resources.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/__init__.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/__init__.py b/Allura/allura/controllers/__init__.py
index a69bafb..9a50246 100644
--- a/Allura/allura/controllers/__init__.py
+++ b/Allura/allura/controllers/__init__.py
@@ -18,6 +18,10 @@
 #       under the License.
 
 """Controllers for the allura application."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 from .discuss import DiscussionController, AppDiscussionController, ThreadController, PostController, ModerationController
 from .discuss import AppDiscussionRestController
 from .base import BaseController, DispatchIndex

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/attachments.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/attachments.py b/Allura/allura/controllers/attachments.py
index da25767..0a6db4d 100644
--- a/Allura/allura/controllers/attachments.py
+++ b/Allura/allura/controllers/attachments.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -15,7 +19,7 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from urllib import unquote
+from urllib.parse import unquote
 from webob import exc
 
 from tg import expose, request, redirect
@@ -88,8 +92,6 @@ class AttachmentController(BaseController):
         if request.method == 'POST':
             self.handle_post(delete, **kw)
             redirect(request.referer)
-        if self.artifact.deleted:
-            raise exc.HTTPNotFound
         embed = False
         if self.attachment.content_type and self.attachment.content_type.startswith('image/'):
             embed = True
@@ -97,6 +99,4 @@ class AttachmentController(BaseController):
 
     @expose()
     def thumb(self):
-        if self.artifact.deleted:
-            raise exc.HTTPNotFound
         return self.thumbnail.serve(embed=True)

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/auth.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/auth.py b/Allura/allura/controllers/auth.py
index f4f03c9..0e95e09 100644
--- a/Allura/allura/controllers/auth.py
+++ b/Allura/allura/controllers/auth.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -28,7 +32,7 @@ from pylons import tmpl_context as c, app_globals as g
 from pylons import request, response
 from webob import exc as wexc
 from paste.deploy.converters import asbool
-from urlparse import urlparse, urljoin
+from urllib.parse import urlparse, urljoin
 
 import allura.tasks.repo_tasks
 from allura import model as M
@@ -250,7 +254,7 @@ class AuthController(BaseController):
     def send_verification_link(self, a):
         addr = M.EmailAddress.get(email=a, claimed_by_user_id=c.user._id)
         confirmed_emails = M.EmailAddress.find(dict(email=a, confirmed=True)).all()
-        confirmed_emails = filter(lambda item: item != addr, confirmed_emails)
+        confirmed_emails = [item for item in confirmed_emails if item != addr]
 
         if addr:
             if any(email.confirmed for email in confirmed_emails):
@@ -264,7 +268,7 @@ class AuthController(BaseController):
 
     def _verify_addr(self, addr):
         confirmed_by_other = M.EmailAddress.find(dict(email=addr.email, confirmed=True)).all() if addr else []
-        confirmed_by_other = filter(lambda item: item != addr, confirmed_by_other)
+        confirmed_by_other = [item for item in confirmed_by_other if item != addr]
 
         if addr and not confirmed_by_other:
             addr.confirmed = True
@@ -505,7 +509,7 @@ class PreferencesController(BaseController):
                     user.email_addresses.append(em.email)
                     em.claimed_by_user_id = user._id
 
-                    confirmed_emails = filter(lambda email: email.confirmed, claimed_emails)
+                    confirmed_emails = [email for email in claimed_emails if email.confirmed]
                     if not confirmed_emails:
                         if not admin:
                             em.send_verification_link()
@@ -558,7 +562,7 @@ class PreferencesController(BaseController):
             c.user.set_pref('display_name', preferences['display_name'])
             if old != preferences['display_name']:
                 h.auditlog_user('Display Name changed %s => %s', old, preferences['display_name'])
-            for k, v in preferences.iteritems():
+            for k, v in preferences.items():
                 if k == 'results_per_page':
                     v = int(v)
                 c.user.set_pref(k, v)
@@ -588,7 +592,7 @@ class PreferencesController(BaseController):
         ap = plugin.AuthenticationProvider.get(request)
         try:
             ap.upload_sshkey(c.user.username, key)
-        except AssertionError, ae:
+        except AssertionError as ae:
             flash('Error uploading key: %s' % ae, 'error')
         flash('Key uploaded')
         redirect('.')
@@ -890,14 +894,14 @@ class SubscriptionsController(BaseController):
 
         # Dictionary containing all tools (subscribed and un-subscribed).
         my_tools = M.AppConfig.query.find(dict(
-            project_id={'$in': my_projects.keys()}))
+            project_id={'$in': list(my_projects.keys())}))
 
         # Dictionary containing all the currently subscribed tools for a given user.
         my_tools_subscriptions = dict(
             (mb.app_config_id, mb) for mb in M.Mailbox.query.find(dict(
                 user_id=c.user._id,
-                project_id={'$in': projects.keys()},
-                app_config_id={'$in': app_index.keys()},
+                project_id={'$in': list(projects.keys())},
+                app_config_id={'$in': list(app_index.keys())},
                 artifact_index_id=None)))
 
         # Add the remaining tools that are eligible for subscription.

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/base.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/base.py b/Allura/allura/controllers/base.py
index 215b19d..524d586 100644
--- a/Allura/allura/controllers/base.py
+++ b/Allura/allura/controllers/base.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -26,7 +30,7 @@ class BaseController(object):
     def _lookup(self, name=None, *remainder):
         """Provide explicit default lookup to avoid dispatching backtracking
         and possible loops."""
-        raise exc.HTTPNotFound, name
+        raise exc.HTTPNotFound(name)
 
 
 class DispatchIndex(object):

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/basetest_project_root.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/basetest_project_root.py b/Allura/allura/controllers/basetest_project_root.py
index f655437..b99018d 100644
--- a/Allura/allura/controllers/basetest_project_root.py
+++ b/Allura/allura/controllers/basetest_project_root.py
@@ -18,8 +18,12 @@
 #       under the License.
 
 """Main Controller"""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 import logging
-from urllib import unquote
+from urllib.parse import unquote
 
 from pylons import tmpl_context as c
 from pylons import request
@@ -94,7 +98,7 @@ class BasetestProjectRootController(WsgiDispatchController, ProjectController):
     @expose()
     def _lookup(self, name, *remainder):
         if not h.re_project_name.match(name):
-            raise exc.HTTPNotFound, name
+            raise exc.HTTPNotFound(name)
         subproject = M.Project.query.get(
             shortname=c.project.shortname + '/' + name,
             neighborhood_id=self.p_nbhd._id)
@@ -111,10 +115,10 @@ class BasetestProjectRootController(WsgiDispatchController, ProjectController):
             try:
                 c.project.install_app(ep_name, name)
             except KeyError:
-                raise exc.HTTPNotFound, name
+                raise exc.HTTPNotFound(name)
             app = c.project.app_instance(name)
             if app is None:
-                raise exc.HTTPNotFound, name
+                raise exc.HTTPNotFound(name)
         c.app = app
         return app.root, remainder
 

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/discuss.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/discuss.py b/Allura/allura/controllers/discuss.py
index 568ca5a..ad08400 100644
--- a/Allura/allura/controllers/discuss.py
+++ b/Allura/allura/controllers/discuss.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information
@@ -15,7 +19,7 @@
 #       specific language governing permissions and limitations
 #       under the License.
 
-from urllib import unquote
+from urllib.parse import unquote
 from datetime import datetime
 import logging
 
@@ -27,7 +31,7 @@ from ming.base import Object
 from ming.utils import LazyProperty
 
 from allura import model as M
-from base import BaseController
+from .base import BaseController
 from allura.lib import utils
 from allura.lib import helpers as h
 from allura.lib.decorators import require_post
@@ -133,8 +137,7 @@ class AppDiscussionController(DiscussionController):
             app_config_id=c.app.config._id)
 
 
-class ThreadsController(BaseController):
-    __metaclass__ = h.ProxiedAttrMeta
+class ThreadsController(BaseController, metaclass=h.ProxiedAttrMeta):
     M = h.attrproxy('_discussion_controller', 'M')
     W = h.attrproxy('_discussion_controller', 'W')
     ThreadController = h.attrproxy(
@@ -155,8 +158,7 @@ class ThreadsController(BaseController):
             raise exc.HTTPNotFound()
 
 
-class ThreadController(BaseController, FeedController):
-    __metaclass__ = h.ProxiedAttrMeta
+class ThreadController(BaseController, FeedController, metaclass=h.ProxiedAttrMeta):
     M = h.attrproxy('_discussion_controller', 'M')
     W = h.attrproxy('_discussion_controller', 'W')
     ThreadController = h.attrproxy(
@@ -253,8 +255,7 @@ class ThreadController(BaseController, FeedController):
             self.thread.url())
 
 
-class PostController(BaseController):
-    __metaclass__ = h.ProxiedAttrMeta
+class PostController(BaseController, metaclass=h.ProxiedAttrMeta):
     M = h.attrproxy('_discussion_controller', 'M')
     W = h.attrproxy('_discussion_controller', 'W')
     ThreadController = h.attrproxy(
@@ -292,7 +293,7 @@ class PostController(BaseController):
             post_fields = self.W.edit_post.to_python(kw, None)
             file_info = post_fields.pop('file_info', None)
             self.post.add_multiple_attachments(file_info)
-            for k, v in post_fields.iteritems():
+            for k, v in post_fields.items():
                 try:
                     setattr(self.post, k, v)
                 except AttributeError:
@@ -307,8 +308,6 @@ class PostController(BaseController):
                                        tags=['comment'])
             redirect(request.referer)
         elif request.method == 'GET':
-            if self.post.deleted:
-                raise exc.HTTPNotFound
             if version is not None:
                 HC = self.post.__mongometa__.history_class
                 ss = HC.query.find(
@@ -359,7 +358,7 @@ class PostController(BaseController):
             self.post.spam()
         elif kw.pop('approve', None):
             if self.post.status != 'ok':
-                self.post.approve(notify=False)
+                self.post.status = 'ok'
                 g.spam_checker.submit_ham(
                     self.post.text, artifact=self.post, user=c.user)
                 self.post.thread.post_to_feed(self.post)
@@ -402,8 +401,7 @@ class DiscussionAttachmentsController(AttachmentsController):
     AttachmentControllerClass = DiscussionAttachmentController
 
 
-class ModerationController(BaseController):
-    __metaclass__ = h.ProxiedAttrMeta
+class ModerationController(BaseController, metaclass=h.ProxiedAttrMeta):
     PostModel = M.Post
     M = h.attrproxy('_discussion_controller', 'M')
     W = h.attrproxy('_discussion_controller', 'W')
@@ -435,8 +433,7 @@ class ModerationController(BaseController):
         c.post_filter = WidgetConfig.post_filter
         c.moderate_posts = WidgetConfig.moderate_posts
         query = dict(
-            discussion_id=self.discussion._id,
-            deleted=False)
+            discussion_id=self.discussion._id)
         if status != '-':
             query['status'] = status
         if flag:

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/error.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/error.py b/Allura/allura/controllers/error.py
index 682b46d..86b1ea4 100644
--- a/Allura/allura/controllers/error.py
+++ b/Allura/allura/controllers/error.py
@@ -18,6 +18,10 @@
 #       under the License.
 
 """Error controller"""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 
 from tg import request, expose
 

http://git-wip-us.apache.org/repos/asf/allura/blob/d52f8e2a/Allura/allura/controllers/feed.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/feed.py b/Allura/allura/controllers/feed.py
index 7aaa789..408b875 100644
--- a/Allura/allura/controllers/feed.py
+++ b/Allura/allura/controllers/feed.py
@@ -1,3 +1,7 @@
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+from __future__ import unicode_literals
 #       Licensed to the Apache Software Foundation (ASF) under one
 #       or more contributor license agreements.  See the NOTICE file
 #       distributed with this work for additional information