Browse Source

HUE-3287 [core] Django 1.11 upgrade
- To upgrade Django 1.10, following changes are needed:

- django.conf.urls.patterns are deprecated.
- fixing django.core.urlresolvers
- Adding name argument in "urls.py"
- static file processing.
- Fixing Django Template context processor.
- Fixing name property in reverse url access
- Renaming password_policy to hue_password_policy
- Renaming get_password_validators to hue_get_password_validators
- Adding debug messages for app based urls.py
- Adding reverse url fix
- upgrading devtools to latest version
- Adding astroid[1.5.3] python module to devtools
- fixing enum issue for latest Enum python package
- fixing django management commands, test_runners and test_windmill

Prakash Ranade 8 years ago
parent
commit
a7122cb0ed
100 changed files with 714 additions and 661 deletions
  1. 4 4
      apps/about/src/about/templates/admin_wizard.mako
  2. 1 1
      apps/about/src/about/tests.py
  3. 7 6
      apps/about/src/about/urls.py
  4. 1 1
      apps/beeswax/src/beeswax/api.py
  5. 1 1
      apps/beeswax/src/beeswax/create_database.py
  6. 1 1
      apps/beeswax/src/beeswax/create_table.py
  7. 16 11
      apps/beeswax/src/beeswax/models.py
  8. 1 1
      apps/beeswax/src/beeswax/server/dbms.py
  9. 1 1
      apps/beeswax/src/beeswax/test_base.py
  10. 1 1
      apps/beeswax/src/beeswax/tests.py
  11. 77 77
      apps/beeswax/src/beeswax/urls.py
  12. 1 1
      apps/beeswax/src/beeswax/views.py
  13. 33 32
      apps/filebrowser/src/filebrowser/urls.py
  14. 1 1
      apps/filebrowser/src/filebrowser/views.py
  15. 1 1
      apps/filebrowser/src/filebrowser/views_test.py
  16. 1 1
      apps/hbase/src/hbase/tests.py
  17. 7 6
      apps/hbase/src/hbase/urls.py
  18. 6 5
      apps/help/src/help/urls.py
  19. 1 1
      apps/impala/src/impala/tests.py
  20. 8 8
      apps/impala/src/impala/urls.py
  21. 4 1
      apps/jobbrowser/src/jobbrowser/models.py
  22. 1 1
      apps/jobbrowser/src/jobbrowser/tests.py
  23. 38 36
      apps/jobbrowser/src/jobbrowser/urls.py
  24. 1 1
      apps/jobbrowser/src/jobbrowser/views.py
  25. 1 1
      apps/jobsub/src/jobsub/tests.py
  26. 13 14
      apps/jobsub/src/jobsub/urls.py
  27. 1 1
      apps/metastore/src/metastore/tests.py
  28. 22 21
      apps/metastore/src/metastore/urls.py
  29. 1 1
      apps/metastore/src/metastore/views.py
  30. 2 2
      apps/oozie/src/oozie/management/commands/oozie_setup.py
  31. 1 1
      apps/oozie/src/oozie/models.py
  32. 1 1
      apps/oozie/src/oozie/models2.py
  33. 1 1
      apps/oozie/src/oozie/models2_tests.py
  34. 1 1
      apps/oozie/src/oozie/tests.py
  35. 129 130
      apps/oozie/src/oozie/urls.py
  36. 1 1
      apps/oozie/src/oozie/views/dashboard.py
  37. 1 1
      apps/oozie/src/oozie/views/editor.py
  38. 1 1
      apps/oozie/src/oozie/views/editor2.py
  39. 1 1
      apps/pig/src/pig/api.py
  40. 2 2
      apps/pig/src/pig/management/commands/pig_setup.py
  41. 1 1
      apps/pig/src/pig/models.py
  42. 1 1
      apps/pig/src/pig/tests.py
  43. 15 14
      apps/pig/src/pig/urls.py
  44. 1 1
      apps/pig/src/pig/views.py
  45. 5 4
      apps/proxy/src/proxy/urls.py
  46. 1 1
      apps/rdbms/src/rdbms/tests.py
  47. 36 33
      apps/rdbms/src/rdbms/urls.py
  48. 1 1
      apps/rdbms/src/rdbms/views.py
  49. 2 2
      apps/search/src/search/management/commands/search_setup.py
  50. 1 1
      apps/search/src/search/models.py
  51. 1 1
      apps/search/src/search/tests.py
  52. 36 33
      apps/search/src/search/urls.py
  53. 1 1
      apps/security/src/security/api/test_hive.py
  54. 1 1
      apps/security/src/security/tests.py
  55. 52 49
      apps/security/src/security/urls.py
  56. 1 1
      apps/spark/src/spark/urls.py
  57. 1 1
      apps/sqoop/src/sqoop/templates/app.mako
  58. 2 2
      apps/sqoop/src/sqoop/tests.py
  59. 26 24
      apps/sqoop/src/sqoop/urls.py
  60. 3 3
      apps/useradmin/src/useradmin/forms.py
  61. 1 1
      apps/useradmin/src/useradmin/hue_password_policy.py
  62. 3 1
      apps/useradmin/src/useradmin/models.py
  63. 1 1
      apps/useradmin/src/useradmin/templates/change_password.mako
  64. 1 1
      apps/useradmin/src/useradmin/templates/edit_user.mako
  65. 1 1
      apps/useradmin/src/useradmin/test_ldap.py
  66. 1 1
      apps/useradmin/src/useradmin/test_ldap_deprecated.py
  67. 2 2
      apps/useradmin/src/useradmin/tests.py
  68. 23 22
      apps/useradmin/src/useradmin/urls.py
  69. 2 2
      apps/useradmin/src/useradmin/views.py
  70. 12 12
      apps/zookeeper/src/zookeeper/urls.py
  71. 1 1
      apps/zookeeper/src/zookeeper/views.py
  72. 28 5
      desktop/core/ext-py/Django-1.10/django/template/context.py
  73. 2 2
      desktop/core/ext-py/django-axes-2.2.0/axes/tests.py
  74. 1 1
      desktop/core/ext-py/django-extensions-1.8.0/django_extensions/admin/widgets.py
  75. 1 1
      desktop/core/ext-py/django-extensions-1.8.0/django_extensions/management/commands/show_urls.py
  76. 2 2
      desktop/core/ext-py/django-openid-auth-0.5/django_openid_auth/management/commands/openid_cleanup.py
  77. 1 1
      desktop/core/ext-py/django-openid-auth-0.5/django_openid_auth/views.py
  78. 1 1
      desktop/core/ext-py/djangomako-1.0.1/djangomako/backends.py
  79. 1 1
      desktop/core/ext-py/python-openid-2.2.5/examples/djopenid/util.py
  80. 4 4
      desktop/core/src/desktop/app_template/src/app_name/urls.py
  81. 5 4
      desktop/core/src/desktop/app_template_proxy/src/app_name/urls.py
  82. 2 2
      desktop/core/src/desktop/auth/forms.py
  83. 1 1
      desktop/core/src/desktop/auth/views.py
  84. 1 1
      desktop/core/src/desktop/lib/django_mako.py
  85. 2 1
      desktop/core/src/desktop/lib/django_util.py
  86. 2 2
      desktop/core/src/desktop/lib/tasks/compress_files/compress_utils.py
  87. 1 1
      desktop/core/src/desktop/lib/tasks/extract_archive/extract_utils.py
  88. 3 3
      desktop/core/src/desktop/lib/test_runners.py
  89. 2 2
      desktop/core/src/desktop/management/commands/config_dump.py
  90. 2 2
      desktop/core/src/desktop/management/commands/config_help.py
  91. 2 2
      desktop/core/src/desktop/management/commands/convert_documents.py
  92. 3 3
      desktop/core/src/desktop/management/commands/create_test_fs.py
  93. 2 2
      desktop/core/src/desktop/management/commands/generate_mdl.py
  94. 2 2
      desktop/core/src/desktop/management/commands/is_db_alive.py
  95. 2 2
      desktop/core/src/desktop/management/commands/kt_renewer.py
  96. 2 2
      desktop/core/src/desktop/management/commands/ldaptest.py
  97. 2 2
      desktop/core/src/desktop/management/commands/sync_documents.py
  98. 5 6
      desktop/core/src/desktop/management/commands/test_windmill.py
  99. 2 2
      desktop/core/src/desktop/management/commands/version.py
  100. 1 1
      desktop/core/src/desktop/middleware.py

+ 4 - 4
apps/about/src/about/templates/admin_wizard.mako

@@ -15,7 +15,7 @@
 ## limitations under the License.
 
 <%!
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.encoding import smart_unicode
 from django.utils.translation import ugettext as _
 
@@ -190,7 +190,7 @@ ${ layout.menubar(section='quick_start') }
                 <i class="fa fa-home"></i> ${ _('Landing page') }
               </a>
               % else:
-                <a href="${ url('desktop.views.home2') }">
+                <a href="${ url('desktop_views_home2') }">
                   <i class="fa fa-home"></i> ${ _('Home') }
                 </a>
               % endif
@@ -227,7 +227,7 @@ ${ layout.menubar(section='quick_start') }
           <span class="muted">${ _('Hue and the Hue logo are trademarks of Cloudera, Inc.') }</span>
           % if not user.is_authenticated():
             <br/>
-            <a href="${ url('desktop.views.home2') }" class="btn btn-primary" style="margin-top: 50px;margin-bottom: 20px"><i class="fa fa-sign-in"></i> ${ _('Sign in now!') }</a>
+            <a href="${ url('desktop_views_home2') }" class="btn btn-primary" style="margin-top: 50px;margin-bottom: 20px"><i class="fa fa-sign-in"></i> ${ _('Sign in now!') }</a>
           % endif
         </p>
        </div>
@@ -378,7 +378,7 @@ $(document).ready(function(){
   });
 
   $("#doneBtn").click(function () {
-    location.href = "${ is_embeddable and '/' or url('desktop.views.home2') }";
+    location.href = "${ is_embeddable and '/' or url('desktop_views_home2') }";
   });
 
   $(".updatePreferences").click(function () {

+ 1 - 1
apps/about/src/about/tests.py

@@ -18,7 +18,7 @@
 import json
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from nose.tools import assert_true, assert_false, assert_equal
 

+ 7 - 6
apps/about/src/about/urls.py

@@ -15,11 +15,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from about import views as about_views
 
-urlpatterns = patterns('about.views',
-  url(r'^$', 'admin_wizard', name='index'),
-  url(r'^admin_wizard$', 'admin_wizard', name='admin_wizard'),
+urlpatterns = [
+  url(r'^$', about_views.admin_wizard, name='index'),
+  url(r'^admin_wizard$', about_views.admin_wizard, name='admin_wizard'),
 
-  url(r'^update_preferences$', 'update_preferences', name='update_preferences'),
-)
+  url(r'^update_preferences$', about_views.update_preferences, name='update_preferences'),
+]

+ 1 - 1
apps/beeswax/src/beeswax/api.py

@@ -20,7 +20,7 @@ import json
 import re
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.http import Http404
 from django.utils.translation import ugettext as _
 from django.views.decorators.http import require_POST

+ 1 - 1
apps/beeswax/src/beeswax/create_database.py

@@ -21,7 +21,7 @@ Views & controls for creating tables
 
 import logging
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from desktop.lib import django_mako
 from desktop.lib.django_util import render

+ 1 - 1
apps/beeswax/src/beeswax/create_table.py

@@ -22,7 +22,7 @@ import json
 import logging
 import re
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.http import QueryDict
 from django.utils.translation import ugettext as _
 

+ 16 - 11
apps/beeswax/src/beeswax/models.py

@@ -23,7 +23,7 @@ import json
 from django.db import models
 from django.contrib.auth.models import User
 from django.contrib.contenttypes.fields import GenericRelation
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _, ugettext_lazy as _t
 
 from enum import Enum
@@ -49,12 +49,17 @@ BEESWAX = 'beeswax'
 HIVE_SERVER2 = 'hiveserver2'
 QUERY_TYPES = (HQL, IMPALA, RDBMS, SPARK) = range(4)
 
-
 class QueryHistory(models.Model):
   """
   Holds metadata about all queries that have been executed.
   """
-  STATE = Enum('submitted', 'running', 'available', 'failed', 'expired')
+  class STATE(Enum):
+    submitted=0
+    running=1
+    available=2
+    failed=3
+    expired=4
+
   SERVER_TYPE = ((BEESWAX, 'Beeswax'), (HIVE_SERVER2, 'Hive Server 2'),
                  (librdbms_dbms.MYSQL, 'MySQL'), (librdbms_dbms.POSTGRESQL, 'PostgreSQL'),
                  (librdbms_dbms.SQLITE, 'sqlite'), (librdbms_dbms.ORACLE, 'oracle'))
@@ -149,28 +154,28 @@ class QueryHistory(models.Model):
       return is_statement_finished
 
   def is_running(self):
-    return self.last_state in (QueryHistory.STATE.running.index, QueryHistory.STATE.submitted.index)
+    return self.last_state in (QueryHistory.STATE.running.value, QueryHistory.STATE.submitted.value)
 
   def is_success(self):
-    return self.last_state in (QueryHistory.STATE.available.index,)
+    return self.last_state in (QueryHistory.STATE.available.value,)
 
   def is_failure(self):
-    return self.last_state in (QueryHistory.STATE.expired.index, QueryHistory.STATE.failed.index)
+    return self.last_state in (QueryHistory.STATE.expired.value, QueryHistory.STATE.failed.value)
 
   def is_expired(self):
-    return self.last_state in (QueryHistory.STATE.expired.index,)
+    return self.last_state in (QueryHistory.STATE.expired.value,)
 
   def set_to_running(self):
-    self.last_state = QueryHistory.STATE.running.index
+    self.last_state = QueryHistory.STATE.running.value
 
   def set_to_failed(self):
-    self.last_state = QueryHistory.STATE.failed.index
+    self.last_state = QueryHistory.STATE.failed.value
 
   def set_to_available(self):
-    self.last_state = QueryHistory.STATE.available.index
+    self.last_state = QueryHistory.STATE.available.value
 
   def set_to_expired(self):
-    self.last_state = QueryHistory.STATE.expired.index
+    self.last_state = QueryHistory.STATE.expired.value
 
   def save(self, *args, **kwargs):
     """

+ 1 - 1
apps/beeswax/src/beeswax/server/dbms.py

@@ -20,7 +20,7 @@ import re
 import threading
 import time
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.encoding import force_unicode
 from django.utils.translation import ugettext as _
 

+ 1 - 1
apps/beeswax/src/beeswax/test_base.py

@@ -26,7 +26,7 @@ import threading
 import time
 
 from nose.tools import assert_true, assert_false
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.contrib.auth.models import User
 
 from desktop.lib.django_test_util import make_logged_in_client

+ 1 - 1
apps/beeswax/src/beeswax/tests.py

@@ -37,7 +37,7 @@ from nose.plugins.skip import SkipTest
 from django.utils.encoding import smart_str
 from django.utils.html import escape
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db import transaction
 
 from desktop.lib.exceptions_renderable import PopupException

+ 77 - 77
apps/beeswax/src/beeswax/urls.py

@@ -15,82 +15,82 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
-
-
-urlpatterns = patterns('beeswax.views',
-  url(r'^$', 'index', name='index'),
-
-  url(r'^execute/?$', 'execute_query', name='execute_query'),
-  url(r'^execute/design/(?P<design_id>\d+)$', 'execute_query', name='execute_design'),
-  url(r'^execute/query/(?P<query_history_id>\d+)$', 'execute_query', name='watch_query_history'),
-  url(r'^results/(?P<id>\d+)/(?P<first_row>\d+)$', 'view_results', name='view_results'),
-  url(r'^download/(?P<id>\d+)/(?P<format>\w+)$', 'download', name='download'),
-
-  url(r'^my_queries$', 'my_queries', name='my_queries'),
-  url(r'^list_designs$', 'list_designs', name='list_designs'),
-  url(r'^list_trashed_designs$', 'list_trashed_designs', name='list_trashed_designs'),
-  url(r'^delete_designs$', 'delete_design', name='delete_design'),
-  url(r'^restore_designs$', 'restore_design', name='restore_design'),
-  url(r'^clone_design/(?P<design_id>\d+)$', 'clone_design', name='clone_design'),
-  url(r'^query_history$', 'list_query_history', name='list_query_history'),
-
-  url(r'^configuration/?$', 'configuration', name='configuration'),
-  url(r'^install_examples$', 'install_examples', name='install_examples'),
-  url(r'^query_cb/done/(?P<server_id>\S+)$', 'query_done_cb', name='query_done_cb'),
-)
-
-urlpatterns += patterns(
-  'beeswax.create_database',
-
-  url(r'^create/database$', 'create_database', name='create_database'),
-)
-
-urlpatterns += patterns(
-  'beeswax.create_table',
-
-  url(r'^create/create_table/(?P<database>\w+)$', 'create_table', name='create_table'),
-  url(r'^create/import_wizard/(?P<database>\w+)$', 'import_wizard', name='import_wizard'),
-  url(r'^create/auto_load/(?P<database>\w+)$', 'load_after_create', name='load_after_create'),
-)
-
-urlpatterns += patterns(
-  'beeswax.api',
-
-  url(r'^api/session/?$', 'get_session', name='api_get_session'),
-  url(r'^api/session/(?P<session_id>\d+)/?$', 'get_session', name='api_get_session'),
-  url(r'^api/session/(?P<session_id>\d+)/close/?$', 'close_session', name='api_close_session'),
-  url(r'^api/settings/?$', 'get_settings', name='get_settings'),
-  url(r'^api/functions/?$', 'get_functions', name='get_functions'),
+from django.conf.urls import url
+from beeswax import views as beeswax_views
+from beeswax import create_database as beeswax_create_database
+from beeswax import create_table as beeswax_create_table
+from beeswax import api as beeswax_api
+
+urlpatterns = [
+  url(r'^$', beeswax_views.index, name='index'),
+
+  url(r'^execute/?$', beeswax_views.execute_query, name='execute_query'),
+  url(r'^execute/design/(?P<design_id>\d+)$', beeswax_views.execute_query, name='execute_design'),
+  url(r'^execute/query/(?P<query_history_id>\d+)$', beeswax_views.execute_query, name='watch_query_history'),
+  url(r'^results/(?P<id>\d+)/(?P<first_row>\d+)$', beeswax_views.view_results, name='view_results'),
+  url(r'^download/(?P<id>\d+)/(?P<format>\w+)$', beeswax_views.download, name='download'),
+
+  url(r'^my_queries$', beeswax_views.my_queries, name='my_queries'),
+  url(r'^list_designs$', beeswax_views.list_designs, name='list_designs'),
+  url(r'^list_trashed_designs$', beeswax_views.list_trashed_designs, name='list_trashed_designs'),
+  url(r'^delete_designs$', beeswax_views.delete_design, name='delete_design'),
+  url(r'^restore_designs$', beeswax_views.restore_design, name='restore_design'),
+  url(r'^clone_design/(?P<design_id>\d+)$', beeswax_views.clone_design, name='clone_design'),
+  url(r'^query_history$', beeswax_views.list_query_history, name='list_query_history'),
+
+  url(r'^configuration/?$', beeswax_views.configuration, name='configuration'),
+  url(r'^install_examples$', beeswax_views.install_examples, name='install_examples'),
+  url(r'^query_cb/done/(?P<server_id>\S+)$', beeswax_views.query_done_cb, name='query_done_cb'),
+]
+
+urlpatterns += [
+
+  url(r'^create/database$', beeswax_create_database.create_database, name='create_database'),
+]
+
+urlpatterns += [
+
+  url(r'^create/create_table/(?P<database>\w+)$', beeswax_create_table.create_table, name='create_table'),
+  url(r'^create/import_wizard/(?P<database>\w+)$', beeswax_create_table.import_wizard, name='import_wizard'),
+  url(r'^create/auto_load/(?P<database>\w+)$', beeswax_create_table.load_after_create, name='load_after_create'),
+]
+
+urlpatterns += [
+
+  url(r'^api/session/?$', beeswax_api.get_session, name='api_get_session'),
+  url(r'^api/session/(?P<session_id>\d+)/?$', beeswax_api.get_session, name='api_get_session'),
+  url(r'^api/session/(?P<session_id>\d+)/close/?$', beeswax_api.close_session, name='api_close_session'),
+  url(r'^api/settings/?$', beeswax_api.get_settings, name='get_settings'),
+  url(r'^api/functions/?$', beeswax_api.get_functions, name='get_functions'),
 
   # Deprecated by Notebook API
-  url(r'^api/autocomplete/?$', 'autocomplete', name='api_autocomplete_databases'),
-  url(r'^api/autocomplete/(?P<database>\w+)/?$', 'autocomplete', name='api_autocomplete_tables'),
-  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/?$', 'autocomplete', name='api_autocomplete_columns'),
-  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/?$', 'autocomplete', name='api_autocomplete_column'),
-  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/(?P<nested>.+)/?$', 'autocomplete', name='api_autocomplete_nested'),
-
-  url(r'^api/design/(?P<design_id>\d+)?$', 'save_query_design', name='api_save_design'),
-  url(r'^api/design/(?P<design_id>\d+)/get$', 'fetch_saved_design', name='api_fetch_saved_design'),
-
-  url(r'^api/query/(?P<query_history_id>\d+)/get$', 'fetch_query_history', name='api_fetch_query_history'),
-  url(r'^api/query/parameters$', 'parameters', name='api_parameters'),
-  url(r'^api/query/execute/(?P<design_id>\d+)?$', 'execute', name='api_execute'),
-  url(r'^api/query/(?P<query_history_id>\d+)/cancel/?$', 'cancel_query', name='api_cancel_query'),
-  url(r'^api/query/(?P<query_history_id>\d+)/close/?$', 'close_operation', name='api_close_operation'),
-  url(r'^api/query/(?P<query_history_id>\d+)/results/save/hive/table/?$', 'save_results_hive_table', name='api_save_results_hive_table'),
-  url(r'^api/query/(?P<query_history_id>\d+)/results/save/hdfs/file/?$', 'save_results_hdfs_file', name='api_save_results_hdfs_file'),
-  url(r'^api/query/(?P<query_history_id>\d+)/results/save/hdfs/directory/?$', 'save_results_hdfs_directory', name='api_save_results_hdfs_directory'),
-  url(r'^api/watch/json/(?P<id>\d+)/?$', 'watch_query_refresh_json', name='api_watch_query_refresh_json'),
-
-  url(r'^api/query/clear_history/?$', 'clear_history', name='clear_history'),
-
-  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/?$', 'describe_table', name='describe_table'),
-  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/indexes/?$', 'get_indexes', name='get_indexes'),
-  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/sample/?$', 'get_sample_data', name='get_sample_data'),
-  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/sample/?$', 'get_sample_data', name='get_sample_data_column'),
-  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/stats/(?P<column>\w+)?$', 'get_table_stats', name='get_table_stats'),
-  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/terms/(?P<column>\w+)/(?P<prefix>\w+)?$', 'get_top_terms', name='get_top_terms'),
-
-  url(r'^api/analyze/(?P<database>\w+)/(?P<table>\w+)/(?P<columns>\w+)?$', 'analyze_table', name='analyze_table'),
-)
+  url(r'^api/autocomplete/?$', beeswax_api.autocomplete, name='api_autocomplete_databases'),
+  url(r'^api/autocomplete/(?P<database>\w+)/?$', beeswax_api.autocomplete, name='api_autocomplete_tables'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/?$', beeswax_api.autocomplete, name='api_autocomplete_columns'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/?$', beeswax_api.autocomplete, name='api_autocomplete_column'),
+  url(r'^api/autocomplete/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/(?P<nested>.+)/?$', beeswax_api.autocomplete, name='api_autocomplete_nested'),
+
+  url(r'^api/design/(?P<design_id>\d+)?$', beeswax_api.save_query_design, name='api_save_design'),
+  url(r'^api/design/(?P<design_id>\d+)/get$', beeswax_api.fetch_saved_design, name='api_fetch_saved_design'),
+
+  url(r'^api/query/(?P<query_history_id>\d+)/get$', beeswax_api.fetch_query_history, name='api_fetch_query_history'),
+  url(r'^api/query/parameters$', beeswax_api.parameters, name='api_parameters'),
+  url(r'^api/query/execute/(?P<design_id>\d+)?$', beeswax_api.execute, name='api_execute'),
+  url(r'^api/query/(?P<query_history_id>\d+)/cancel/?$', beeswax_api.cancel_query, name='api_cancel_query'),
+  url(r'^api/query/(?P<query_history_id>\d+)/close/?$', beeswax_api.close_operation, name='api_close_operation'),
+  url(r'^api/query/(?P<query_history_id>\d+)/results/save/hive/table/?$', beeswax_api.save_results_hive_table, name='api_save_results_hive_table'),
+  url(r'^api/query/(?P<query_history_id>\d+)/results/save/hdfs/file/?$', beeswax_api.save_results_hdfs_file, name='api_save_results_hdfs_file'),
+  url(r'^api/query/(?P<query_history_id>\d+)/results/save/hdfs/directory/?$', beeswax_api.save_results_hdfs_directory, name='api_save_results_hdfs_directory'),
+  url(r'^api/watch/json/(?P<id>\d+)/?$', beeswax_api.watch_query_refresh_json, name='api_watch_query_refresh_json'),
+
+  url(r'^api/query/clear_history/?$', beeswax_api.clear_history, name='clear_history'),
+
+  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/?$', beeswax_api.describe_table, name='describe_table'),
+  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/indexes/?$', beeswax_api.get_indexes, name='get_indexes'),
+  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/sample/?$', beeswax_api.get_sample_data, name='get_sample_data'),
+  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/(?P<column>\w+)/sample/?$', beeswax_api.get_sample_data, name='get_sample_data_column'),
+  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/stats/(?P<column>\w+)?$', beeswax_api.get_table_stats, name='get_table_stats'),
+  url(r'^api/table/(?P<database>\w+)/(?P<table>\w+)/terms/(?P<column>\w+)/(?P<prefix>\w+)?$', beeswax_api.get_top_terms, name='get_top_terms'),
+
+  url(r'^api/analyze/(?P<database>\w+)/(?P<table>\w+)/(?P<columns>\w+)?$', beeswax_api.analyze_table, name='analyze_table'),
+]

+ 1 - 1
apps/beeswax/src/beeswax/views.py

@@ -29,7 +29,7 @@ from django.http import HttpResponse, QueryDict
 from django.shortcuts import redirect
 from django.utils.html import escape
 from django.utils.translation import ugettext as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from desktop.appmanager import get_apps_dict
 from desktop.conf import ENABLE_DOWNLOAD, REDIRECT_WHITELIST

+ 33 - 32
apps/filebrowser/src/filebrowser/urls.py

@@ -15,44 +15,45 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import url, patterns
+from django.conf.urls import url
+from filebrowser import views as filebrowser_views
+from filebrowser import api as filebrowser_api
 
-
-urlpatterns = patterns('filebrowser.views',
+urlpatterns = [
   # Base view
-  url(r'^$', 'index', name='index'),
+  url(r'^$', filebrowser_views.index, name='index'),
 
   # Catch-all for viewing a file (display) or a directory (listdir)
-  url(r'^view=(?P<path>[\s\S.]*)$', 'view', name='view'),
+  url(r'^view=(?P<path>.*)$', filebrowser_views.view, name='filebrowser.views.view'),
 
-  url(r'^listdir=(?P<path>[\s\S.]*)$', 'listdir', name='listdir'),
-  url(r'^display=(?P<path>[\s\S.]*)$', 'display', name='display'),
-  url(r'^stat=(?P<path>[\s\S.]*)$', 'stat', name='stat'),
-  url(r'^content_summary=(?P<path>[\s\S.]*)$', 'content_summary', name='content_summary'),
-  url(r'^download=(?P<path>[\s\S.]*)$', 'download', name='download'),
-  url(r'^status$', 'status', name='status'),
-  url(r'^home_relative_view=(?P<path>[\s\S.]*)$', 'home_relative_view', name='home_relative_view'),
-  url(r'^edit=(?P<path>[\s\S.]*)$', 'edit', name='edit'),
+  url(r'^listdir=(?P<path>.*)$', filebrowser_views.listdir, name='listdir'),
+  url(r'^display=(?P<path>.*)$', filebrowser_views.display, name='display'),
+  url(r'^stat=(?P<path>.*)$', filebrowser_views.stat, name='stat'),
+  url(r'^content_summary=(?P<path>.*)$', filebrowser_views.content_summary, name='content_summary'),
+  url(r'^download=(?P<path>.*)$', filebrowser_views.download, name='filebrowser.views.download'),
+  url(r'^status$', filebrowser_views.status, name='status'),
+  url(r'^home_relative_view=(?P<path>.*)$', filebrowser_views.home_relative_view, name='home_relative_view'),
+  url(r'^edit=(?P<path>.*)$', filebrowser_views.edit, name='filebrowser_views_edit'),
 
   # POST operations
-  url(r'^save$', 'save_file'),
-  url(r'^upload/file$', 'upload_file', name='upload_file'),
-  url(r'^extract_archive', 'extract_archive_using_batch_job', name='extract_archive_using_batch_job'),
-  url(r'^compress_files', 'compress_files_using_batch_job', name='compress_files_using_batch_job'),
-  url(r'^trash/restore$', 'trash_restore', name='trash_restore'),
-  url(r'^trash/purge$', 'trash_purge', name='trash_purge'),
-  url(r'^rename$', 'rename', name='rename'),
-  url(r'^mkdir$', 'mkdir', name='mkdir'),
-  url(r'^touch$', 'touch', name='touch'),
-  url(r'^move$', 'move', name='move'),
-  url(r'^copy$', 'copy', name='copy'),
-  url(r'^set_replication$', 'set_replication', name='set_replication'),
-  url(r'^rmtree$', 'rmtree', name='rmtree'),
-  url(r'^chmod$', 'chmod', name='chmod'),
-  url(r'^chown$', 'chown', name='chown'),
-)
+  url(r'^save$', filebrowser_views.save_file, name="filebrowser_views_save_file"),
+  url(r'^upload/file$', filebrowser_views.upload_file, name='upload_file'),
+  url(r'^extract_archive', filebrowser_views.extract_archive_using_batch_job, name='extract_archive_using_batch_job'),
+  url(r'^compress_files', filebrowser_views.compress_files_using_batch_job, name='compress_files_using_batch_job'),
+  url(r'^trash/restore$', filebrowser_views.trash_restore, name='trash_restore'),
+  url(r'^trash/purge$', filebrowser_views.trash_purge, name='trash_purge'),
+  url(r'^rename$', filebrowser_views.rename, name='rename'),
+  url(r'^mkdir$', filebrowser_views.mkdir, name='mkdir'),
+  url(r'^touch$', filebrowser_views.touch, name='touch'),
+  url(r'^move$', filebrowser_views.move, name='move'),
+  url(r'^copy$', filebrowser_views.copy, name='copy'),
+  url(r'^set_replication$', filebrowser_views.set_replication, name='set_replication'),
+  url(r'^rmtree$', filebrowser_views.rmtree, name='rmtree'),
+  url(r'^chmod$', filebrowser_views.chmod, name='chmod'),
+  url(r'^chown$', filebrowser_views.chown, name='chown'),
+]
 
 # API
-urlpatterns += patterns('filebrowser.api',
-  url(r'^api/get_filesystems/?', 'get_filesystems', name='get_filesystems'),
-)
+urlpatterns += [
+  url(r'^api/get_filesystems/?', filebrowser_api.get_filesystems, name='get_filesystems'),
+]

+ 1 - 1
apps/filebrowser/src/filebrowser/views.py

@@ -35,7 +35,7 @@ from gzip import GzipFile
 
 from django.contrib.auth.models import User, Group
 from django.core.paginator import EmptyPage
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.template.defaultfilters import stringformat, filesizeformat
 from django.http import Http404, StreamingHttpResponse, HttpResponseNotModified, HttpResponseForbidden, HttpResponse
 from django.views.decorators.http import require_http_methods

+ 1 - 1
apps/filebrowser/src/filebrowser/views_test.py

@@ -27,7 +27,7 @@ from avro import schema, datafile, io
 from aws.s3.s3fs import S3FileSystemException
 from aws.s3.s3test_utils import get_test_bucket
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.encoding import smart_str
 from nose.plugins.attrib import attr
 from nose.plugins.skip import SkipTest

+ 1 - 1
apps/hbase/src/hbase/tests.py

@@ -32,7 +32,7 @@ from hbase.conf import HBASE_CONF_DIR
 from hbase.hbase_site import get_server_authentication, get_server_principal, get_conf, reset, _CNF_HBASE_IMPERSONATION_ENABLED, is_impersonation_enabled
 from hadoop.pseudo_hdfs4 import is_live_cluster
 from nose.plugins.skip import SkipTest
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 def test_security_plain():

+ 7 - 6
apps/hbase/src/hbase/urls.py

@@ -15,11 +15,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from hbase import views as hbase_views
 
-urlpatterns = patterns('hbase.views',
-  url(r'^$', 'app', name='index'),
-  url(r'api/(?P<url>.+)$', 'api_router'),
+urlpatterns = [
+  url(r'^$', hbase_views.app, name='index'),
+  url(r'api/(?P<url>.+)$', hbase_views.api_router),
 
-  url(r'^install_examples$', 'install_examples', name='install_examples'),
-)
+  url(r'^install_examples$', hbase_views.install_examples, name='install_examples'),
+]

+ 6 - 5
apps/help/src/help/urls.py

@@ -15,9 +15,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import url, patterns
+from django.conf.urls import url
+from help import views as help_views
 
-urlpatterns = patterns('',
-  url(r'^$', 'help.views.view', { "app": "desktop", "path": "/index.html" }),
-  url(r'^(?P<app>\w*)(?P<path>/.*)$', 'help.views.view', name='help.view'),
-)
+urlpatterns = [
+  url(r'^$', help_views.view, { "app": "desktop", "path": "/index.html" }),
+  url(r'^(?P<app>\w*)(?P<path>/.*)$', help_views.view, name='help.view'),
+]

+ 1 - 1
apps/impala/src/impala/tests.py

@@ -23,7 +23,7 @@ from nose.plugins.skip import SkipTest
 from nose.tools import assert_true, assert_equal, assert_false
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 import desktop.conf as desktop_conf
 from desktop.lib.django_test_util import make_logged_in_client

+ 8 - 8
apps/impala/src/impala/urls.py

@@ -15,16 +15,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
 from beeswax.urls import urlpatterns as beeswax_urls
+from impala import api as impala_api
 
-
-urlpatterns = patterns('impala.api',
-  url(r'^api/invalidate$', 'invalidate', name='invalidate'),
-  url(r'^api/refresh/(?P<database>\w+)/(?P<table>\w+)$', 'refresh_table', name='refresh_table'),
-  url(r'^api/query/(?P<query_history_id>\d+)/exec_summary$', 'get_exec_summary', name='get_exec_summary'),
-  url(r'^api/query/(?P<query_history_id>\d+)/runtime_profile', 'get_runtime_profile', name='get_runtime_profile'),
-)
+urlpatterns = [
+  url(r'^api/invalidate$', impala_api.invalidate, name='invalidate'),
+  url(r'^api/refresh/(?P<database>\w+)/(?P<table>\w+)$', impala_api.refresh_table, name='refresh_table'),
+  url(r'^api/query/(?P<query_history_id>\d+)/exec_summary$', impala_api.get_exec_summary, name='get_exec_summary'),
+  url(r'^api/query/(?P<query_history_id>\d+)/runtime_profile', impala_api.get_runtime_profile, name='get_runtime_profile'),
+]
 
 urlpatterns += beeswax_urls

+ 4 - 1
apps/jobbrowser/src/jobbrowser/models.py

@@ -20,7 +20,10 @@ import logging
 import functools
 import re
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
+from desktop.conf import REST_CONN_TIMEOUT
+from desktop.lib.view_util import format_duration_in_millis
+from desktop.lib import i18n
 from django.utils.html import escape
 from django.utils.translation import ugettext as _
 

+ 1 - 1
apps/jobbrowser/src/jobbrowser/tests.py

@@ -23,7 +23,7 @@ import time
 import unittest
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from nose.plugins.skip import SkipTest
 from nose.tools import assert_true, assert_false, assert_equal, assert_raises
 

+ 38 - 36
apps/jobbrowser/src/jobbrowser/urls.py

@@ -15,49 +15,51 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
+from jobbrowser import views as jobbrowser_views
+from jobbrowser import api2 as jobbrowser_api2
 
-urlpatterns = patterns('jobbrowser.views',
+urlpatterns = [
   # "Default"
-  url(r'^$', 'jobs'),
-  url(r'^jobs/$', 'jobs', name='jobs'),
-  url(r'^jobs/(?P<job>\w+)$','single_job', name='single_job'),
-  url(r'^jobs/(?P<job>\w+)/counters$', 'job_counters', name='job_counters'),
-  url(r'^jobs/(?P<job>\w+)/kill$', 'kill_job', name='kill_job'),
-  url(r'^jobs/(?P<job>\w+)/single_logs$', 'job_single_logs', name='job_single_logs'),
-  url(r'^jobs/(?P<job>\w+)/tasks$','tasks', name='tasks'),
-  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)$', 'single_task', name='single_task'), # TODO s/single// ?
-  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)/attempts/(?P<attemptid>\w+)$', 'single_task_attempt', name='single_task_attempt'),
-  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)/attempts/(?P<attemptid>\w+)/counters$', 'task_attempt_counters', name='task_attempt_counters'),
-  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)/attempts/(?P<attemptid>\w+)/logs$', 'single_task_attempt_logs', name='single_task_attempt_logs'),
-  url(r'^jobs/(\w+)/tasks/(\w+)/attempts/(?P<attemptid>\w+)/kill$', 'kill_task_attempt', name='kill_task_attempt'),
-  url(r'^trackers/(?P<trackerid>.+)$', 'single_tracker', name='single_tracker'),
-  url(r'^container/(?P<node_manager_http_address>.+)/(?P<containerid>.+)$', 'container', name='container'),
+  url(r'^$', jobbrowser_views.jobs),
+  url(r'^jobs/$', jobbrowser_views.jobs, name='jobs'),
+  url(r'^jobs/(?P<job>\w+)$', jobbrowser_views.single_job, name='single_job'),
+  url(r'^jobs/(?P<job>\w+)/counters$', jobbrowser_views.job_counters, name='job_counters'),
+  url(r'^jobs/(?P<job>\w+)/kill$', jobbrowser_views.kill_job, name='kill_job'),
+  url(r'^jobs/(?P<job>\w+)/single_logs$', jobbrowser_views.job_single_logs, name='job_single_logs'),
+  url(r'^jobs/(?P<job>\w+)/tasks$', jobbrowser_views.tasks, name='tasks'),
+  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)$', jobbrowser_views.single_task, name='single_task'), # TODO s/single// ?
+  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)/attempts/(?P<attemptid>\w+)$', jobbrowser_views.single_task_attempt, name='single_task_attempt'),
+  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)/attempts/(?P<attemptid>\w+)/counters$', jobbrowser_views.task_attempt_counters, name='task_attempt_counters'),
+  url(r'^jobs/(?P<job>\w+)/tasks/(?P<taskid>\w+)/attempts/(?P<attemptid>\w+)/logs$', jobbrowser_views.single_task_attempt_logs, name='single_task_attempt_logs'),
+  url(r'^jobs/(\w+)/tasks/(\w+)/attempts/(?P<attemptid>\w+)/kill$', jobbrowser_views.kill_task_attempt, name='kill_task_attempt'),
+  url(r'^trackers/(?P<trackerid>.+)$', jobbrowser_views.single_tracker, name='single_tracker'),
+  url(r'^container/(?P<node_manager_http_address>.+)/(?P<containerid>.+)$', jobbrowser_views.container, name='container'),
 
   # MR2 specific
-  url(r'^jobs/(?P<job>\w+)/job_attempt_logs/(?P<attempt_index>\d+)$', 'job_attempt_logs', name='job_attempt_logs'),
-  url(r'^jobs/(?P<job>\w+)/job_attempt_logs_json/(?P<attempt_index>\d+)/(?P<name>\w+)?/(?P<offset>[\d-]+)?$', 'job_attempt_logs_json', name='job_attempt_logs_json'),
-  url(r'^jobs/(?P<jobid>\w+)/job_not_assigned/(?P<path>.+)$','job_not_assigned', name='job_not_assigned'),
+  url(r'^jobs/(?P<job>\w+)/job_attempt_logs/(?P<attempt_index>\d+)$', jobbrowser_views.job_attempt_logs, name='job_attempt_logs'),
+  url(r'^jobs/(?P<job>\w+)/job_attempt_logs_json/(?P<attempt_index>\d+)/(?P<name>\w+)?/(?P<offset>[\d-]+)?$', jobbrowser_views.job_attempt_logs_json, name='job_attempt_logs_json'),
+  url(r'^jobs/(?P<jobid>\w+)/job_not_assigned/(?P<path>.+)$', jobbrowser_views.job_not_assigned, name='job_not_assigned'),
 
   # Unused
-  url(r'^jobs/(?P<job>\w+)/setpriority$', 'set_job_priority', name='set_job_priority'),
-  url(r'^trackers$', 'trackers', name='trackers'),
-  url(r'^clusterstatus$', 'clusterstatus', name='clusterstatus'),
-  url(r'^queues$', 'queues', name='queues'),
-  url(r'^jobbrowser$', 'jobbrowser', name='jobbrowser'),
-  url(r'^dock_jobs/$', 'dock_jobs', name='dock_jobs'),
-)
+  url(r'^jobs/(?P<job>\w+)/setpriority$', jobbrowser_views.set_job_priority, name='set_job_priority'),
+  url(r'^trackers$', jobbrowser_views.trackers, name='trackers'),
+  url(r'^clusterstatus$', jobbrowser_views.clusterstatus, name='clusterstatus'),
+  url(r'^queues$', jobbrowser_views.queues, name='queues'),
+  url(r'^jobbrowser$', jobbrowser_views.jobbrowser, name='jobbrowser'),
+  url(r'^dock_jobs/$', jobbrowser_views.dock_jobs, name='dock_jobs'),
+]
 
 # V2
-urlpatterns += patterns('jobbrowser.views',
-  url(r'apps$', 'apps', name='apps'),
-)
+urlpatterns += [
+  url(r'apps$', jobbrowser_views.apps, name='apps'),
+]
 
-urlpatterns += patterns('jobbrowser.api2',
-  url(r'api/jobs/?(?P<interface>.+)?', 'jobs', name='jobs'),
-  url(r'api/job/logs', 'logs', name='logs'),
-  url(r'api/job/profile', 'profile', name='profile'),
-  url(r'api/job/action/?(?P<interface>.+)?/?(?P<action>.+)?', 'action', name='action'),
-  url(r'api/job/?(?P<interface>.+)?', 'job', name='job'),
-)
+urlpatterns += [
+  url(r'api/jobs/?(?P<interface>.+)?', jobbrowser_api2.jobs, name='jobs'),
+  url(r'api/job/logs', jobbrowser_api2.logs, name='logs'),
+  url(r'api/job/profile', jobbrowser_api2.profile, name='profile'),
+  url(r'api/job/action/?(?P<interface>.+)?/?(?P<action>.+)?', jobbrowser_api2.action, name='action'),
+  url(r'api/job/?(?P<interface>.+)?', jobbrowser_api2.job, name='job'),
+]

+ 1 - 1
apps/jobbrowser/src/jobbrowser/views.py

@@ -28,7 +28,7 @@ from lxml import html
 from django.http import HttpResponseRedirect
 from django.utils.functional import wraps
 from django.utils.translation import ugettext as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from desktop.log.access import access_log_level
 from desktop.lib.rest.http_client import RestException

+ 1 - 1
apps/jobsub/src/jobsub/tests.py

@@ -21,7 +21,7 @@ import time
 
 from nose.tools import assert_true, assert_false, assert_equal, assert_raises
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import grant_access, add_to_group

+ 13 - 14
apps/jobsub/src/jobsub/urls.py

@@ -15,23 +15,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
-
-urlpatterns = patterns(
-  'jobsub.views',
+from django.conf.urls import url
+from jobsub import views as jobsub_views
 
+urlpatterns = [
   # The base view is the "list" view, which we alias as /
-  url(r'^$', 'list_designs'),
+  url(r'^$', jobsub_views.list_designs),
 
   # Not available on Hue 4
-  url(r'^not_available$', 'not_available'),
+  url(r'^not_available$', jobsub_views.not_available),
 
   # Actions: get, save, clone, delete, submit, new.
-  url(r'^designs$', 'list_designs'),
-  url(r'^designs/(?P<design_id>\d+)$', 'get_design'),
-  url(r'^designs/(?P<node_type>\w+)/new$', 'new_design'),
-  url(r'^designs/(?P<design_id>\d+)/save$', 'save_design'),
-  url(r'^designs/(?P<design_id>\d+)/clone$', 'clone_design'),
-  url(r'^designs/(?P<design_id>\d+)/delete$', 'delete_design'),
-  url(r'^designs/(?P<design_id>\d+)/restore$', 'restore_design'),
-)
+  url(r'^designs$', jobsub_views.list_designs),
+  url(r'^designs/(?P<design_id>\d+)$', jobsub_views.get_design),
+  url(r'^designs/(?P<node_type>\w+)/new$', jobsub_views.new_design),
+  url(r'^designs/(?P<design_id>\d+)/save$', jobsub_views.save_design),
+  url(r'^designs/(?P<design_id>\d+)/clone$', jobsub_views.clone_design),
+  url(r'^designs/(?P<design_id>\d+)/delete$', jobsub_views.delete_design),
+  url(r'^designs/(?P<design_id>\d+)/restore$', jobsub_views.restore_design),
+]

+ 1 - 1
apps/metastore/src/metastore/tests.py

@@ -25,7 +25,7 @@ from nose.tools import assert_true, assert_equal, assert_false
 
 from django.utils.encoding import smart_str
 from django.contrib.auth.models import User, Group
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from desktop.lib.django_test_util import make_logged_in_client, assert_equal_mod_whitespace
 from desktop.lib.test_utils import add_permission, grant_access

+ 22 - 21
apps/metastore/src/metastore/urls.py

@@ -15,27 +15,28 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from metastore import views as metastore_views
 
-urlpatterns = patterns('metastore.views',
-  url(r'^$', 'index', name='index'),
+urlpatterns = [
+  url(r'^$', metastore_views.index, name='index'),
 
-  url(r'^databases/?$', 'databases', name='databases'),
-  url(r'^databases/drop/?$', 'drop_database', name='drop_database'),
-  url(r'^databases/(?P<database>\w+)/alter$', 'alter_database', name='alter_database'),
-  url(r'^databases/(?P<database>\w+)/metadata$', 'get_database_metadata', name='get_database_metadata'),
+  url(r'^databases/?$', metastore_views.databases, name='databases'),
+  url(r'^databases/drop/?$', metastore_views.drop_database, name='drop_database'),
+  url(r'^databases/(?P<database>\w+)/alter$', metastore_views.alter_database, name='alter_database'),
+  url(r'^databases/(?P<database>\w+)/metadata$', metastore_views.get_database_metadata, name='get_database_metadata'),
 
-  url(r'^tables/(?P<database>\w+)?/?$', 'show_tables', name='show_tables'),
-  url(r'^tables/drop/(?P<database>\w+)$', 'drop_table', name='drop_table'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/?$', 'describe_table', name='describe_table'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/alter$', 'alter_table', name='alter_table'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/metadata$', 'get_table_metadata', name='get_table_metadata'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/load$', 'load_table', name='load_table'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/read$', 'read_table', name='read_table'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/queries$', 'table_queries', name='table_queries'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/?$', 'describe_partitions', name='describe_partitions'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/(?P<partition_spec>.+?)/read$', 'read_partition', name='read_partition'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/(?P<partition_spec>.+?)/browse$', 'browse_partition', name='browse_partition'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/drop$', 'drop_partition', name='drop_partition'),
-  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/alter_column$', 'alter_column', name='alter_column'),
-)
+  url(r'^tables/(?P<database>\w+)?/?$', metastore_views.show_tables, name='show_tables'),
+  url(r'^tables/drop/(?P<database>\w+)$', metastore_views.drop_table, name='drop_table'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/?$', metastore_views.describe_table, name='describe_table'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/alter$', metastore_views.alter_table, name='alter_table'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/metadata$', metastore_views.get_table_metadata, name='get_table_metadata'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/load$', metastore_views.load_table, name='load_table'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/read$', metastore_views.read_table, name='read_table'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/queries$', metastore_views.table_queries, name='table_queries'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/?$', metastore_views.describe_partitions, name='describe_partitions'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/(?P<partition_spec>.+?)/read$', metastore_views.read_partition, name='read_partition'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/(?P<partition_spec>.+?)/browse$', metastore_views.browse_partition, name='browse_partition'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/partitions/drop$', metastore_views.drop_partition, name='drop_partition'),
+  url(r'^table/(?P<database>\w+)/(?P<table>\w+)/alter_column$', metastore_views.alter_column, name='alter_column'),
+]

+ 1 - 1
apps/metastore/src/metastore/views.py

@@ -20,7 +20,7 @@ import logging
 import urllib
 
 from django.db.models import Q
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.shortcuts import redirect
 from django.utils.functional import wraps
 from django.utils.translation import ugettext as _

+ 2 - 2
apps/oozie/src/oozie/management/commands/oozie_setup.py

@@ -21,7 +21,7 @@ import os
 from lxml import etree
 
 from django.core import management
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 from django.db import transaction
 from django.utils.translation import ugettext as _
 
@@ -43,7 +43,7 @@ from oozie.importlib.bundles import import_bundle_root
 LOG = logging.getLogger(__name__)
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
   def _import_workflows(self, directory, managed=True):
 

+ 1 - 1
apps/oozie/src/oozie/models.py

@@ -29,7 +29,7 @@ from itertools import chain
 
 from django.db import models, transaction
 from django.db.models import Q
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.core.validators import RegexValidator
 from django.contrib.auth.models import User
 from django.contrib.contenttypes.fields import GenericRelation

+ 1 - 1
apps/oozie/src/oozie/models2.py

@@ -27,7 +27,7 @@ from dateutil.parser import parse
 from string import Template
 from xml.sax.saxutils import escape
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db.models import Q
 from django.utils.encoding import force_unicode
 from django.utils.translation import ugettext as _

+ 1 - 1
apps/oozie/src/oozie/models2_tests.py

@@ -21,7 +21,7 @@ import logging
 import re
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db.models import Q
 
 from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal, assert_raises

+ 1 - 1
apps/oozie/src/oozie/tests.py

@@ -31,7 +31,7 @@ from itertools import chain
 from nose.plugins.skip import SkipTest
 from nose.tools import raises, assert_true, assert_false, assert_equal, assert_not_equal
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import grant_access, add_permission, add_to_group, reformat_json, reformat_xml

+ 129 - 130
apps/oozie/src/oozie/urls.py

@@ -15,138 +15,137 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from oozie.views import editor as oozie_views_editor
+from oozie.views import editor2 as oozie_views_editor2
+from oozie.views import api as oozie_views_api
+from oozie.views import dashboard as oozie_views_dashboard
+from oozie.views import common as oozie_views_common
 
 
 IS_URL_NAMESPACED = True
 
 
-urlpatterns = patterns(
-  'oozie.views.editor',
-
-  url(r'^list_workflows/$', 'list_workflows', name='list_workflows'),
-  url(r'^list_trashed_workflows/$', 'list_trashed_workflows', name='list_trashed_workflows'),
-  url(r'^create_workflow/$', 'create_workflow', name='create_workflow'),
-  url(r'^edit_workflow/(?P<workflow>\d+)$', 'edit_workflow', name='edit_workflow'),
-  url(r'^delete_workflow$', 'delete_workflow', name='delete_workflow'),
-  url(r'^restore_workflow/$', 'restore_workflow', name='restore_workflow'),
-  url(r'^clone_workflow/(?P<workflow>\d+)$', 'clone_workflow', name='clone_workflow'),
-  url(r'^submit_workflow/(?P<workflow>\d+)$', 'submit_workflow', name='submit_workflow'),
-  url(r'^schedule_workflow/(?P<workflow>\d+)$', 'schedule_workflow', name='schedule_workflow'),
-  url(r'^import_workflow/$', 'import_workflow', name='import_workflow'),
-  url(r'^import_coordinator/$', 'import_coordinator', name='import_coordinator'),
-  url(r'^export_workflow/(?P<workflow>\d+)$', 'export_workflow', name='export_workflow'),
-
-  url(r'^list_coordinators/(?P<workflow_id>[-\w]+)?$', 'list_coordinators', name='list_coordinators'),
-  url(r'^list_trashed_coordinators/$', 'list_trashed_coordinators', name='list_trashed_coordinators'),
-  url(r'^create_coordinator/(?P<workflow>[-\w]+)?$', 'create_coordinator', name='create_coordinator'),
-  url(r'^edit_coordinator/(?P<coordinator>[-\w]+)$', 'edit_coordinator', name='edit_coordinator'),
-  url(r'^delete_coordinator$', 'delete_coordinator', name='delete_coordinator'),
-  url(r'^restore_coordinator$', 'restore_coordinator', name='restore_coordinator'),
-  url(r'^clone_coordinator/(?P<coordinator>\d+)$', 'clone_coordinator', name='clone_coordinator'),
-  url(r'^create_coordinator_dataset/(?P<coordinator>[-\w]+)$', 'create_coordinator_dataset', name='create_coordinator_dataset'),
-  url(r'^edit_coordinator_dataset/(?P<dataset>\d+)$', 'edit_coordinator_dataset', name='edit_coordinator_dataset'),
-  url(r'^create_coordinator_data/(?P<coordinator>[-\w]+)/(?P<data_type>(input|output))$', 'create_coordinator_data', name='create_coordinator_data'),
-  url(r'^submit_coordinator/(?P<coordinator>\d+)$', 'submit_coordinator', name='submit_coordinator'),
-
-  url(r'^list_bundles$', 'list_bundles', name='list_bundles'),
-  url(r'^list_trashed_bundles$', 'list_trashed_bundles', name='list_trashed_bundles'),
-  url(r'^create_bundle$', 'create_bundle', name='create_bundle'),
-  url(r'^edit_bundle/(?P<bundle>\d+)$', 'edit_bundle', name='edit_bundle'),
-  url(r'^submit_bundle/(?P<bundle>\d+)$', 'submit_bundle', name='submit_bundle'),
-  url(r'^clone_bundle/(?P<bundle>\d+)$', 'clone_bundle', name='clone_bundle'),
-  url(r'^delete_bundle$', 'delete_bundle', name='delete_bundle'),
-  url(r'^restore_bundle$', 'restore_bundle', name='restore_bundle'),
-  url(r'^create_bundled_coordinator/(?P<bundle>\d+)$', 'create_bundled_coordinator', name='create_bundled_coordinator'),
-  url(r'^edit_bundled_coordinator/(?P<bundle>\d+)/(?P<bundled_coordinator>\d+)$', 'edit_bundled_coordinator', name='edit_bundled_coordinator'),
-
-  url(r'^list_history$', 'list_history', name='list_history'), # Unused
-  url(r'^list_history/(?P<record_id>[-\w]+)$', 'list_history_record', name='list_history_record'),
-  url(r'^install_examples/$', 'install_examples', name='install_examples'),
-)
-
-
-urlpatterns += patterns(
-  'oozie.views.editor2',
-
-  url(r'^editor/workflow/list/$', 'list_editor_workflows', name='list_editor_workflows'),
-  url(r'^editor/workflow/edit/$', 'edit_workflow', name='edit_workflow'),
-  url(r'^editor/workflow/new/$', 'new_workflow', name='new_workflow'),
-  url(r'^editor/workflow/delete/$', 'delete_job', name='delete_editor_workflow'),
-  url(r'^editor/workflow/copy/$', 'copy_workflow', name='copy_workflow'),
-  url(r'^editor/workflow/save/$', 'save_workflow', name='save_workflow'),
-  url(r'^editor/workflow/submit/(?P<doc_id>\d+)$', 'submit_workflow', name='editor_submit_workflow'),
-  url(r'^editor/workflow/submit_single_action/(?P<doc_id>\d+)/(?P<node_id>.+)$', 'submit_single_action', name='submit_single_action'),
-  url(r'^editor/workflow/new_node/$', 'new_node', name='new_node'),
-  url(r'^editor/workflow/add_node/$', 'add_node', name='add_node'),
-  url(r'^editor/workflow/parameters/$', 'workflow_parameters', name='workflow_parameters'),
-  url(r'^editor/workflow/action/parameters/$', 'action_parameters', name='action_parameters'),
-  url(r'^editor/workflow/gen_xml/$', 'gen_xml_workflow', name='gen_xml_workflow'),
-  url(r'^editor/workflow/open_v1/$', 'open_old_workflow', name='open_old_workflow'),
-
-  url(r'^editor/coordinator/list/$', 'list_editor_coordinators', name='list_editor_coordinators'),
-  url(r'^editor/coordinator/edit/$', 'edit_coordinator', name='edit_coordinator'),
-  url(r'^editor/coordinator/new/$', 'new_coordinator', name='new_coordinator'),
-  url(r'^editor/coordinator/delete/$', 'delete_job', name='delete_editor_coordinator'),
-  url(r'^editor/coordinator/copy/$', 'copy_coordinator', name='copy_coordinator'),
-  url(r'^editor/coordinator/save/$', 'save_coordinator', name='save_coordinator'),
-  url(r'^editor/coordinator/submit/(?P<doc_id>[-\w]+)$', 'submit_coordinator', name='editor_submit_coordinator'),
-  url(r'^editor/coordinator/gen_xml/$', 'gen_xml_coordinator', name='gen_xml_coordinator'),
-  url(r'^editor/coordinator/open_v1/$', 'open_old_coordinator', name='open_old_coordinator'),
-  url(r'^editor/coordinator/parameters/$', 'coordinator_parameters', name='coordinator_parameters'),
-
-  url(r'^editor/bundle/list/$', 'list_editor_bundles', name='list_editor_bundles'),
-  url(r'^editor/bundle/edit/$', 'edit_bundle', name='edit_bundle'),
-  url(r'^editor/bundle/new/$', 'new_bundle', name='new_bundle'),
-  url(r'^editor/bundle/delete/$', 'delete_job', name='delete_editor_bundle'),
-  url(r'^editor/bundle/copy/$', 'copy_bundle', name='copy_bundle'),
-  url(r'^editor/bundle/save/$', 'save_bundle', name='save_bundle'),
-  url(r'^editor/bundle/submit/(?P<doc_id>\d+)$', 'submit_bundle', name='editor_submit_bundle'),
-  url(r'^editor/bundle/open_v1/$', 'open_old_bundle', name='open_old_bundle'),
-)
-
-
-urlpatterns += patterns(
-  'oozie.views.api',
-
-  url(r'^workflows$', 'workflows', name='workflows'),
-  url(r'^workflows/(?P<workflow>\d+)$', 'workflow', name='workflow'),
-  url(r'^workflows/(?P<workflow>\d+)/save$', 'workflow_save', name='workflow_save'),
-  url(r'^workflows/(?P<workflow>\d+)/actions$', 'workflow_actions', name='workflow_actions'),
-  url(r'^workflows/(?P<workflow>\d+)/nodes/(?P<node_type>\w+)/validate$', 'workflow_validate_node', name='workflow_validate_node'),
-  url(r'^workflows/autocomplete_properties/$', 'autocomplete_properties', name='autocomplete_properties'),
-)
-
-
-urlpatterns += patterns(
-  'oozie.views.dashboard',
-
-  url(r'^$', 'list_oozie_workflows', name='index'),
-
-  url(r'^list_oozie_workflows/$', 'list_oozie_workflows', name='list_oozie_workflows'),
-  url(r'^list_oozie_coordinators/$', 'list_oozie_coordinators', name='list_oozie_coordinators'),
-  url(r'^list_oozie_bundles/$', 'list_oozie_bundles', name='list_oozie_bundles'),
-  url(r'^list_oozie_workflow/(?P<job_id>[-\w]+)/$', 'list_oozie_workflow', name='list_oozie_workflow'),
-  url(r'^list_oozie_coordinator/(?P<job_id>[-\w]+)/$', 'list_oozie_coordinator', name='list_oozie_coordinator'),
-  url(r'^list_oozie_workflow_action/(?P<action>[-\w@]+)/$', 'list_oozie_workflow_action', name='list_oozie_workflow_action'),
-  url(r'^list_oozie_bundle/(?P<job_id>[-\w]+)$', 'list_oozie_bundle', name='list_oozie_bundle'),
-
-  url(r'^rerun_oozie_job/(?P<job_id>[-\w]+)/(?P<app_path>.+?)?$', 'rerun_oozie_job', name='rerun_oozie_job'),
-  url(r'^rerun_oozie_coord/(?P<job_id>[-\w]+)/(?P<app_path>.+?)?$', 'rerun_oozie_coordinator', name='rerun_oozie_coord'),
-  url(r'^rerun_oozie_bundle/(?P<job_id>[-\w]+)/(?P<app_path>.+?)$', 'rerun_oozie_bundle', name='rerun_oozie_bundle'),
-  url(r'^sync_coord_workflow/(?P<job_id>[-\w]+)$', 'sync_coord_workflow', name='sync_coord_workflow'),
-  url(r'^manage_oozie_jobs/(?P<job_id>[-\w]+)/(?P<action>(start|suspend|resume|kill|rerun|change|ignore))$', 'manage_oozie_jobs', name='manage_oozie_jobs'),
-  url(r'^bulk_manage_oozie_jobs/$', 'bulk_manage_oozie_jobs', name='bulk_manage_oozie_jobs'),
-
-  url(r'^submit_external_job/(?P<application_path>.+?)$', 'submit_external_job', name='submit_external_job'),
-  url(r'^get_oozie_job_log/(?P<job_id>[-\w]+)$', 'get_oozie_job_log', name='get_oozie_job_log'),
-
-  url(r'^list_oozie_info/$', 'list_oozie_info', name='list_oozie_info'),
-
-  url(r'^list_oozie_sla/$', 'list_oozie_sla', name='list_oozie_sla'),
-)
-
-urlpatterns += patterns(
-  'oozie.views.common',
-  url(r'^jasmine', 'jasmine', name='jasmine'),
-)
+urlpatterns = [
+
+  url(r'^list_workflows/$', oozie_views_editor.list_workflows, name='list_workflows'),
+  url(r'^list_trashed_workflows/$', oozie_views_editor.list_trashed_workflows, name='list_trashed_workflows'),
+  url(r'^create_workflow/$', oozie_views_editor.create_workflow, name='create_workflow'),
+  url(r'^edit_workflow/(?P<workflow>\d+)$', oozie_views_editor.edit_workflow, name='edit_workflow'),
+  url(r'^delete_workflow$', oozie_views_editor.delete_workflow, name='delete_workflow'),
+  url(r'^restore_workflow/$', oozie_views_editor.restore_workflow, name='restore_workflow'),
+  url(r'^clone_workflow/(?P<workflow>\d+)$', oozie_views_editor.clone_workflow, name='clone_workflow'),
+  url(r'^submit_workflow/(?P<workflow>\d+)$', oozie_views_editor.submit_workflow, name='submit_workflow'),
+  url(r'^schedule_workflow/(?P<workflow>\d+)$', oozie_views_editor.schedule_workflow, name='schedule_workflow'),
+  url(r'^import_workflow/$', oozie_views_editor.import_workflow, name='import_workflow'),
+  url(r'^import_coordinator/$', oozie_views_editor.import_coordinator, name='import_coordinator'),
+  url(r'^export_workflow/(?P<workflow>\d+)$', oozie_views_editor.export_workflow, name='export_workflow'),
+
+  url(r'^list_coordinators/(?P<workflow_id>[-\w]+)?$', oozie_views_editor.list_coordinators, name='list_coordinators'),
+  url(r'^list_trashed_coordinators/$', oozie_views_editor.list_trashed_coordinators, name='list_trashed_coordinators'),
+  url(r'^create_coordinator/(?P<workflow>[-\w]+)?$', oozie_views_editor.create_coordinator, name='create_coordinator'),
+  url(r'^edit_coordinator/(?P<coordinator>[-\w]+)$', oozie_views_editor.edit_coordinator, name='edit_coordinator'),
+  url(r'^delete_coordinator$', oozie_views_editor.delete_coordinator, name='delete_coordinator'),
+  url(r'^restore_coordinator$', oozie_views_editor.restore_coordinator, name='restore_coordinator'),
+  url(r'^clone_coordinator/(?P<coordinator>\d+)$', oozie_views_editor.clone_coordinator, name='clone_coordinator'),
+  url(r'^create_coordinator_dataset/(?P<coordinator>[-\w]+)$', oozie_views_editor.create_coordinator_dataset, name='create_coordinator_dataset'),
+  url(r'^edit_coordinator_dataset/(?P<dataset>\d+)$', oozie_views_editor.edit_coordinator_dataset, name='edit_coordinator_dataset'),
+  url(r'^create_coordinator_data/(?P<coordinator>[-\w]+)/(?P<data_type>(input|output))$', oozie_views_editor.create_coordinator_data, name='create_coordinator_data'),
+  url(r'^submit_coordinator/(?P<coordinator>\d+)$', oozie_views_editor.submit_coordinator, name='submit_coordinator'),
+
+  url(r'^list_bundles$', oozie_views_editor.list_bundles, name='list_bundles'),
+  url(r'^list_trashed_bundles$', oozie_views_editor.list_trashed_bundles, name='list_trashed_bundles'),
+  url(r'^create_bundle$', oozie_views_editor.create_bundle, name='create_bundle'),
+  url(r'^edit_bundle/(?P<bundle>\d+)$', oozie_views_editor.edit_bundle, name='edit_bundle'),
+  url(r'^submit_bundle/(?P<bundle>\d+)$', oozie_views_editor.submit_bundle, name='submit_bundle'),
+  url(r'^clone_bundle/(?P<bundle>\d+)$', oozie_views_editor.clone_bundle, name='clone_bundle'),
+  url(r'^delete_bundle$', oozie_views_editor.delete_bundle, name='delete_bundle'),
+  url(r'^restore_bundle$', oozie_views_editor.restore_bundle, name='restore_bundle'),
+  url(r'^create_bundled_coordinator/(?P<bundle>\d+)$', oozie_views_editor.create_bundled_coordinator, name='create_bundled_coordinator'),
+  url(r'^edit_bundled_coordinator/(?P<bundle>\d+)/(?P<bundled_coordinator>\d+)$', oozie_views_editor.edit_bundled_coordinator, name='edit_bundled_coordinator'),
+
+  url(r'^list_history$', oozie_views_editor.list_history, name='list_history'), # Unused
+  url(r'^list_history/(?P<record_id>[-\w]+)$', oozie_views_editor.list_history_record, name='list_history_record'),
+  url(r'^install_examples/$', oozie_views_editor.install_examples, name='install_examples'),
+]
+
+urlpatterns += [
+
+  url(r'^editor/workflow/list/$', oozie_views_editor2.list_editor_workflows, name='list_editor_workflows'),
+  url(r'^editor/workflow/edit/$', oozie_views_editor2.edit_workflow, name='edit_workflow'),
+  url(r'^editor/workflow/new/$', oozie_views_editor2.new_workflow, name='new_workflow'),
+  url(r'^editor/workflow/delete/$', oozie_views_editor2.delete_job, name='delete_editor_workflow'),
+  url(r'^editor/workflow/copy/$', oozie_views_editor2.copy_workflow, name='copy_workflow'),
+  url(r'^editor/workflow/save/$', oozie_views_editor2.save_workflow, name='save_workflow'),
+  url(r'^editor/workflow/submit/(?P<doc_id>\d+)$', oozie_views_editor2.submit_workflow, name='editor_submit_workflow'),
+  url(r'^editor/workflow/submit_single_action/(?P<doc_id>\d+)/(?P<node_id>.+)$', oozie_views_editor2.submit_single_action, name='submit_single_action'),
+  url(r'^editor/workflow/new_node/$', oozie_views_editor2.new_node, name='new_node'),
+  url(r'^editor/workflow/add_node/$', oozie_views_editor2.add_node, name='add_node'),
+  url(r'^editor/workflow/parameters/$', oozie_views_editor2.workflow_parameters, name='workflow_parameters'),
+  url(r'^editor/workflow/action/parameters/$', oozie_views_editor2.action_parameters, name='action_parameters'),
+  url(r'^editor/workflow/gen_xml/$', oozie_views_editor2.gen_xml_workflow, name='gen_xml_workflow'),
+  url(r'^editor/workflow/open_v1/$', oozie_views_editor2.open_old_workflow, name='open_old_workflow'),
+
+  url(r'^editor/coordinator/list/$', oozie_views_editor2.list_editor_coordinators, name='list_editor_coordinators'),
+  url(r'^editor/coordinator/edit/$', oozie_views_editor2.edit_coordinator, name='edit_coordinator'),
+  url(r'^editor/coordinator/new/$', oozie_views_editor2.new_coordinator, name='new_coordinator'),
+  url(r'^editor/coordinator/delete/$', oozie_views_editor2.delete_job, name='delete_editor_coordinator'),
+  url(r'^editor/coordinator/copy/$', oozie_views_editor2.copy_coordinator, name='copy_coordinator'),
+  url(r'^editor/coordinator/save/$', oozie_views_editor2.save_coordinator, name='save_coordinator'),
+  url(r'^editor/coordinator/submit/(?P<doc_id>[-\w]+)$', oozie_views_editor2.submit_coordinator, name='editor_submit_coordinator'),
+  url(r'^editor/coordinator/gen_xml/$', oozie_views_editor2.gen_xml_coordinator, name='gen_xml_coordinator'),
+  url(r'^editor/coordinator/open_v1/$', oozie_views_editor2.open_old_coordinator, name='open_old_coordinator'),
+  url(r'^editor/coordinator/parameters/$', oozie_views_editor2.coordinator_parameters, name='coordinator_parameters'),
+
+  url(r'^editor/bundle/list/$', oozie_views_editor2.list_editor_bundles, name='list_editor_bundles'),
+  url(r'^editor/bundle/edit/$', oozie_views_editor2.edit_bundle, name='edit_bundle'),
+  url(r'^editor/bundle/new/$', oozie_views_editor2.new_bundle, name='new_bundle'),
+  url(r'^editor/bundle/delete/$', oozie_views_editor2.delete_job, name='delete_editor_bundle'),
+  url(r'^editor/bundle/copy/$', oozie_views_editor2.copy_bundle, name='copy_bundle'),
+  url(r'^editor/bundle/save/$', oozie_views_editor2.save_bundle, name='save_bundle'),
+  url(r'^editor/bundle/submit/(?P<doc_id>\d+)$', oozie_views_editor2.submit_bundle, name='editor_submit_bundle'),
+  url(r'^editor/bundle/open_v1/$', oozie_views_editor2.open_old_bundle, name='open_old_bundle'),
+]
+
+
+urlpatterns += [
+
+  url(r'^workflows$', oozie_views_api.workflows, name='workflows'),
+  url(r'^workflows/(?P<workflow>\d+)$', oozie_views_api.workflow, name='workflow'),
+  url(r'^workflows/(?P<workflow>\d+)/save$', oozie_views_api.workflow_save, name='workflow_save'),
+  url(r'^workflows/(?P<workflow>\d+)/actions$', oozie_views_api.workflow_actions, name='workflow_actions'),
+  url(r'^workflows/(?P<workflow>\d+)/nodes/(?P<node_type>\w+)/validate$', oozie_views_api.workflow_validate_node, name='workflow_validate_node'),
+  url(r'^workflows/autocomplete_properties/$', oozie_views_api.autocomplete_properties, name='autocomplete_properties'),
+]
+
+
+urlpatterns += [
+
+  url(r'^$', oozie_views_dashboard.list_oozie_workflows, name='index'),
+
+  url(r'^list_oozie_workflows/$', oozie_views_dashboard.list_oozie_workflows, name='list_oozie_workflows'),
+  url(r'^list_oozie_coordinators/$', oozie_views_dashboard.list_oozie_coordinators, name='list_oozie_coordinators'),
+  url(r'^list_oozie_bundles/$', oozie_views_dashboard.list_oozie_bundles, name='list_oozie_bundles'),
+  url(r'^list_oozie_workflow/(?P<job_id>[-\w]+)/$', oozie_views_dashboard.list_oozie_workflow, name='list_oozie_workflow'),
+  url(r'^list_oozie_coordinator/(?P<job_id>[-\w]+)/$', oozie_views_dashboard.list_oozie_coordinator, name='list_oozie_coordinator'),
+  url(r'^list_oozie_workflow_action/(?P<action>[-\w@]+)/$', oozie_views_dashboard.list_oozie_workflow_action, name='list_oozie_workflow_action'),
+  url(r'^list_oozie_bundle/(?P<job_id>[-\w]+)$', oozie_views_dashboard.list_oozie_bundle, name='list_oozie_bundle'),
+
+  url(r'^rerun_oozie_job/(?P<job_id>[-\w]+)/(?P<app_path>.+?)?$', oozie_views_dashboard.rerun_oozie_job, name='rerun_oozie_job'),
+  url(r'^rerun_oozie_coord/(?P<job_id>[-\w]+)/(?P<app_path>.+?)?$', oozie_views_dashboard.rerun_oozie_coordinator, name='rerun_oozie_coord'),
+  url(r'^rerun_oozie_bundle/(?P<job_id>[-\w]+)/(?P<app_path>.+?)$', oozie_views_dashboard.rerun_oozie_bundle, name='rerun_oozie_bundle'),
+  url(r'^sync_coord_workflow/(?P<job_id>[-\w]+)$', oozie_views_dashboard.sync_coord_workflow, name='sync_coord_workflow'),
+  url(r'^manage_oozie_jobs/(?P<job_id>[-\w]+)/(?P<action>(start|suspend|resume|kill|rerun|change|ignore))$', oozie_views_dashboard.manage_oozie_jobs, name='manage_oozie_jobs'),
+  url(r'^bulk_manage_oozie_jobs/$', oozie_views_dashboard.bulk_manage_oozie_jobs, name='bulk_manage_oozie_jobs'),
+
+  url(r'^submit_external_job/(?P<application_path>.+?)$', oozie_views_dashboard.submit_external_job, name='submit_external_job'),
+  url(r'^get_oozie_job_log/(?P<job_id>[-\w]+)$', oozie_views_dashboard.get_oozie_job_log, name='get_oozie_job_log'),
+
+  url(r'^list_oozie_info/$', oozie_views_dashboard.list_oozie_info, name='list_oozie_info'),
+
+  url(r'^list_oozie_sla/$', oozie_views_dashboard.list_oozie_sla, name='list_oozie_sla'),
+]
+
+urlpatterns += [
+  url(r'^jasmine', oozie_views_common.jasmine, name='jasmine'),
+]

+ 1 - 1
apps/oozie/src/oozie/views/dashboard.py

@@ -25,7 +25,7 @@ from django.forms.formsets import formset_factory
 from django.http import HttpResponse
 from django.utils.functional import wraps
 from django.utils.translation import ugettext as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.shortcuts import redirect
 
 from desktop.conf import TIME_ZONE

+ 1 - 1
apps/oozie/src/oozie/views/editor.py

@@ -20,7 +20,7 @@ import logging
 import shutil
 import time
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db.models import Q
 from django.forms.formsets import formset_factory
 from django.forms.models import inlineformset_factory

+ 1 - 1
apps/oozie/src/oozie/views/editor2.py

@@ -18,7 +18,7 @@
 import json
 import logging
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.forms.formsets import formset_factory
 from django.shortcuts import redirect
 from django.utils.translation import ugettext as _

+ 1 - 1
apps/pig/src/pig/api.py

@@ -19,7 +19,7 @@ import json
 import logging
 import time
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 
 from desktop.lib.i18n import smart_str

+ 2 - 2
apps/pig/src/pig/management/commands/pig_setup.py

@@ -20,7 +20,7 @@ import logging
 import os
 
 from django.core import management
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 from django.db import transaction
 from django.utils.translation import ugettext as _
 
@@ -39,7 +39,7 @@ from pig.conf import LOCAL_SAMPLE_DIR, REMOTE_SAMPLE_DIR
 LOG = logging.getLogger(__name__)
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
   def install_pig_script(self, sample_user):
     doc2 = None

+ 1 - 1
apps/pig/src/pig/models.py

@@ -21,7 +21,7 @@ import posixpath
 from django.db import models
 from django.contrib.auth.models import User
 from django.contrib.contenttypes.fields import GenericRelation
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _, ugettext_lazy as _t
 
 from desktop.lib.exceptions_renderable import PopupException

+ 1 - 1
apps/pig/src/pig/tests.py

@@ -20,7 +20,7 @@ import json
 import time
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from nose.plugins.skip import SkipTest
 from nose.tools import assert_true, assert_equal, assert_false

+ 15 - 14
apps/pig/src/pig/urls.py

@@ -15,21 +15,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from pig import views as pig_views
 
-urlpatterns = patterns('pig.views',
-  url(r'^$', 'app', name='index'),
+urlpatterns = [
+  url(r'^$', pig_views.app, name='index'),
 
-  url(r'^app/$', 'app', name='app'),
+  url(r'^app/$', pig_views.app, name='app'),
 
   # Ajax
-  url(r'^scripts/$', 'scripts', name='scripts'),
-  url(r'^dashboard/$', 'dashboard', name='dashboard'),
-  url(r'^save/$', 'save', name='save'),
-  url(r'^run/$', 'run', name='run'),
-  url(r'^copy/$', 'copy', name='copy'),
-  url(r'^delete/$', 'delete', name='delete'),
-  url(r'^watch/(?P<job_id>[-\w]+)$', 'watch', name='watch'),
-  url(r'^stop/$', 'stop', name='stop'),
-  url(r'^install_examples$', 'install_examples', name='install_examples'),
-)
+  url(r'^scripts/$', pig_views.scripts, name='scripts'),
+  url(r'^dashboard/$', pig_views.dashboard, name='dashboard'),
+  url(r'^save/$', pig_views.save, name='save'),
+  url(r'^run/$', pig_views.run, name='run'),
+  url(r'^copy/$', pig_views.copy, name='copy'),
+  url(r'^delete/$', pig_views.delete, name='delete'),
+  url(r'^watch/(?P<job_id>[-\w]+)$', pig_views.watch, name='watch'),
+  url(r'^stop/$', pig_views.stop, name='stop'),
+  url(r'^install_examples$', pig_views.install_examples, name='install_examples'),
+]

+ 1 - 1
apps/pig/src/pig/views.py

@@ -18,7 +18,7 @@
 import json
 import logging
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.views.decorators.csrf import ensure_csrf_cookie
 

+ 5 - 4
apps/proxy/src/proxy/urls.py

@@ -15,9 +15,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from proxy import views as proxy_views
 
-urlpatterns = patterns('proxy',
+urlpatterns = [
   # Prefix the names of your views with the app name.
-  url(r'^(?P<host>[^/]+)/(?P<port>\d+)(?P<path>/.*)$', 'views.proxy'),
-)
+  url(r'^(?P<host>[^/]+)/(?P<port>\d+)(?P<path>/.*)$', proxy_views.proxy),
+]

+ 1 - 1
apps/rdbms/src/rdbms/tests.py

@@ -19,7 +19,7 @@ import json
 import os
 import uuid
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from nose.tools import assert_true, assert_equal
 
 from desktop.lib.django_test_util import make_logged_in_client

+ 36 - 33
apps/rdbms/src/rdbms/urls.py

@@ -15,42 +15,45 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
-
+from django.conf.urls import url
+from rdbms import views as rdbms_views
+from rdbms import api as rdbms_api
+from beeswax import views as beeswax_views
+from beeswax import api as beeswax_api
 
 # Views
-urlpatterns = patterns('rdbms.views',
-  url(r'^$', 'index', name='index'),
-  url(r'^execute/?$', 'execute_query', name='execute_query'),
-  url(r'^execute/design/(?P<design_id>\d+)$', 'execute_query', name='execute_design'),
-  url(r'^execute/query/(?P<query_history_id>\d+)$', 'execute_query', name='watch_query_history')
-)
+urlpatterns = [
+  url(r'^$', rdbms_views.index, name='index'),
+  url(r'^execute/?$', rdbms_views.execute_query, name='execute_query'),
+  url(r'^execute/design/(?P<design_id>\d+)$', rdbms_views.execute_query, name='execute_design'),
+  url(r'^execute/query/(?P<query_history_id>\d+)$', rdbms_views.execute_query, name='watch_query_history')
+]
 
 # APIs
-urlpatterns += patterns('rdbms.api',
-  url(r'^api/servers/?$', 'servers', name='api_servers'),
-  url(r'^api/servers/(?P<server>\w+)/databases/?$', 'databases', name='api_databases'),
-  url(r'^api/servers/(?P<server>\w+)/databases/(?P<database>.+?)/tables/?$', 'tables', name='api_tables'),
-  url(r'^api/servers/(?P<server>\w+)/databases/(?P<database>.+?)/tables/(?P<table>\w+)/columns/?$', 'columns', name='api_columns'),
-  url(r'^api/query/((?P<design_id>\d+)/?)?$', 'save_query', name='api_save_query'),
-  url(r'^api/query/(?P<design_id>\d+)/get$', 'fetch_saved_query', name='api_fetch_saved_query'),
-  url(r'^api/execute/(?P<design_id>\d+)?$', 'execute_query', name='api_execute_query'),
-  url(r'^api/explain/?$', 'explain_query', name='api_explain_query'),
-  url(r'^api/results/(?P<id>\d+)/(?P<first_row>\d+)$', 'fetch_results', name='api_fetch_results')
-)
+urlpatterns += [
+  url(r'^api/servers/?$', rdbms_api.servers, name='api_servers'),
+  url(r'^api/servers/(?P<server>\w+)/databases/?$', rdbms_api.databases, name='api_databases'),
+  url(r'^api/servers/(?P<server>\w+)/databases/(?P<database>.+?)/tables/?$', rdbms_api.tables, name='api_tables'),
+  url(r'^api/servers/(?P<server>\w+)/databases/(?P<database>.+?)/tables/(?P<table>\w+)/columns/?$', rdbms_api.columns, name='api_columns'),
+  url(r'^api/query/((?P<design_id>\d+)/?)?$', rdbms_api.save_query, name='api_save_query'),
+  url(r'^api/query/(?P<design_id>\d+)/get$', rdbms_api.fetch_saved_query, name='api_fetch_saved_query'),
+  url(r'^api/execute/(?P<design_id>\d+)?$', rdbms_api.execute_query, name='api_execute_query'),
+  url(r'^api/explain/?$', rdbms_api.explain_query, name='api_explain_query'),
+  url(r'^api/results/(?P<id>\d+)/(?P<first_row>\d+)$', rdbms_api.fetch_results, name='api_fetch_results')
+]
 
-urlpatterns += patterns('beeswax.views',
-  url(r'^my_queries$', 'my_queries', name='my_queries'),
-  url(r'^list_designs$', 'list_designs', name='list_designs'),
-  url(r'^list_trashed_designs$', 'list_trashed_designs', name='list_trashed_designs'),
-  url(r'^delete_designs$', 'delete_design', name='delete_design'),
-  url(r'^restore_designs$', 'restore_design', name='restore_design'),
-  url(r'^clone_design/(?P<design_id>\d+)$', 'clone_design', name='clone_design'),
-  url(r'^query_history$', 'list_query_history', name='list_query_history')
-)
+urlpatterns += [
+  url(r'^my_queries$', beeswax_views.my_queries, name='my_queries'),
+  url(r'^list_designs$', beeswax_views.list_designs, name='list_designs'),
+  url(r'^list_trashed_designs$', beeswax_views.list_trashed_designs, name='list_trashed_designs'),
+  url(r'^delete_designs$', beeswax_views.delete_design, name='delete_design'),
+  url(r'^restore_designs$', beeswax_views.restore_design, name='restore_design'),
+  url(r'^clone_design/(?P<design_id>\d+)$', beeswax_views.clone_design, name='clone_design'),
+  url(r'^query_history$', beeswax_views.list_query_history, name='list_query_history')
+]
 
-urlpatterns += patterns('beeswax.api',
-  url(r'^autocomplete/$', 'autocomplete', name='api_autocomplete_databases'),
-  url(r'^autocomplete/(?P<database>\w+)/$', 'autocomplete', name='api_autocomplete_tables'),
-  url(r'^autocomplete/(?P<database>\w+)/(?P<table>\w+)$', 'autocomplete', name='api_autocomplete_columns')
-)
+urlpatterns += [
+  url(r'^autocomplete/$', beeswax_api.autocomplete, name='api_autocomplete_databases'),
+  url(r'^autocomplete/(?P<database>\w+)/$', beeswax_api.autocomplete, name='api_autocomplete_tables'),
+  url(r'^autocomplete/(?P<database>\w+)/(?P<table>\w+)$', beeswax_api.autocomplete, name='api_autocomplete_columns')
+]

+ 1 - 1
apps/rdbms/src/rdbms/views.py

@@ -21,7 +21,7 @@ import json
 from functools import wraps
 
 from django.utils.translation import ugettext as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from desktop.context_processors import get_app_name
 from desktop.models import Document

+ 2 - 2
apps/search/src/search/management/commands/search_setup.py

@@ -18,7 +18,7 @@
 import logging
 
 from django.core import management
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 from desktop.models import Directory, Document, Document2, Document2Permission, SAMPLE_USER_OWNERS
 from useradmin.models import get_default_user_group, install_sample_user
@@ -27,7 +27,7 @@ from useradmin.models import get_default_user_group, install_sample_user
 LOG = logging.getLogger(__name__)
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   def handle_noargs(self, **options):
 
     sample_user = install_sample_user()

+ 1 - 1
apps/search/src/search/models.py

@@ -20,7 +20,7 @@ import logging
 import re
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db import models
 from django.utils.html import escape
 from django.utils.translation import ugettext_lazy as _t

+ 1 - 1
apps/search/src/search/tests.py

@@ -19,7 +19,7 @@
 import json
 
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal
 

+ 36 - 33
apps/search/src/search/urls.py

@@ -15,44 +15,47 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from search import views as search_views
+from dashboard import views as dashboard_views
+from dashboard import api as dashboard_api
 
 
-urlpatterns = patterns('search.views',
-  url(r'^install_examples$', 'install_examples', name='install_examples'),
-)
+urlpatterns = [
+  url(r'^install_examples$', search_views.install_examples, name='install_examples'),
+]
 
 
 # Those are all deprecated and dashboard.urls.py is the new reference.
 
-urlpatterns += patterns('dashboard.views',
-  url(r'^$', 'index', name='index'),
-  url(r'^m$', 'index_m', name='index_m'),
-  url(r'^save$', 'save', name='save'),
-  url(r'^new_search', 'new_search', name='new_search'),
-  url(r'^browse/(?P<name>.+)', 'browse', name='browse'),
-  url(r'^browse_m/(?P<name>.+)', 'browse_m', name='browse_m'),
+urlpatterns += [
+  url(r'^$', dashboard_views.index, name='index'),
+  url(r'^m$', dashboard_views.index_m, name='index_m'),
+  url(r'^save$', dashboard_views.save, name='save'),
+  url(r'^new_search', dashboard_views.new_search, name='new_search'),
+  url(r'^browse/(?P<name>.+)', dashboard_views.browse, name='browse'),
+  url(r'^browse_m/(?P<name>.+)', dashboard_views.browse_m, name='browse_m'),
 
   # Admin
-  url(r'^admin/collections$', 'admin_collections', name='admin_collections'),
-  url(r'^admin/collection_delete$', 'admin_collection_delete', name='admin_collection_delete'),
-  url(r'^admin/collection_copy$', 'admin_collection_copy', name='admin_collection_copy'),
-)
-
-
-urlpatterns += patterns('dashboard.api',
-  url(r'^search$', 'search', name='search'),
-  url(r'^suggest/$', 'query_suggest', name='query_suggest'),
-  url(r'^index/fields/dynamic$', 'index_fields_dynamic', name='index_fields_dynamic'),
-  url(r'^index/fields/nested_documents', 'nested_documents', name='nested_documents'),
-  url(r'^template/new_facet$', 'new_facet', name='new_facet'),
-  url(r'^get_document$', 'get_document', name='get_document'),
-  url(r'^update_document$', 'update_document', name='update_document'),
-  url(r'^get_range_facet$', 'get_range_facet', name='get_range_facet'),
-  url(r'^download$', 'download', name='download'),
-  url(r'^get_timeline$', 'get_timeline', name='get_timeline'),
-  url(r'^get_collection$', 'get_collection', name='get_collection'),
-  url(r'^get_collections$', 'get_collections', name='get_collections'),
-  url(r'^get_stats$', 'get_stats', name='get_stats'),
-  url(r'^get_terms$', 'get_terms', name='get_terms'),
-)
+  url(r'^admin/collections$', dashboard_views.admin_collections, name='admin_collections'),
+  url(r'^admin/collection_delete$', dashboard_views.admin_collection_delete, name='admin_collection_delete'),
+  url(r'^admin/collection_copy$', dashboard_views.admin_collection_copy, name='admin_collection_copy'),
+]
+
+
+urlpatterns += [
+  url(r'^search$', dashboard_api.search, name='search'),
+  url(r'^suggest/$', dashboard_api.query_suggest, name='query_suggest'),
+  url(r'^index/fields/dynamic$', dashboard_api.index_fields_dynamic, name='index_fields_dynamic'),
+  url(r'^index/fields/nested_documents', dashboard_api.nested_documents, name='nested_documents'),
+  url(r'^template/new_facet$', dashboard_api.new_facet, name='new_facet'),
+  url(r'^get_document$', dashboard_api.get_document, name='get_document'),
+  url(r'^update_document$', dashboard_api.update_document, name='update_document'),
+  url(r'^get_range_facet$', dashboard_api.get_range_facet, name='get_range_facet'),
+  url(r'^download$', dashboard_api.download, name='download'),
+  url(r'^get_timeline$', dashboard_api.get_timeline, name='get_timeline'),
+  url(r'^get_collection$', dashboard_api.get_collection, name='get_collection'),
+  url(r'^get_collections$', dashboard_api.get_collections, name='get_collections'),
+  url(r'^get_stats$', dashboard_api.get_stats, name='get_stats'),
+  url(r'^get_terms$', dashboard_api.get_terms, name='get_terms'),
+]

+ 1 - 1
apps/security/src/security/api/test_hive.py

@@ -18,7 +18,7 @@
 
 import json
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from nose.plugins.skip import SkipTest
 from nose.tools import assert_equal
 

+ 1 - 1
apps/security/src/security/tests.py

@@ -22,7 +22,7 @@ from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import grant_access
 
 from django.contrib.auth.models import User, Group
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from useradmin.models import HuePermission, GroupPermission
 

+ 52 - 49
apps/security/src/security/urls.py

@@ -15,66 +15,69 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from security import views as security_views
+from security.api import hdfs as security_api_hdfs
+from security.api import hive as security_api_hive
+from security.api import sentry as security_api_sentry 
 
+urlpatterns = [
+  url(r'^$', security_views.hive, name='index'),
+  url(r'^hive$', security_views.hive, name='hive'),
+  url(r'^hive2$', security_views.hive2, name='hive2'),
+  url(r'^solr$', security_views.solr, name='solr'),
+  url(r'^hdfs$', security_views.hdfs, name='hdfs'),
+]
 
-urlpatterns = patterns('security.views',
-  url(r'^$', 'hive', name='index'),
-  url(r'^hive$', 'hive', name='hive'),
-  url(r'^hive2$', 'hive2', name='hive2'),
-  url(r'^solr$', 'solr', name='solr'),
-  url(r'^hdfs$', 'hdfs', name='hdfs'),
-)
 
+urlpatterns += [
+  url(r'^api/hdfs/list(?P<path>/.*)$', security_api_hdfs.list_hdfs, name='list_hdfs'),
+  url(r'^api/hdfs/get_acls$', security_api_hdfs.get_acls, name='get_acls'),
+  url(r'^api/hdfs/update_acls', security_api_hdfs.update_acls, name='update_acls'),
+  url(r'^api/hdfs/bulk_delete_acls', security_api_hdfs.bulk_delete_acls, name='bulk_delete_acls'),
+  url(r'^api/hdfs/bulk_add_acls', security_api_hdfs.bulk_add_acls, name='bulk_add_acls'),
+  url(r'^api/hdfs/bulk_sync_acls', security_api_hdfs.bulk_sync_acls, name='bulk_sync_acls'),
+]
 
-urlpatterns += patterns('security.api.hdfs',
-  url(r'^api/hdfs/list(?P<path>/.*)$', 'list_hdfs', name='list_hdfs'),
-  url(r'^api/hdfs/get_acls$', 'get_acls', name='get_acls'),
-  url(r'^api/hdfs/update_acls', 'update_acls', name='update_acls'),
-  url(r'^api/hdfs/bulk_delete_acls', 'bulk_delete_acls', name='bulk_delete_acls'),
-  url(r'^api/hdfs/bulk_add_acls', 'bulk_add_acls', name='bulk_add_acls'),
-  url(r'^api/hdfs/bulk_sync_acls', 'bulk_sync_acls', name='bulk_sync_acls'),
-)
 
+urlpatterns += [
+  url(r'^api/hive/fetch_hive_path', security_api_hive.fetch_hive_path, name='fetch_hive_path'),
 
-urlpatterns += patterns('security.api.hive',
-  url(r'^api/hive/fetch_hive_path', 'fetch_hive_path', name='fetch_hive_path'),
-
-  url(r'^api/hive/list_sentry_roles_by_group', 'list_sentry_roles_by_group', name='list_sentry_roles_by_group'),
-  url(r'^api/hive/list_sentry_privileges_by_role', 'list_sentry_privileges_by_role', name='list_sentry_privileges_by_role'),
-  url(r'^api/hive/list_sentry_privileges_for_provider$', 'list_sentry_privileges_for_provider', name='list_sentry_privileges_for_provider'),
-  url(r'^api/hive/list_sentry_privileges_by_authorizable', 'list_sentry_privileges_by_authorizable', name='list_sentry_privileges_by_authorizable'),
-  url(r'^api/hive/create_sentry_role', 'create_sentry_role', name='create_sentry_role'),
-  url(r'^api/hive/update_role_groups', 'update_role_groups', name='update_role_groups'),
-  url(r'^api/hive/drop_sentry_role', 'drop_sentry_role', name='drop_sentry_role'),
-  url(r'^api/hive/create_role$', 'create_role', name='create_role'),
-  url(r'^api/hive/save_privileges$', 'save_privileges', name='save_privileges'),
-  url(r'^api/hive/bulk_delete_privileges', 'bulk_delete_privileges', name='bulk_delete_privileges'),
-  url(r'^api/hive/bulk_add_privileges', 'bulk_add_privileges', name='bulk_add_privileges'),
-  url(r'^api/hive/grant_privilege', 'grant_privilege', name='grant_privilege'),
+  url(r'^api/hive/list_sentry_roles_by_group', security_api_hive.list_sentry_roles_by_group, name='list_sentry_roles_by_group'),
+  url(r'^api/hive/list_sentry_privileges_by_role', security_api_hive.list_sentry_privileges_by_role, name='list_sentry_privileges_by_role'),
+  url(r'^api/hive/list_sentry_privileges_for_provider$', security_api_hive.list_sentry_privileges_for_provider, name='list_sentry_privileges_for_provider'),
+  url(r'^api/hive/list_sentry_privileges_by_authorizable', security_api_hive.list_sentry_privileges_by_authorizable, name='list_sentry_privileges_by_authorizable'),
+  url(r'^api/hive/create_sentry_role', security_api_hive.create_sentry_role, name='create_sentry_role'),
+  url(r'^api/hive/update_role_groups', security_api_hive.update_role_groups, name='update_role_groups'),
+  url(r'^api/hive/drop_sentry_role', security_api_hive.drop_sentry_role, name='drop_sentry_role'),
+  url(r'^api/hive/create_role$', security_api_hive.create_role, name='create_role'),
+  url(r'^api/hive/save_privileges$', security_api_hive.save_privileges, name='save_privileges'),
+  url(r'^api/hive/bulk_delete_privileges', security_api_hive.bulk_delete_privileges, name='bulk_delete_privileges'),
+  url(r'^api/hive/bulk_add_privileges', security_api_hive.bulk_add_privileges, name='bulk_add_privileges'),
+  url(r'^api/hive/grant_privilege', security_api_hive.grant_privilege, name='grant_privilege'),
 
   # Unused: API is for blind bulk operations
-  url(r'^api/hive/rename_sentry_privilege', 'rename_sentry_privilege', name='rename_sentry_privilege'),
-)
+  url(r'^api/hive/rename_sentry_privilege', security_api_hive.rename_sentry_privilege, name='rename_sentry_privilege'),
+]
 
 
 # Generic API V2
-urlpatterns += patterns('security.api.sentry',
-  url(r'^api/sentry/fetch_authorizables', 'fetch_authorizables', name='fetch_authorizables'),
+urlpatterns += [
+  url(r'^api/sentry/fetch_authorizables', security_api_sentry.fetch_authorizables, name='fetch_authorizables'),
 
-  url(r'^api/sentry/list_sentry_roles_by_group', 'list_sentry_roles_by_group', name='list_sentry_roles_by_group'),
-  url(r'^api/sentry/list_sentry_privileges_by_role', 'list_sentry_privileges_by_role', name='list_sentry_privileges_by_role'),
-  url(r'^api/sentry/list_sentry_privileges_for_provider$', 'list_sentry_privileges_for_provider', name='list_sentry_privileges_for_provider'),
-  url(r'^api/sentry/list_sentry_privileges_by_authorizable', 'list_sentry_privileges_by_authorizable', name='list_sentry_privileges_by_authorizable'),
-  url(r'^api/sentry/create_sentry_role', 'create_sentry_role', name='create_sentry_role'),
-  url(r'^api/sentry/update_role_groups', 'update_role_groups', name='update_role_groups'),
-  url(r'^api/sentry/drop_sentry_role', 'drop_sentry_role', name='drop_sentry_role'),
-  url(r'^api/sentry/create_role$', 'create_role', name='create_role'),
-  url(r'^api/sentry/save_privileges$', 'save_privileges', name='save_privileges'),
-  url(r'^api/sentry/bulk_delete_privileges', 'bulk_delete_privileges', name='bulk_delete_privileges'),
-  url(r'^api/sentry/bulk_add_privileges', 'bulk_add_privileges', name='bulk_add_privileges'),
-  url(r'^api/sentry/grant_privilege', 'grant_privilege', name='grant_privilege'),
+  url(r'^api/sentry/list_sentry_roles_by_group', security_api_sentry.list_sentry_roles_by_group, name='list_sentry_roles_by_group'),
+  url(r'^api/sentry/list_sentry_privileges_by_role', security_api_sentry.list_sentry_privileges_by_role, name='list_sentry_privileges_by_role'),
+  url(r'^api/sentry/list_sentry_privileges_for_provider$', security_api_sentry.list_sentry_privileges_for_provider, name='list_sentry_privileges_for_provider'),
+  url(r'^api/sentry/list_sentry_privileges_by_authorizable', security_api_sentry.list_sentry_privileges_by_authorizable, name='list_sentry_privileges_by_authorizable'),
+  url(r'^api/sentry/create_sentry_role', security_api_sentry.create_sentry_role, name='create_sentry_role'),
+  url(r'^api/sentry/update_role_groups', security_api_sentry.update_role_groups, name='update_role_groups'),
+  url(r'^api/sentry/drop_sentry_role', security_api_sentry.drop_sentry_role, name='drop_sentry_role'),
+  url(r'^api/sentry/create_role$', security_api_sentry.create_role, name='create_role'),
+  url(r'^api/sentry/save_privileges$', security_api_sentry.save_privileges, name='save_privileges'),
+  url(r'^api/sentry/bulk_delete_privileges', security_api_sentry.bulk_delete_privileges, name='bulk_delete_privileges'),
+  url(r'^api/sentry/bulk_add_privileges', security_api_sentry.bulk_add_privileges, name='bulk_add_privileges'),
+  url(r'^api/sentry/grant_privilege', security_api_sentry.grant_privilege, name='grant_privilege'),
 
   # Unused: API is for blind bulk operations
-  url(r'^api/sentry/rename_sentry_privilege', 'rename_sentry_privilege', name='rename_sentry_privilege'),
-)
+  url(r'^api/sentry/rename_sentry_privilege', security_api_sentry.rename_sentry_privilege, name='rename_sentry_privilege'),
+]

+ 1 - 1
apps/spark/src/spark/urls.py

@@ -15,4 +15,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-urlpatterns = ()
+urlpatterns = []

+ 1 - 1
apps/sqoop/src/sqoop/templates/app.mako

@@ -17,7 +17,7 @@
   from desktop.views import commonheader, commonfooter, _ko
   from desktop import conf
   from django.utils.translation import ugettext as _
-  from django.core.urlresolvers import reverse
+  from django.urls import reverse
 %>
 
 <%namespace name="actionbar" file="actionbar.mako" />

+ 2 - 2
apps/sqoop/src/sqoop/tests.py

@@ -21,7 +21,7 @@ from django.contrib.auth.models import User
 from nose.tools import assert_true, assert_equal
 from nose.plugins.skip import SkipTest
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import add_to_group, grant_access
 
@@ -220,4 +220,4 @@ TO_JOB_CONFIG_VALUES = {
 DRIVER_CONFIG_VALUES = {
   'throttlingConfig.numExtractor': '3',
   'throttlingConfig.numLoaders': '3'
-}
+}

+ 26 - 24
apps/sqoop/src/sqoop/urls.py

@@ -15,29 +15,31 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from sqoop import views as sqoop_views
+from sqoop import api as sqoop_api
 
-urlpatterns = patterns('sqoop.views',
-  url(r'^$', 'app', name='index')
-)
+urlpatterns = [
+  url(r'^$', sqoop_views.app, name='index')
+]
 
-urlpatterns += patterns('sqoop.api',
-  url(r'^api/autocomplete/databases/?$', 'autocomplete', name='autocomplete_databases'),
-  url(r'^api/autocomplete/databases/(?P<database>.+)/tables/?$', 'autocomplete', name='autocomplete_tables'),
-  url(r'^api/autocomplete/databases/(?P<database>.+)/tables/(?P<table>.+)/columns/?$', 'autocomplete', name='autocomplete_fields'),
-  url(r'^api/driver/?$', 'driver', name='driver'),
-  url(r'^api/connectors', 'connectors', name='connectors'),
-  url(r'^api/connectors/(?P<connector_id>\d+)/?$', 'connector', name='connector'),
-  url(r'^api/links/?$', 'links', name='links'),
-  url(r'^api/links/(?P<link_id>\d+)/?$', 'link', name='link'),
-  url(r'^api/links/(?P<link_id>\d+)/clone/?$', 'link_clone', name='link_clone'),
-  url(r'^api/links/(?P<link_id>\d+)/delete/?$', 'link_delete', name='link_delete'),
-  url(r'^api/jobs/?$', 'jobs', name='jobs'),
-  url(r'^api/jobs/(?P<job_id>\d+)/?$', 'job', name='job'),
-  url(r'^api/jobs/(?P<job_id>\d+)/clone/?$', 'job_clone', name='job_clone'),
-  url(r'^api/jobs/(?P<job_id>\d+)/delete/?$', 'job_delete', name='job_delete'),
-  url(r'^api/jobs/(?P<job_id>\d+)/start/?$', 'job_start', name='job_start'),
-  url(r'^api/jobs/(?P<job_id>\d+)/stop/?$', 'job_stop', name='job_stop'),
-  url(r'^api/jobs/(?P<job_id>\d+)/status/?$', 'job_status', name='job_status'),
-  url(r'^api/submissions/?$', 'submissions', name='submissions')
-)
+urlpatterns += [
+  url(r'^api/autocomplete/databases/?$', sqoop_api.autocomplete, name='autocomplete_databases'),
+  url(r'^api/autocomplete/databases/(?P<database>.+)/tables/?$', sqoop_api.autocomplete, name='autocomplete_tables'),
+  url(r'^api/autocomplete/databases/(?P<database>.+)/tables/(?P<table>.+)/columns/?$', sqoop_api.autocomplete, name='autocomplete_fields'),
+  url(r'^api/driver/?$', sqoop_api.driver, name='driver'),
+  url(r'^api/connectors', sqoop_api.connectors, name='connectors'),
+  url(r'^api/connectors/(?P<connector_id>\d+)/?$', sqoop_api.connector, name='connector'),
+  url(r'^api/links/?$', sqoop_api.links, name='links'),
+  url(r'^api/links/(?P<link_id>\d+)/?$', sqoop_api.link, name='link'),
+  url(r'^api/links/(?P<link_id>\d+)/clone/?$', sqoop_api.link_clone, name='link_clone'),
+  url(r'^api/links/(?P<link_id>\d+)/delete/?$', sqoop_api.link_delete, name='link_delete'),
+  url(r'^api/jobs/?$', sqoop_api.jobs, name='jobs'),
+  url(r'^api/jobs/(?P<job_id>\d+)/?$', sqoop_api.job, name='job'),
+  url(r'^api/jobs/(?P<job_id>\d+)/clone/?$', sqoop_api.job_clone, name='job_clone'),
+  url(r'^api/jobs/(?P<job_id>\d+)/delete/?$', sqoop_api.job_delete, name='job_delete'),
+  url(r'^api/jobs/(?P<job_id>\d+)/start/?$', sqoop_api.job_start, name='job_start'),
+  url(r'^api/jobs/(?P<job_id>\d+)/stop/?$', sqoop_api.job_stop, name='job_stop'),
+  url(r'^api/jobs/(?P<job_id>\d+)/status/?$', sqoop_api.job_status, name='job_status'),
+  url(r'^api/submissions/?$', sqoop_api.submissions, name='submissions')
+]

+ 3 - 3
apps/useradmin/src/useradmin/forms.py

@@ -31,7 +31,7 @@ from desktop.settings import LANGUAGES
 
 from useradmin.models import GroupPermission, HuePermission
 from useradmin.models import get_default_user_group
-from useradmin.password_policy import get_password_validators
+from useradmin.hue_password_policy import hue_get_password_validators
 
 
 
@@ -96,11 +96,11 @@ class UserChangeForm(django.contrib.auth.forms.UserChangeForm):
                               widget=forms.
                               PasswordInput,
                               required=False,
-                              validators=get_password_validators())
+                              validators=hue_get_password_validators())
   password2 = forms.CharField(label=_t("Password confirmation"),
                               widget=forms.PasswordInput,
                               required=False,
-                              validators=get_password_validators())
+                              validators=hue_get_password_validators())
   password_old = forms.CharField(label=_t("Current password"), widget=forms.PasswordInput, required=False)
   ensure_home_directory = forms.BooleanField(label=_t("Create home directory"),
                                             help_text=_t("Create home directory if one doesn't already exist."),

+ 1 - 1
apps/useradmin/src/useradmin/password_policy.py → apps/useradmin/src/useradmin/hue_password_policy.py

@@ -65,7 +65,7 @@ def reset_password_policy():
   _PASSWORD_POLICY = None
 
 
-def get_password_validators():
+def hue_get_password_validators():
   def validate_against_policy(password):
     get_password_policy().validate_password(password)
 

+ 3 - 1
apps/useradmin/src/useradmin/models.py

@@ -90,7 +90,9 @@ class UserProfile(models.Model):
   PROPERLY
   """
   # Enum for describing the creation method of a user.
-  CreationMethod = Enum('HUE', 'EXTERNAL')
+  class CreationMethod(Enum):
+    HUE = 1
+    EXTERNAL = 2
 
   user = models.OneToOneField(auth_models.User, unique=True)
   home_directory = models.CharField(editable=True, max_length=1024, null=True)

+ 1 - 1
apps/useradmin/src/useradmin/templates/change_password.mako

@@ -16,7 +16,7 @@
 <%!
 from desktop.views import commonheader, commonfooter
 from django.utils.translation import ugettext as _
-from useradmin.password_policy import is_password_policy_enabled, get_password_hint
+from useradmin.hue_password_policy import is_password_policy_enabled, get_password_hint
 %>
 
 <%namespace name="layout" file="layout.mako" />

+ 1 - 1
apps/useradmin/src/useradmin/templates/edit_user.mako

@@ -18,7 +18,7 @@ from django.utils.translation import ugettext as _
 
 from desktop.views import commonheader, commonfooter
 
-from useradmin.password_policy import is_password_policy_enabled, get_password_hint
+from useradmin.hue_password_policy import is_password_policy_enabled, get_password_hint
 from useradmin.views import is_user_locked_out
 %>
 

+ 1 - 1
apps/useradmin/src/useradmin/test_ldap.py

@@ -27,7 +27,7 @@ from desktop.lib.test_utils import grant_access
 from desktop.lib.django_test_util import make_logged_in_client
 from django.conf import settings
 from django.contrib.auth.models import User, Group
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from useradmin.models import LdapGroup, UserProfile
 from useradmin.models import get_profile

+ 1 - 1
apps/useradmin/src/useradmin/test_ldap_deprecated.py

@@ -27,7 +27,7 @@ from desktop.lib.test_utils import grant_access
 from desktop.lib.django_test_util import make_logged_in_client
 from django.conf import settings
 from django.contrib.auth.models import User, Group
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from useradmin.models import LdapGroup, UserProfile, get_profile
 

+ 2 - 2
apps/useradmin/src/useradmin/tests.py

@@ -30,7 +30,7 @@ from django.contrib.auth.models import User, Group
 from django.contrib.sessions.models import Session
 from django.db.models import Q
 from django.utils.encoding import smart_unicode
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.test.client import Client
 
 import desktop.conf
@@ -46,7 +46,7 @@ import useradmin.ldap_access
 from useradmin.middleware import ConcurrentUserSessionMiddleware
 from useradmin.models import HuePermission, GroupPermission, UserProfile
 from useradmin.models import get_profile, get_default_user_group
-from useradmin.password_policy import reset_password_policy
+from useradmin.hue_password_policy import reset_password_policy
 
 
 def reset_all_users():

+ 23 - 22
apps/useradmin/src/useradmin/urls.py

@@ -15,31 +15,32 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from desktop.lib.django_util import get_username_re_rule, get_groupname_re_rule
+from useradmin import views as useradmin_views
+from useradmin import api as useradmin_api
 
 username_re = get_username_re_rule()
 groupname_re = get_groupname_re_rule()
 
+urlpatterns = [
+  url(r'^$', useradmin_views.list_users),
+  url(r'^users/?$', useradmin_views.list_users),
+  url(r'^groups/?$', useradmin_views.list_groups),
+  url(r'^permissions/?$', useradmin_views.list_permissions),
+  url(r'^configurations/?$', useradmin_views.list_configurations),
+  url(r'^users/edit/(?P<username>%s)$' % (username_re,), useradmin_views.edit_user),
+  url(r'^users/add_ldap_users$', useradmin_views.add_ldap_users),
+  url(r'^users/add_ldap_groups$', useradmin_views.add_ldap_groups),
+  url(r'^users/sync_ldap_users_groups$', useradmin_views.sync_ldap_users_groups),
+  url(r'^groups/edit/(?P<name>%s)$' % (groupname_re,), useradmin_views.edit_group),
+  url(r'^permissions/edit/(?P<app>.+?)/(?P<priv>.+?)/?$', useradmin_views.edit_permission),
+  url(r'^users/new$', useradmin_views.edit_user, name="useradmin.new"),
+  url(r'^groups/new$', useradmin_views.edit_group, name="useradmin.new_group"),
+  url(r'^users/delete', useradmin_views.delete_user),
+  url(r'^groups/delete$', useradmin_views.delete_group),
+]
 
-urlpatterns = patterns('useradmin.views',
-  url(r'^$', 'list_users'),
-  url(r'^users/?$', 'list_users'),
-  url(r'^groups/?$', 'list_groups'),
-  url(r'^permissions/?$', 'list_permissions'),
-  url(r'^configurations/?$', 'list_configurations'),
-  url(r'^users/edit/(?P<username>%s)$' % (username_re,), 'edit_user'),
-  url(r'^users/add_ldap_users$', 'add_ldap_users'),
-  url(r'^users/add_ldap_groups$', 'add_ldap_groups'),
-  url(r'^users/sync_ldap_users_groups$', 'sync_ldap_users_groups'),
-  url(r'^groups/edit/(?P<name>%s)$' % (groupname_re,), 'edit_group'),
-  url(r'^permissions/edit/(?P<app>.+?)/(?P<priv>.+?)/?$', 'edit_permission'),
-  url(r'^users/new$', 'edit_user', name="useradmin.new"),
-  url(r'^groups/new$', 'edit_group', name="useradmin.new_group"),
-  url(r'^users/delete', 'delete_user'),
-  url(r'^groups/delete$', 'delete_group'),
-)
-
-urlpatterns += patterns('useradmin.api',
-  url(r'^api/get_users/?', 'get_users', name='api_get_users'),
-)
+urlpatterns += [
+  url(r'^api/get_users/?', useradmin_api.get_users, name='api_get_users'),
+]

+ 2 - 2
apps/useradmin/src/useradmin/views.py

@@ -31,7 +31,7 @@ import ldap_access
 from ldap_access import LdapBindException, LdapSearchException
 
 from django.contrib.auth.models import User, Group
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.forms import ValidationError
 from django.forms.utils import ErrorList
 from django.http import HttpResponse
@@ -364,7 +364,7 @@ def edit_user(request, username=None):
         if request.user.is_superuser:
           return redirect(reverse('about:index'))
         else:
-          return redirect(reverse('desktop.views.home'))
+          return redirect(reverse('desktop_views_home'))
       elif request.user.is_superuser:
         if is_embeddable:
           return JsonResponse({'url': '/hue' + reverse(list_users)})

+ 12 - 12
apps/zookeeper/src/zookeeper/urls.py

@@ -15,16 +15,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from zookeeper import views as zookeeper_views
 
-
-urlpatterns = patterns('zookeeper.views',
-  url(r'^$', 'index', name='index'),
-  url(r'view/(?P<id>\w+)$', 'view', name='view'),
-  url(r'clients/(?P<id>\w+)/(?P<host>.+)$', 'clients', name='clients'),
-  url(r'tree/(?P<id>\w+)/(?P<path>.+)$', 'tree', name='tree'),
-  url(r'create/(?P<id>\w+)/(?P<path>.*)$', 'create', name='create'),
-  url(r'delete/(?P<id>\w+)/(?P<path>.*)$', 'delete', name='delete'),
-  url(r'edit/base64/(?P<id>\w+)/(?P<path>.*)$', 'edit_as_base64', name='edit_as_base64'),
-  url(r'edit/text/(?P<id>\w+)/(?P<path>.*)$', 'edit_as_text', name='edit_as_text'),
-)
+urlpatterns = [
+  url(r'^$', zookeeper_views.index, name='index'),
+  url(r'view/(?P<id>\w+)$', zookeeper_views.view, name='view'),
+  url(r'clients/(?P<id>\w+)/(?P<host>.+)$', zookeeper_views.clients, name='clients'),
+  url(r'tree/(?P<id>\w+)/(?P<path>.+)$', zookeeper_views.tree, name='tree'),
+  url(r'create/(?P<id>\w+)/(?P<path>.*)$', zookeeper_views.create, name='create'),
+  url(r'delete/(?P<id>\w+)/(?P<path>.*)$', zookeeper_views.delete, name='delete'),
+  url(r'edit/base64/(?P<id>\w+)/(?P<path>.*)$', zookeeper_views.edit_as_base64, name='edit_as_base64'),
+  url(r'edit/text/(?P<id>\w+)/(?P<path>.*)$', zookeeper_views.edit_as_text, name='edit_as_text'),
+]

+ 1 - 1
apps/zookeeper/src/zookeeper/views.py

@@ -20,7 +20,7 @@ import json
 import logging
 
 from django.http import Http404
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 
 from desktop.lib.django_util import JsonResponse, render

+ 28 - 5
desktop/core/ext-py/Django-1.10/django/template/context.py

@@ -200,6 +200,24 @@ class RenderContext(BaseContext):
     def __getitem__(self, key):
         return self.dicts[-1][key]
 
+from django.utils.module_loading import import_string
+_standard_context_processors = None
+
+# This is a function rather than module-level procedural code because we only
+# want it to execute if somebody uses RequestContext.
+def get_standard_processors():
+    from django.conf import settings
+    global _standard_context_processors
+    if _standard_context_processors is None:
+        processors = []
+        collect = []
+        collect.extend(_builtin_context_processors)
+        collect.extend(settings.GTEMPLATE_CONTEXT_PROCESSORS)
+        for path in collect:
+            func = import_string(path)
+            processors.append(func)
+        _standard_context_processors = tuple(processors)
+    return _standard_context_processors
 
 class RequestContext(Context):
     """
@@ -215,12 +233,17 @@ class RequestContext(Context):
         self._processors = () if processors is None else tuple(processors)
         self._processors_index = len(self.dicts)
 
-        # placeholder for context processors output
-        self.update({})
+        updates = dict()
+        for processor in get_standard_processors():
+            updates.update(processor(request))
+        self.update(updates)
 
-        # empty dict for any new modifications
-        # (so that context processors don't overwrite them)
-        self.update({})
+        # # placeholder for context processors output
+        # self.update({})
+
+        # # empty dict for any new modifications
+        # # (so that context processors don't overwrite them)
+        # self.update({})
 
     @contextmanager
     def bind_template(self, template):

+ 2 - 2
desktop/core/ext-py/django-axes-2.2.0/axes/tests.py

@@ -7,8 +7,8 @@ import datetime
 from django.test import TestCase
 from django.test.utils import override_settings
 from django.contrib.auth.models import User
-from django.core.urlresolvers import NoReverseMatch
-from django.core.urlresolvers import reverse
+from django.urls import NoReverseMatch
+from django.urls import reverse
 from django.utils import six
 
 from axes.decorators import COOLOFF_TIME

+ 1 - 1
desktop/core/ext-py/django-extensions-1.8.0/django_extensions/admin/widgets.py

@@ -7,7 +7,7 @@ from django.contrib.admin.widgets import ForeignKeyRawIdWidget
 try:
     from django.urls import reverse
 except ImportError:
-    from django.core.urlresolvers import reverse
+    from django.urls import reverse
 from django.template.loader import render_to_string
 from django.utils.safestring import mark_safe
 from django.utils.text import Truncator

+ 1 - 1
desktop/core/ext-py/django-extensions-1.8.0/django_extensions/management/commands/show_urls.py

@@ -10,7 +10,7 @@ from django.core.management.base import BaseCommand, CommandError
 try:
     from django.urls import RegexURLPattern, RegexURLResolver, LocaleRegexURLResolver
 except ImportError:
-    from django.core.urlresolvers import RegexURLPattern, RegexURLResolver, LocaleRegexURLResolver
+    from django.urls import RegexURLPattern, RegexURLResolver, LocaleRegexURLResolver
 from django.utils import translation
 
 from django_extensions.management.color import color_style, no_style

+ 2 - 2
desktop/core/ext-py/django-openid-auth-0.5/django_openid_auth/management/commands/openid_cleanup.py

@@ -26,12 +26,12 @@
 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 from django_openid_auth.store import DjangoOpenIDStore
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
     help = 'Clean up stale OpenID associations and nonces'
 
     def handle_noargs(self, **options):

+ 1 - 1
desktop/core/ext-py/django-openid-auth-0.5/django_openid_auth/views.py

@@ -35,7 +35,7 @@ from django.conf import settings
 from django.contrib.auth import (
     REDIRECT_FIELD_NAME, authenticate, login as auth_login)
 from django.contrib.auth.models import Group
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.http import HttpResponse, HttpResponseRedirect
 from django.shortcuts import render_to_response
 from django.template import RequestContext

+ 1 - 1
desktop/core/ext-py/djangomako-1.0.1/djangomako/backends.py

@@ -10,7 +10,7 @@ get_template() and optionally from_string().
 
 import tempfile
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.contrib.staticfiles.templatetags.staticfiles import static
 from django.template.base import TemplateDoesNotExist, TemplateSyntaxError
 from django.template.backends.base import BaseEngine

+ 1 - 1
desktop/core/ext-py/python-openid-2.2.5/examples/djopenid/util.py

@@ -10,7 +10,7 @@ from django.template.context import RequestContext
 from django.template import loader
 from django import http
 from django.core.exceptions import ImproperlyConfigured
-from django.core.urlresolvers import reverse as reverseURL
+from django.urls import reverse as reverseURL
 from django.views.generic.simple import direct_to_template
 
 from django.conf import settings

+ 4 - 4
desktop/core/src/desktop/app_template/src/app_name/urls.py

@@ -15,8 +15,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns('${app_name}',
-  url(r'^$', 'views.index'),
-)
+urlpatterns = [
+  url(r'^$', ${app_name}.views.index),
+]

+ 5 - 4
desktop/core/src/desktop/app_template_proxy/src/app_name/urls.py

@@ -15,8 +15,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+import ${app_name}
 
-urlpatterns = patterns('${app_name}',
-  url(r'^$', 'views.index'),
-)
+urlpatterns = [
+  url(r'^$', ${app_name}.views.index),
+]

+ 2 - 2
desktop/core/src/desktop/auth/forms.py

@@ -27,7 +27,7 @@ from django.utils.safestring import mark_safe
 from django.utils.translation import ugettext_lazy as _t, ugettext as _
 
 from desktop import conf
-from useradmin.password_policy import get_password_validators
+from useradmin.hue_password_policy import hue_get_password_validators
 
 
 LOG = logging.getLogger(__name__)
@@ -171,7 +171,7 @@ class UserCreationForm(AuthUserCreationForm):
   """
   password = CharField(label=_t("Password"),
                        widget=PasswordInput(attrs={'class': 'input-large'}),
-                       validators=get_password_validators())
+                       validators=hue_get_password_validators())
 
   def __init__(self, data=None, *args, **kwargs):
     if data and 'password' in data:

+ 1 - 1
desktop/core/src/desktop/auth/views.py

@@ -172,7 +172,7 @@ def dt_login(request, from_modal=False):
     renderable_path = 'login_modal.mako'
 
   response = render(renderable_path, request, {
-    'action': urlresolvers.reverse('desktop.auth.views.dt_login'),
+    'action': urlresolvers.reverse('desktop_auth_views_dt_login'),
     'form': first_user_form or auth_form,
     'next': redirect_to,
     'first_login_ever': is_first_login_ever,

+ 1 - 1
desktop/core/src/desktop/lib/django_mako.py

@@ -129,7 +129,7 @@ def render_to_response(template_name, data_dictionary, **kwargs):
 
 def url(view_name, *args, **view_args):
   """URL tag for use in templates - like {% url ... %} in django"""
-  from django.core.urlresolvers import reverse
+  from django.urls import reverse
   return reverse(view_name, args=args, kwargs=view_args)
 
 from django.template.context_processors import csrf

+ 2 - 1
desktop/core/src/desktop/lib/django_util.py

@@ -222,9 +222,10 @@ def render(template, request, data, json=None, template_lib=None, force_template
     else:
       return render_json(data, request.GET.get("callback"), status=status)
   else:
+    x=RequestContext(request, data)
     return _render_to_response(template,
                                request,
-                               RequestContext(request, data),
+                               x,
                                template_lib=template_lib,
                                status=status,
                                **kwargs)

+ 2 - 2
desktop/core/src/desktop/lib/tasks/compress_files/compress_utils.py

@@ -17,7 +17,7 @@
 
 import json
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 
 from desktop.conf import DEFAULT_USER
@@ -58,4 +58,4 @@ def _upload_compress_files_script_to_hdfs(fs):
   if not fs.do_as_user(DEFAULT_USER.get(), fs.exists, '/user/' + DEFAULT_USER.get() + '/common/compress_files_in_hdfs.sh'):
     fs.do_as_user(DEFAULT_USER.get(), fs.copyFromLocal, get_desktop_root() + '/core/src/desktop/lib/tasks/compress_files/compress_in_hdfs.sh',
                           '/user/' + DEFAULT_USER.get() + '/common/compress_files_in_hdfs.sh')
-    fs.do_as_user(DEFAULT_USER.get(), fs.chmod, '/user/' + DEFAULT_USER.get() + '/common/', 0755)
+    fs.do_as_user(DEFAULT_USER.get(), fs.chmod, '/user/' + DEFAULT_USER.get() + '/common/', 0755)

+ 1 - 1
desktop/core/src/desktop/lib/tasks/extract_archive/extract_utils.py

@@ -18,7 +18,7 @@
 import json
 import urllib
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 
 from desktop.conf import DEFAULT_USER

+ 3 - 3
desktop/core/src/desktop/lib/test_runners.py

@@ -85,9 +85,9 @@ class HueTestRunner(NoseTestSuiteRunner):
 
     # Skip over 'manage.py test' and any arguments handled by django.
     django_opts = ['--noinput', '--liveserver', '-p', '--pattern']
-    for opt in BaseCommand.option_list:
-      django_opts.extend(opt._long_opts)
-      django_opts.extend(opt._short_opts)
+    #for opt in BaseCommand.option_list:
+    #  django_opts.extend(opt._long_opts)
+    #  django_opts.extend(opt._short_opts)
 
     nose_argv.extend(translate_option(opt) for opt in sys.argv[1:]
     if opt.startswith('-') and not any(opt.startswith(d) for d in django_opts))

+ 2 - 2
desktop/core/src/desktop/management/commands/config_dump.py

@@ -21,7 +21,7 @@ Note that this dump representation is not machine readable;
 this command is still a few steps away from dumping a ConfigObj-compatible,
 textual representation.
 """
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 import desktop.appmanager
 import textwrap
 
@@ -29,7 +29,7 @@ from django.utils.translation import ugettext as _
 
 from desktop.lib.conf import BoundContainer, is_anonymous
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   def __init__(self, *args, **kwargs):
     super(Command, self).__init__(*args, **kwargs)
     self.indent = 0

+ 2 - 2
desktop/core/src/desktop/management/commands/config_help.py

@@ -14,10 +14,10 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 import desktop.appmanager
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   """Prints documentation for configuration."""
   def handle_noargs(self, **options):
     desktop.lib.conf.GLOBAL_CONFIG.print_help(skip_header=True)

+ 2 - 2
desktop/core/src/desktop/management/commands/convert_documents.py

@@ -20,12 +20,12 @@ import sys
 import time
 
 from django.contrib.auth.models import User
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 from django.db import transaction
 
 from desktop.converters import DocumentConverter
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
   def handle_noargs(self, **options):
     print 'Starting document conversions...\n'

+ 3 - 3
desktop/core/src/desktop/management/commands/create_test_fs.py

@@ -15,17 +15,17 @@
 # limitations under the License.
 import os
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 from desktop.lib.paths import get_build_dir
 from hadoop.fs import fs_for_testing
 from django.utils.translation import ugettext as _
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   """Creates file system for testing."""
   def handle_noargs(self, **options):
     fs_dir = os.path.join(get_build_dir(), "fs")
     if not os.path.isdir(fs_dir):
       os.makedirs(fs_dir)
     fs_for_testing.create(fs_dir)
-    print _("Created fs in: %(dir)s") % {'dir': fs_dir}
+    print _("Created fs in: %(dir)s") % {'dir': fs_dir}

+ 2 - 2
desktop/core/src/desktop/management/commands/generate_mdl.py

@@ -20,14 +20,14 @@ Dumps a Cloudera Manager Monitor Descriptor file.
 
 import json
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 # Force loading the metrics
 import desktop.urls
 from desktop.lib.metrics import global_registry
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   def handle_noargs(self, **options):
     """Generates a Monitor Descriptor file."""
     registry = global_registry()

+ 2 - 2
desktop/core/src/desktop/management/commands/is_db_alive.py

@@ -19,7 +19,7 @@
 import logging
 import sys
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 from django.core.exceptions import ImproperlyConfigured
 from django.db import connections
 from django.db.utils import OperationalError
@@ -28,7 +28,7 @@ from django.db.utils import OperationalError
 LOG = logging.getLogger(__name__)
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
   help = """Check if Hue can is configured properly to use its database.
 

+ 2 - 2
desktop/core/src/desktop/management/commands/kt_renewer.py

@@ -15,10 +15,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 import desktop.kt_renewer
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   """ Starts a daemon which renews Kerberos credentials from a keytab
   periodically. """
   def handle_noargs(self, **options):

+ 2 - 2
desktop/core/src/desktop/management/commands/ldaptest.py

@@ -35,7 +35,7 @@ import socket
 import sys
 
 from desktop.conf import LDAP
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 from django.utils.translation import ugettext as _
 from useradmin import ldap_access
 
@@ -137,7 +137,7 @@ will typically work with Active Directory/LDAP. Typically this is member
 for Active Directory and LDAP.
 """
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   def print_ldap_global_settings(self, cfg, is_multi_ldap):
     LOG.info('[desktop]')
     LOG.info('[[ldap]]')

+ 2 - 2
desktop/core/src/desktop/management/commands/sync_documents.py

@@ -17,12 +17,12 @@
 
 import logging
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 from desktop.models import Document
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
   def handle_noargs(self, **options):
     logging.info('Running syncing document command.')

+ 5 - 6
desktop/core/src/desktop/management/commands/test_windmill.py

@@ -45,12 +45,9 @@ class ServerContainer(object):
 class Command(BaseCommand):
   """Runs windmill tests."""
 
-  option_list = BaseCommand.option_list + (
-      make_option('-p', '--port', 
-        type=int, 
-        default=DEFAULT_PORT,
-        help='Port number to use for server.'),
-  )
+  def add_arguments(self, parser):
+    parser.add_argument('-p', '--port', type=int, default=DEFAULT_PORT, dest='port',
+        help='Port number to use for server.')
 
   def setup_test_db(self):
     """
@@ -86,6 +83,8 @@ class Command(BaseCommand):
     from windmill.conf import global_settings
     import nose
 
+    self.port = options['port']
+
     # Setup DB
     self.setup_test_db()
 

+ 2 - 2
desktop/core/src/desktop/management/commands/version.py

@@ -18,12 +18,12 @@
 import os
 
 from django.conf import settings
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 from desktop.lib.paths import get_desktop_root
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
   def handle_noargs(self, **options):
     cdh_path = os.path.join(get_desktop_root(), '..', 'cloudera', 'cdh_version.properties')

+ 1 - 1
desktop/core/src/desktop/middleware.py

@@ -36,7 +36,7 @@ from django.contrib.auth.models import User
 from django.core import exceptions, urlresolvers
 import django.db
 from django.http import HttpResponseNotAllowed, HttpResponseForbidden
-from django.core.urlresolvers import resolve
+from django.urls import resolve
 from django.http import HttpResponseRedirect, HttpResponse
 from django.utils.translation import ugettext as _
 from django.utils.http import urlquote, is_safe_url

Some files were not shown because too many files changed in this diff