Ver Fonte

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 há 8 anos atrás
pai
commit
a7122cb0ed
100 ficheiros alterados com 714 adições e 661 exclusões
  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.
 ## 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.encoding import smart_unicode
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
@@ -190,7 +190,7 @@ ${ layout.menubar(section='quick_start') }
                 <i class="fa fa-home"></i> ${ _('Landing page') }
                 <i class="fa fa-home"></i> ${ _('Landing page') }
               </a>
               </a>
               % else:
               % else:
-                <a href="${ url('desktop.views.home2') }">
+                <a href="${ url('desktop_views_home2') }">
                   <i class="fa fa-home"></i> ${ _('Home') }
                   <i class="fa fa-home"></i> ${ _('Home') }
                 </a>
                 </a>
               % endif
               % endif
@@ -227,7 +227,7 @@ ${ layout.menubar(section='quick_start') }
           <span class="muted">${ _('Hue and the Hue logo are trademarks of Cloudera, Inc.') }</span>
           <span class="muted">${ _('Hue and the Hue logo are trademarks of Cloudera, Inc.') }</span>
           % if not user.is_authenticated():
           % if not user.is_authenticated():
             <br/>
             <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
           % endif
         </p>
         </p>
        </div>
        </div>
@@ -378,7 +378,7 @@ $(document).ready(function(){
   });
   });
 
 
   $("#doneBtn").click(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 () {
   $(".updatePreferences").click(function () {

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

@@ -18,7 +18,7 @@
 import json
 import json
 
 
 from django.contrib.auth.models import User
 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
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
 import re
 
 
 from django.contrib.auth.models import User
 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.http import Http404
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 from django.views.decorators.http import require_POST
 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
 import logging
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 from desktop.lib import django_mako
 from desktop.lib import django_mako
 from desktop.lib.django_util import render
 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 logging
 import re
 import re
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.http import QueryDict
 from django.http import QueryDict
 from django.utils.translation import ugettext as _
 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.db import models
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
 from django.contrib.contenttypes.fields import GenericRelation
 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 django.utils.translation import ugettext as _, ugettext_lazy as _t
 
 
 from enum import Enum
 from enum import Enum
@@ -49,12 +49,17 @@ BEESWAX = 'beeswax'
 HIVE_SERVER2 = 'hiveserver2'
 HIVE_SERVER2 = 'hiveserver2'
 QUERY_TYPES = (HQL, IMPALA, RDBMS, SPARK) = range(4)
 QUERY_TYPES = (HQL, IMPALA, RDBMS, SPARK) = range(4)
 
 
-
 class QueryHistory(models.Model):
 class QueryHistory(models.Model):
   """
   """
   Holds metadata about all queries that have been executed.
   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'),
   SERVER_TYPE = ((BEESWAX, 'Beeswax'), (HIVE_SERVER2, 'Hive Server 2'),
                  (librdbms_dbms.MYSQL, 'MySQL'), (librdbms_dbms.POSTGRESQL, 'PostgreSQL'),
                  (librdbms_dbms.MYSQL, 'MySQL'), (librdbms_dbms.POSTGRESQL, 'PostgreSQL'),
                  (librdbms_dbms.SQLITE, 'sqlite'), (librdbms_dbms.ORACLE, 'oracle'))
                  (librdbms_dbms.SQLITE, 'sqlite'), (librdbms_dbms.ORACLE, 'oracle'))
@@ -149,28 +154,28 @@ class QueryHistory(models.Model):
       return is_statement_finished
       return is_statement_finished
 
 
   def is_running(self):
   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):
   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):
   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):
   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):
   def set_to_running(self):
-    self.last_state = QueryHistory.STATE.running.index
+    self.last_state = QueryHistory.STATE.running.value
 
 
   def set_to_failed(self):
   def set_to_failed(self):
-    self.last_state = QueryHistory.STATE.failed.index
+    self.last_state = QueryHistory.STATE.failed.value
 
 
   def set_to_available(self):
   def set_to_available(self):
-    self.last_state = QueryHistory.STATE.available.index
+    self.last_state = QueryHistory.STATE.available.value
 
 
   def set_to_expired(self):
   def set_to_expired(self):
-    self.last_state = QueryHistory.STATE.expired.index
+    self.last_state = QueryHistory.STATE.expired.value
 
 
   def save(self, *args, **kwargs):
   def save(self, *args, **kwargs):
     """
     """

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

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

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

@@ -26,7 +26,7 @@ import threading
 import time
 import time
 
 
 from nose.tools import assert_true, assert_false
 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 django.contrib.auth.models import User
 
 
 from desktop.lib.django_test_util import make_logged_in_client
 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.encoding import smart_str
 from django.utils.html import escape
 from django.utils.html import escape
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.db import transaction
 from django.db import transaction
 
 
 from desktop.lib.exceptions_renderable import PopupException
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
   # 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.shortcuts import redirect
 from django.utils.html import escape
 from django.utils.html import escape
 from django.utils.translation import ugettext as _
 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.appmanager import get_apps_dict
 from desktop.conf import ENABLE_DOWNLOAD, REDIRECT_WHITELIST
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
   # 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)
   # 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
   # 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
 # 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.contrib.auth.models import User, Group
 from django.core.paginator import EmptyPage
 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.template.defaultfilters import stringformat, filesizeformat
 from django.http import Http404, StreamingHttpResponse, HttpResponseNotModified, HttpResponseForbidden, HttpResponse
 from django.http import Http404, StreamingHttpResponse, HttpResponseNotModified, HttpResponseForbidden, HttpResponse
 from django.views.decorators.http import require_http_methods
 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.s3fs import S3FileSystemException
 from aws.s3.s3test_utils import get_test_bucket
 from aws.s3.s3test_utils import get_test_bucket
 from django.contrib.auth.models import User
 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 django.utils.encoding import smart_str
 from nose.plugins.attrib import attr
 from nose.plugins.attrib import attr
 from nose.plugins.skip import SkipTest
 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 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 hadoop.pseudo_hdfs4 import is_live_cluster
 from nose.plugins.skip import SkipTest
 from nose.plugins.skip import SkipTest
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 
 
 def test_security_plain():
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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 nose.tools import assert_true, assert_equal, assert_false
 
 
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 import desktop.conf as desktop_conf
 import desktop.conf as desktop_conf
 from desktop.lib.django_test_util import make_logged_in_client
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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 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
 urlpatterns += beeswax_urls

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

@@ -20,7 +20,10 @@ import logging
 import functools
 import functools
 import re
 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.html import escape
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 

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

@@ -23,7 +23,7 @@ import time
 import unittest
 import unittest
 
 
 from django.contrib.auth.models import User
 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.plugins.skip import SkipTest
 from nose.tools import assert_true, assert_false, assert_equal, assert_raises
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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"
   # "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
   # 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
   # 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
 # 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.http import HttpResponseRedirect
 from django.utils.functional import wraps
 from django.utils.functional import wraps
 from django.utils.translation import ugettext as _
 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.log.access import access_log_level
 from desktop.lib.rest.http_client import RestException
 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 nose.tools import assert_true, assert_false, assert_equal, assert_raises
 from django.contrib.auth.models import User
 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.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import grant_access, add_to_group
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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 /
   # 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
   # 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.
   # 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.utils.encoding import smart_str
 from django.contrib.auth.models import User, Group
 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.django_test_util import make_logged_in_client, assert_equal_mod_whitespace
 from desktop.lib.test_utils import add_permission, grant_access
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
 import urllib
 
 
 from django.db.models import Q
 from django.db.models import Q
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.functional import wraps
 from django.utils.functional import wraps
 from django.utils.translation import ugettext as _
 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 lxml import etree
 
 
 from django.core import management
 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.db import transaction
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
@@ -43,7 +43,7 @@ from oozie.importlib.bundles import import_bundle_root
 LOG = logging.getLogger(__name__)
 LOG = logging.getLogger(__name__)
 
 
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
 
   def _import_workflows(self, directory, managed=True):
   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 import models, transaction
 from django.db.models import Q
 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.core.validators import RegexValidator
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
 from django.contrib.contenttypes.fields import GenericRelation
 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 string import Template
 from xml.sax.saxutils import escape
 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.db.models import Q
 from django.utils.encoding import force_unicode
 from django.utils.encoding import force_unicode
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _

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

@@ -21,7 +21,7 @@ import logging
 import re
 import re
 
 
 from django.contrib.auth.models import User
 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 django.db.models import Q
 
 
 from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal, assert_raises
 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.plugins.skip import SkipTest
 from nose.tools import raises, assert_true, assert_false, assert_equal, assert_not_equal
 from nose.tools import raises, assert_true, assert_false, assert_equal, assert_not_equal
 from django.contrib.auth.models import User
 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.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
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
 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.http import HttpResponse
 from django.utils.functional import wraps
 from django.utils.functional import wraps
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 
 
 from desktop.conf import TIME_ZONE
 from desktop.conf import TIME_ZONE

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

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

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

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

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

@@ -19,7 +19,7 @@ import json
 import logging
 import logging
 import time
 import time
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from desktop.lib.i18n import smart_str
 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
 import os
 
 
 from django.core import management
 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.db import transaction
 from django.utils.translation import ugettext as _
 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__)
 LOG = logging.getLogger(__name__)
 
 
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
 
   def install_pig_script(self, sample_user):
   def install_pig_script(self, sample_user):
     doc2 = None
     doc2 = None

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

@@ -21,7 +21,7 @@ import posixpath
 from django.db import models
 from django.db import models
 from django.contrib.auth.models import User
 from django.contrib.auth.models import User
 from django.contrib.contenttypes.fields import GenericRelation
 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 django.utils.translation import ugettext as _, ugettext_lazy as _t
 
 
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.exceptions_renderable import PopupException

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

@@ -20,7 +20,7 @@ import json
 import time
 import time
 
 
 from django.contrib.auth.models import User
 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.plugins.skip import SkipTest
 from nose.tools import assert_true, assert_equal, assert_false
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
   # 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 json
 import logging
 import logging
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 from django.views.decorators.csrf import ensure_csrf_cookie
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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.
   # 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 os
 import uuid
 import uuid
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from nose.tools import assert_true, assert_equal
 from nose.tools import assert_true, assert_equal
 
 
 from desktop.lib.django_test_util import make_logged_in_client
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
 # 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
 # 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 functools import wraps
 
 
 from django.utils.translation import ugettext as _
 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.context_processors import get_app_name
 from desktop.models import Document
 from desktop.models import Document

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

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

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

@@ -20,7 +20,7 @@ import logging
 import re
 import re
 
 
 from django.contrib.auth.models import User
 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.db import models
 from django.utils.html import escape
 from django.utils.html import escape
 from django.utils.translation import ugettext_lazy as _t
 from django.utils.translation import ugettext_lazy as _t

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

@@ -19,7 +19,7 @@
 import json
 import json
 
 
 from django.contrib.auth.models import User
 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
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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.
 # 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
   # 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
 import json
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from nose.plugins.skip import SkipTest
 from nose.plugins.skip import SkipTest
 from nose.tools import assert_equal
 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 desktop.lib.test_utils import grant_access
 
 
 from django.contrib.auth.models import User, Group
 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
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
   # 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
 # 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
   # 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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.views import commonheader, commonfooter, _ko
   from desktop import conf
   from desktop import conf
   from django.utils.translation import ugettext as _
   from django.utils.translation import ugettext as _
-  from django.core.urlresolvers import reverse
+  from django.urls import reverse
 %>
 %>
 
 
 <%namespace name="actionbar" file="actionbar.mako" />
 <%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.tools import assert_true, assert_equal
 from nose.plugins.skip import SkipTest
 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.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import add_to_group, grant_access
 from desktop.lib.test_utils import add_to_group, grant_access
 
 
@@ -220,4 +220,4 @@ TO_JOB_CONFIG_VALUES = {
 DRIVER_CONFIG_VALUES = {
 DRIVER_CONFIG_VALUES = {
   'throttlingConfig.numExtractor': '3',
   'throttlingConfig.numExtractor': '3',
   'throttlingConfig.numLoaders': '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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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 GroupPermission, HuePermission
 from useradmin.models import get_default_user_group
 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.
                               widget=forms.
                               PasswordInput,
                               PasswordInput,
                               required=False,
                               required=False,
-                              validators=get_password_validators())
+                              validators=hue_get_password_validators())
   password2 = forms.CharField(label=_t("Password confirmation"),
   password2 = forms.CharField(label=_t("Password confirmation"),
                               widget=forms.PasswordInput,
                               widget=forms.PasswordInput,
                               required=False,
                               required=False,
-                              validators=get_password_validators())
+                              validators=hue_get_password_validators())
   password_old = forms.CharField(label=_t("Current password"), widget=forms.PasswordInput, required=False)
   password_old = forms.CharField(label=_t("Current password"), widget=forms.PasswordInput, required=False)
   ensure_home_directory = forms.BooleanField(label=_t("Create home directory"),
   ensure_home_directory = forms.BooleanField(label=_t("Create home directory"),
                                             help_text=_t("Create home directory if one doesn't already exist."),
                                             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
   _PASSWORD_POLICY = None
 
 
 
 
-def get_password_validators():
+def hue_get_password_validators():
   def validate_against_policy(password):
   def validate_against_policy(password):
     get_password_policy().validate_password(password)
     get_password_policy().validate_password(password)
 
 

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

@@ -90,7 +90,9 @@ class UserProfile(models.Model):
   PROPERLY
   PROPERLY
   """
   """
   # Enum for describing the creation method of a user.
   # 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)
   user = models.OneToOneField(auth_models.User, unique=True)
   home_directory = models.CharField(editable=True, max_length=1024, null=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 desktop.views import commonheader, commonfooter
 from django.utils.translation import ugettext as _
 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" />
 <%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 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
 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 desktop.lib.django_test_util import make_logged_in_client
 from django.conf import settings
 from django.conf import settings
 from django.contrib.auth.models import User, Group
 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 LdapGroup, UserProfile
 from useradmin.models import get_profile
 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 desktop.lib.django_test_util import make_logged_in_client
 from django.conf import settings
 from django.conf import settings
 from django.contrib.auth.models import User, Group
 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
 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.contrib.sessions.models import Session
 from django.db.models import Q
 from django.db.models import Q
 from django.utils.encoding import smart_unicode
 from django.utils.encoding import smart_unicode
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.test.client import Client
 from django.test.client import Client
 
 
 import desktop.conf
 import desktop.conf
@@ -46,7 +46,7 @@ import useradmin.ldap_access
 from useradmin.middleware import ConcurrentUserSessionMiddleware
 from useradmin.middleware import ConcurrentUserSessionMiddleware
 from useradmin.models import HuePermission, GroupPermission, UserProfile
 from useradmin.models import HuePermission, GroupPermission, UserProfile
 from useradmin.models import get_profile, get_default_user_group
 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():
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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 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()
 username_re = get_username_re_rule()
 groupname_re = get_groupname_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 ldap_access import LdapBindException, LdapSearchException
 
 
 from django.contrib.auth.models import User, Group
 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 import ValidationError
 from django.forms.utils import ErrorList
 from django.forms.utils import ErrorList
 from django.http import HttpResponse
 from django.http import HttpResponse
@@ -364,7 +364,7 @@ def edit_user(request, username=None):
         if request.user.is_superuser:
         if request.user.is_superuser:
           return redirect(reverse('about:index'))
           return redirect(reverse('about:index'))
         else:
         else:
-          return redirect(reverse('desktop.views.home'))
+          return redirect(reverse('desktop_views_home'))
       elif request.user.is_superuser:
       elif request.user.is_superuser:
         if is_embeddable:
         if is_embeddable:
           return JsonResponse({'url': '/hue' + reverse(list_users)})
           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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
 import logging
 
 
 from django.http import Http404
 from django.http import Http404
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from desktop.lib.django_util import JsonResponse, render
 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):
     def __getitem__(self, key):
         return self.dicts[-1][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):
 class RequestContext(Context):
     """
     """
@@ -215,12 +233,17 @@ class RequestContext(Context):
         self._processors = () if processors is None else tuple(processors)
         self._processors = () if processors is None else tuple(processors)
         self._processors_index = len(self.dicts)
         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
     @contextmanager
     def bind_template(self, template):
     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 import TestCase
 from django.test.utils import override_settings
 from django.test.utils import override_settings
 from django.contrib.auth.models import User
 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 django.utils import six
 
 
 from axes.decorators import COOLOFF_TIME
 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:
 try:
     from django.urls import reverse
     from django.urls import reverse
 except ImportError:
 except ImportError:
-    from django.core.urlresolvers import reverse
+    from django.urls import reverse
 from django.template.loader import render_to_string
 from django.template.loader import render_to_string
 from django.utils.safestring import mark_safe
 from django.utils.safestring import mark_safe
 from django.utils.text import Truncator
 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:
 try:
     from django.urls import RegexURLPattern, RegexURLResolver, LocaleRegexURLResolver
     from django.urls import RegexURLPattern, RegexURLResolver, LocaleRegexURLResolver
 except ImportError:
 except ImportError:
-    from django.core.urlresolvers import RegexURLPattern, RegexURLResolver, LocaleRegexURLResolver
+    from django.urls import RegexURLPattern, RegexURLResolver, LocaleRegexURLResolver
 from django.utils import translation
 from django.utils import translation
 
 
 from django_extensions.management.color import color_style, no_style
 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
 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 # 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
 from django_openid_auth.store import DjangoOpenIDStore
 
 
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
     help = 'Clean up stale OpenID associations and nonces'
     help = 'Clean up stale OpenID associations and nonces'
 
 
     def handle_noargs(self, **options):
     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 (
 from django.contrib.auth import (
     REDIRECT_FIELD_NAME, authenticate, login as auth_login)
     REDIRECT_FIELD_NAME, authenticate, login as auth_login)
 from django.contrib.auth.models import Group
 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.http import HttpResponse, HttpResponseRedirect
 from django.shortcuts import render_to_response
 from django.shortcuts import render_to_response
 from django.template import RequestContext
 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
 import tempfile
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.contrib.staticfiles.templatetags.staticfiles import static
 from django.contrib.staticfiles.templatetags.staticfiles import static
 from django.template.base import TemplateDoesNotExist, TemplateSyntaxError
 from django.template.base import TemplateDoesNotExist, TemplateSyntaxError
 from django.template.backends.base import BaseEngine
 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.template import loader
 from django import http
 from django import http
 from django.core.exceptions import ImproperlyConfigured
 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.views.generic.simple import direct_to_template
 
 
 from django.conf import settings
 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # 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 django.utils.translation import ugettext_lazy as _t, ugettext as _
 
 
 from desktop import conf
 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__)
 LOG = logging.getLogger(__name__)
@@ -171,7 +171,7 @@ class UserCreationForm(AuthUserCreationForm):
   """
   """
   password = CharField(label=_t("Password"),
   password = CharField(label=_t("Password"),
                        widget=PasswordInput(attrs={'class': 'input-large'}),
                        widget=PasswordInput(attrs={'class': 'input-large'}),
-                       validators=get_password_validators())
+                       validators=hue_get_password_validators())
 
 
   def __init__(self, data=None, *args, **kwargs):
   def __init__(self, data=None, *args, **kwargs):
     if data and 'password' in data:
     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'
     renderable_path = 'login_modal.mako'
 
 
   response = render(renderable_path, request, {
   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,
     'form': first_user_form or auth_form,
     'next': redirect_to,
     'next': redirect_to,
     'first_login_ever': is_first_login_ever,
     '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):
 def url(view_name, *args, **view_args):
   """URL tag for use in templates - like {% url ... %} in django"""
   """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)
   return reverse(view_name, args=args, kwargs=view_args)
 
 
 from django.template.context_processors import csrf
 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:
     else:
       return render_json(data, request.GET.get("callback"), status=status)
       return render_json(data, request.GET.get("callback"), status=status)
   else:
   else:
+    x=RequestContext(request, data)
     return _render_to_response(template,
     return _render_to_response(template,
                                request,
                                request,
-                               RequestContext(request, data),
+                               x,
                                template_lib=template_lib,
                                template_lib=template_lib,
                                status=status,
                                status=status,
                                **kwargs)
                                **kwargs)

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

@@ -17,7 +17,7 @@
 
 
 import json
 import json
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from desktop.conf import DEFAULT_USER
 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'):
   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',
     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')
                           '/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 json
 import urllib
 import urllib
 
 
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from desktop.conf import DEFAULT_USER
 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.
     # Skip over 'manage.py test' and any arguments handled by django.
     django_opts = ['--noinput', '--liveserver', '-p', '--pattern']
     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:]
     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))
     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,
 this command is still a few steps away from dumping a ConfigObj-compatible,
 textual representation.
 textual representation.
 """
 """
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 import desktop.appmanager
 import desktop.appmanager
 import textwrap
 import textwrap
 
 
@@ -29,7 +29,7 @@ from django.utils.translation import ugettext as _
 
 
 from desktop.lib.conf import BoundContainer, is_anonymous
 from desktop.lib.conf import BoundContainer, is_anonymous
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   def __init__(self, *args, **kwargs):
   def __init__(self, *args, **kwargs):
     super(Command, self).__init__(*args, **kwargs)
     super(Command, self).__init__(*args, **kwargs)
     self.indent = 0
     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.
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 import desktop.appmanager
 import desktop.appmanager
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   """Prints documentation for configuration."""
   """Prints documentation for configuration."""
   def handle_noargs(self, **options):
   def handle_noargs(self, **options):
     desktop.lib.conf.GLOBAL_CONFIG.print_help(skip_header=True)
     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
 import time
 
 
 from django.contrib.auth.models import User
 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 django.db import transaction
 
 
 from desktop.converters import DocumentConverter
 from desktop.converters import DocumentConverter
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
 
   def handle_noargs(self, **options):
   def handle_noargs(self, **options):
     print 'Starting document conversions...\n'
     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.
 # limitations under the License.
 import os
 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 desktop.lib.paths import get_build_dir
 from hadoop.fs import fs_for_testing
 from hadoop.fs import fs_for_testing
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   """Creates file system for testing."""
   """Creates file system for testing."""
   def handle_noargs(self, **options):
   def handle_noargs(self, **options):
     fs_dir = os.path.join(get_build_dir(), "fs")
     fs_dir = os.path.join(get_build_dir(), "fs")
     if not os.path.isdir(fs_dir):
     if not os.path.isdir(fs_dir):
       os.makedirs(fs_dir)
       os.makedirs(fs_dir)
     fs_for_testing.create(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
 import json
 
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 
 # Force loading the metrics
 # Force loading the metrics
 import desktop.urls
 import desktop.urls
 from desktop.lib.metrics import global_registry
 from desktop.lib.metrics import global_registry
 
 
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   def handle_noargs(self, **options):
   def handle_noargs(self, **options):
     """Generates a Monitor Descriptor file."""
     """Generates a Monitor Descriptor file."""
     registry = global_registry()
     registry = global_registry()

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

@@ -19,7 +19,7 @@
 import logging
 import logging
 import sys
 import sys
 
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 from django.core.exceptions import ImproperlyConfigured
 from django.core.exceptions import ImproperlyConfigured
 from django.db import connections
 from django.db import connections
 from django.db.utils import OperationalError
 from django.db.utils import OperationalError
@@ -28,7 +28,7 @@ from django.db.utils import OperationalError
 LOG = logging.getLogger(__name__)
 LOG = logging.getLogger(__name__)
 
 
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
 
   help = """Check if Hue can is configured properly to use its database.
   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
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 import desktop.kt_renewer
 import desktop.kt_renewer
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   """ Starts a daemon which renews Kerberos credentials from a keytab
   """ Starts a daemon which renews Kerberos credentials from a keytab
   periodically. """
   periodically. """
   def handle_noargs(self, **options):
   def handle_noargs(self, **options):

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

@@ -35,7 +35,7 @@ import socket
 import sys
 import sys
 
 
 from desktop.conf import LDAP
 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 django.utils.translation import ugettext as _
 from useradmin import ldap_access
 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.
 for Active Directory and LDAP.
 """
 """
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
   def print_ldap_global_settings(self, cfg, is_multi_ldap):
   def print_ldap_global_settings(self, cfg, is_multi_ldap):
     LOG.info('[desktop]')
     LOG.info('[desktop]')
     LOG.info('[[ldap]]')
     LOG.info('[[ldap]]')

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

@@ -17,12 +17,12 @@
 
 
 import logging
 import logging
 
 
-from django.core.management.base import NoArgsCommand
+from django.core.management.base import BaseCommand
 
 
 from desktop.models import Document
 from desktop.models import Document
 
 
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
 
   def handle_noargs(self, **options):
   def handle_noargs(self, **options):
     logging.info('Running syncing document command.')
     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):
 class Command(BaseCommand):
   """Runs windmill tests."""
   """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):
   def setup_test_db(self):
     """
     """
@@ -86,6 +83,8 @@ class Command(BaseCommand):
     from windmill.conf import global_settings
     from windmill.conf import global_settings
     import nose
     import nose
 
 
+    self.port = options['port']
+
     # Setup DB
     # Setup DB
     self.setup_test_db()
     self.setup_test_db()
 
 

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

@@ -18,12 +18,12 @@
 import os
 import os
 
 
 from django.conf import settings
 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
 from desktop.lib.paths import get_desktop_root
 
 
 
 
-class Command(NoArgsCommand):
+class Command(BaseCommand):
 
 
   def handle_noargs(self, **options):
   def handle_noargs(self, **options):
     cdh_path = os.path.join(get_desktop_root(), '..', 'cloudera', 'cdh_version.properties')
     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
 from django.core import exceptions, urlresolvers
 import django.db
 import django.db
 from django.http import HttpResponseNotAllowed, HttpResponseForbidden
 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.http import HttpResponseRedirect, HttpResponse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 from django.utils.http import urlquote, is_safe_url
 from django.utils.http import urlquote, is_safe_url

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff