Эх сурвалжийг харах

HUE-9644 [Django Upgrade] Port remaining apps to proper URL namespacing

ayush.goyal 5 жил өмнө
parent
commit
dbb3980ddb
56 өөрчлөгдсөн 137 нэмэгдсэн , 131 устгасан
  1. 1 1
      apps/about/src/about/templates/admin_wizard.mako
  2. 1 1
      apps/beeswax/src/beeswax/api.py
  3. 1 1
      apps/beeswax/src/beeswax/templates/watch_results.mako
  4. 1 0
      apps/filebrowser/src/filebrowser/settings.py
  5. 5 5
      apps/filebrowser/src/filebrowser/templates/display.mako
  6. 2 2
      apps/filebrowser/src/filebrowser/templates/edit.mako
  7. 2 2
      apps/filebrowser/src/filebrowser/templates/fb_components.mako
  8. 19 19
      apps/filebrowser/src/filebrowser/templates/listdir_components.mako
  9. 1 1
      apps/filebrowser/src/filebrowser/templates/saveas.mako
  10. 2 2
      apps/filebrowser/src/filebrowser/views.py
  11. 1 0
      apps/help/src/help/settings.py
  12. 1 1
      apps/help/src/help/templates/display.mako
  13. 1 1
      apps/jobbrowser/src/jobbrowser/models.py
  14. 1 0
      apps/jobbrowser/src/jobbrowser/settings.py
  15. 5 5
      apps/jobbrowser/src/jobbrowser/templates/attempt.mako
  16. 4 4
      apps/jobbrowser/src/jobbrowser/templates/attempt_logs.mako
  17. 6 6
      apps/jobbrowser/src/jobbrowser/templates/job.mako
  18. 4 4
      apps/jobbrowser/src/jobbrowser/templates/job_attempt_logs.mako
  19. 1 1
      apps/jobbrowser/src/jobbrowser/templates/jobbrowser_components.mako
  20. 4 4
      apps/jobbrowser/src/jobbrowser/templates/task.mako
  21. 4 4
      apps/jobbrowser/src/jobbrowser/templates/tasks.mako
  22. 2 2
      apps/jobbrowser/src/jobbrowser/tests.py
  23. 5 5
      apps/jobbrowser/src/jobbrowser/views.py
  24. 2 2
      apps/jobsub/src/jobsub/models.py
  25. 1 0
      apps/jobsub/src/jobsub/settings.py
  26. 9 9
      apps/jobsub/src/jobsub/tests.py
  27. 1 1
      apps/metastore/src/metastore/tests.py
  28. 2 2
      apps/oozie/src/oozie/templates/dashboard/list_oozie_workflow_action.mako
  29. 1 1
      apps/oozie/src/oozie/templates/editor/gen/workflow-graph-status.xml.mako
  30. 1 1
      apps/oozie/src/oozie/templates/editor2/gen/workflow-graph-status.xml.mako
  31. 1 0
      apps/proxy/src/proxy/settings.py
  32. 1 1
      apps/proxy/src/proxy/views.py
  33. 1 0
      apps/useradmin/src/useradmin/settings.py
  34. 4 4
      apps/useradmin/src/useradmin/templates/add_ldap_users.mako
  35. 1 1
      apps/useradmin/src/useradmin/templates/edit_group.mako
  36. 1 1
      apps/useradmin/src/useradmin/templates/edit_user.mako
  37. 5 5
      apps/useradmin/src/useradmin/templates/layout.mako
  38. 4 4
      apps/useradmin/src/useradmin/templates/list_groups.mako
  39. 3 3
      apps/useradmin/src/useradmin/templates/list_organizations.mako
  40. 1 1
      apps/useradmin/src/useradmin/templates/list_permissions.mako
  41. 5 5
      apps/useradmin/src/useradmin/templates/list_users.mako
  42. 1 1
      apps/useradmin/src/useradmin/views.py
  43. 1 1
      desktop/core/src/desktop/auth/views.py
  44. 1 1
      desktop/core/src/desktop/lib/view_util.py
  45. 2 2
      desktop/core/src/desktop/templates/common_header.mako
  46. 1 1
      desktop/core/src/desktop/urls.py
  47. 2 2
      desktop/libs/liboozie/src/liboozie/types.py
  48. 1 1
      desktop/libs/notebook/src/notebook/connectors/dataeng.py
  49. 1 1
      desktop/libs/notebook/src/notebook/connectors/hiveserver2.py
  50. 1 1
      desktop/libs/notebook/src/notebook/connectors/oozie_batch.py
  51. 1 1
      docs/docs-site/content/releases/release-notes-2.0.0-beta.md
  52. 1 1
      docs/docs-site/content/releases/release-notes-2.0.1.md
  53. 2 2
      docs/gethue/content/en/posts/2015-04-08-developer-guide-on-upgrading-apps-for-django-1-6.md
  54. 2 2
      docs/gethue/content/jp/posts/2015-04-10-developer-guide-on-upgrading-apps-for-django-1-6-2.md
  55. 1 1
      docs/release-notes/release-notes-2.0.0-beta.txt
  56. 1 1
      docs/release-notes/release-notes-2.0.1.txt

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

@@ -213,7 +213,7 @@ ${ layout.menubar(section='quick_start') }
           <div id="step4" class="stepDetails hide">
           <div id="step4" class="stepDetails hide">
             <div>
             <div>
               <h3>${ _('Create or import users') }</h3>
               <h3>${ _('Create or import users') }</h3>
-              <a href="${ url('useradmin.views.list_users') }"
+              <a href="${ url('useradmin:useradmin.views.list_users') }"
                  % if not is_embeddable:
                  % if not is_embeddable:
                  target="_blank"
                  target="_blank"
                  % endif
                  % endif

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

@@ -332,7 +332,7 @@ def massage_job_urls_for_json(jobs):
   for job in jobs:
   for job in jobs:
     massaged_jobs.append({
     massaged_jobs.append({
       'name': job,
       'name': job,
-      'url': reverse('jobbrowser.views.single_job', kwargs={'job': job})
+      'url': reverse('jobbrowser:jobbrowser.views.single_job', kwargs={'job': job})
     })
     })
   return massaged_jobs
   return massaged_jobs
 
 

+ 1 - 1
apps/beeswax/src/beeswax/templates/watch_results.mako

@@ -95,7 +95,7 @@ ${layout.menubar(section='query')}
                       % if n_jobs > 0:
                       % if n_jobs > 0:
                         <li class="nav-header">${mr_jobs} (${n_jobs})</li>
                         <li class="nav-header">${mr_jobs} (${n_jobs})</li>
                         % for jobid in hadoop_jobs:
                         % for jobid in hadoop_jobs:
-                          <li><a href="${url("jobbrowser.views.single_job", job=jobid.replace('application', 'job'))}">${ jobid.replace("application_", "") }</a></li>
+                          <li><a href="${url("jobbrowser:jobbrowser.views.single_job", job=jobid.replace('application', 'job'))}">${ jobid.replace("application_", "") }</a></li>
                         % endfor
                         % endfor
                       % else:
                       % else:
                         <li class="nav-header">${mr_jobs}</li>
                         <li class="nav-header">${mr_jobs}</li>

+ 1 - 0
apps/filebrowser/src/filebrowser/settings.py

@@ -20,6 +20,7 @@ NICE_NAME = "File Browser"
 REQUIRES_HADOOP = False
 REQUIRES_HADOOP = False
 ICON = "filebrowser/art/icon_filebrowser_48.png"
 ICON = "filebrowser/art/icon_filebrowser_48.png"
 MENU_INDEX = 20
 MENU_INDEX = 20
+IS_URL_NAMESPACED = True
 
 
 from aws.conf import PERMISSION_ACTION_S3
 from aws.conf import PERMISSION_ACTION_S3
 from azure.conf import PERMISSION_ACTION_ADLS, PERMISSION_ACTION_ABFS
 from azure.conf import PERMISSION_ACTION_ADLS, PERMISSION_ACTION_ABFS

+ 5 - 5
apps/filebrowser/src/filebrowser/templates/display.mako

@@ -31,8 +31,8 @@
 <%
 <%
   path_enc = urllib_quote(path.encode('utf-8'), safe=SAFE_CHARACTERS_URI_COMPONENTS)
   path_enc = urllib_quote(path.encode('utf-8'), safe=SAFE_CHARACTERS_URI_COMPONENTS)
   dirname_enc = urlencode(view['dirname'])
   dirname_enc = urlencode(view['dirname'])
-  base_url = url('filebrowser.views.view', path=path_enc)
-  edit_url = url('filebrowser_views_edit', path=path_enc)
+  base_url = url('filebrowser:filebrowser.views.view', path=path_enc)
+  edit_url = url('filebrowser:filebrowser_views_edit', path=path_enc)
 %>
 %>
 <%namespace name="fb_components" file="fb_components.mako" />
 <%namespace name="fb_components" file="fb_components.mako" />
 
 
@@ -51,7 +51,7 @@ ${ fb_components.menubar() }
         <!-- ko if: $root.file -->
         <!-- ko if: $root.file -->
         <ul class="nav nav-list">
         <ul class="nav nav-list">
           <!-- ko if: $root.isViewing -->
           <!-- ko if: $root.isViewing -->
-            <li><a href="${url('filebrowser.views.view', path=dirname_enc)}"><i class="fa fa-reply"></i> ${_('Back')}</a></li>
+            <li><a href="${url('filebrowser:filebrowser.views.view', path=dirname_enc)}"><i class="fa fa-reply"></i> ${_('Back')}</a></li>
 
 
             <!-- ko if: $root.file().view.compression() && $root.file().view.compression() === "none" && $root.file().editable -->
             <!-- ko if: $root.file().view.compression() && $root.file().view.compression() === "none" && $root.file().editable -->
               <li><a class="pointer" data-bind="click: $root.editFile"><i class="fa fa-pencil"></i> ${_('Edit file')}</a></li>
               <li><a class="pointer" data-bind="click: $root.editFile"><i class="fa fa-pencil"></i> ${_('Edit file')}</a></li>
@@ -227,7 +227,7 @@ ${ fb_components.menubar() }
   }
   }
 
 
   function getContent (callback) {
   function getContent (callback) {
-    var _baseUrl = "${url('filebrowser.views.view', path=path_enc)}";
+    var _baseUrl = "${url('filebrowser:filebrowser.views.view', path=path_enc)}";
 
 
     viewModel.isLoading(true);
     viewModel.isLoading(true);
 
 
@@ -379,7 +379,7 @@ ${ fb_components.menubar() }
     }
     }
 
 
     self.downloadFile = function () {
     self.downloadFile = function () {
-      huePubSub.publish('open.link', "${url('filebrowser_views_download', path=path_enc)}");
+      huePubSub.publish('open.link', "${url('filebrowser:filebrowser_views_download', path=path_enc)}");
     };
     };
 
 
     self.pageChanged = function () {
     self.pageChanged = function () {

+ 2 - 2
apps/filebrowser/src/filebrowser/templates/edit.mako

@@ -45,7 +45,7 @@ ${ fb_components.menubar() }
       %endif
       %endif
         <div class="card-body">
         <div class="card-body">
           <p>
           <p>
-            <form id="saveForm" class="form-stacked" method="post" action="${url('filebrowser_views_save_file')}">
+            <form id="saveForm" class="form-stacked" method="post" action="${url('filebrowser:filebrowser_views_save_file')}">
               ${ csrf_token(request) | n,unicode }
               ${ csrf_token(request) | n,unicode }
               % if form.errors:
               % if form.errors:
               <div class="alert-message">
               <div class="alert-message">
@@ -72,7 +72,7 @@ ${ fb_components.menubar() }
 
 
 
 
 <div id="saveAsModal" class="modal hide fade">
 <div id="saveAsModal" class="modal hide fade">
-    <form id="saveAsForm" action="${url('filebrowser_views_save_file')}" method="POST" class="form-stacked form-padding-fix">
+    <form id="saveAsForm" action="${url('filebrowser:filebrowser_views_save_file')}" method="POST" class="form-stacked form-padding-fix">
     ${ csrf_token(request) | n,unicode }
     ${ csrf_token(request) | n,unicode }
     <div class="modal-header">
     <div class="modal-header">
       <button type="button" class="close" data-dismiss="modal" aria-label="${ _('Close') }"><span aria-hidden="true">&times;</span></button>
       <button type="button" class="close" data-dismiss="modal" aria-label="${ _('Close') }"><span aria-hidden="true">&times;</span></button>

+ 2 - 2
apps/filebrowser/src/filebrowser/templates/fb_components.mako

@@ -58,10 +58,10 @@ else:
         <li>
         <li>
           <ul id="editBreadcrumb" class="hue-breadcrumbs editable-breadcrumbs" data-bind="foreach: breadcrumbs" style="padding-right:40px; padding-top: 12px" title="${_('Edit path')}">
           <ul id="editBreadcrumb" class="hue-breadcrumbs editable-breadcrumbs" data-bind="foreach: breadcrumbs" style="padding-right:40px; padding-top: 12px" title="${_('Edit path')}">
             <li data-bind="visible: label.slice(-1) == '/'">
             <li data-bind="visible: label.slice(-1) == '/'">
-              <a data-bind="click: show, attr: {'href': '${url('filebrowser.views.view', path=urlencode(''))}' + url}"><span class="divider" data-bind="text: label"></span></a>
+              <a data-bind="click: show, attr: {'href': '${url('filebrowser:filebrowser.views.view', path=urlencode(''))}' + url}"><span class="divider" data-bind="text: label"></span></a>
             </li>
             </li>
             <li data-bind="visible: label.slice(-1) != '/'">
             <li data-bind="visible: label.slice(-1) != '/'">
-              <a data-bind="text: label, click: show, attr: {'href': '${url('filebrowser.views.view', path=urlencode(''))}' + url}"></a><span class="divider">/</span>
+              <a data-bind="text: label, click: show, attr: {'href': '${url('filebrowser:filebrowser.views.view', path=urlencode(''))}' + url}"></a><span class="divider">/</span>
             </li>
             </li>
           </ul>
           </ul>
           <input id="hueBreadcrumbText" type="text" style="display:none" data-bind="value: currentPath" autocomplete="off" class="input-xxlarge" />
           <input id="hueBreadcrumbText" type="text" style="display:none" data-bind="value: currentPath" autocomplete="off" class="input-xxlarge" />

+ 19 - 19
apps/filebrowser/src/filebrowser/templates/listdir_components.mako

@@ -913,7 +913,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
               }
               }
 
 
               fileBrowserViewModel.targetPageNum(1);
               fileBrowserViewModel.targetPageNum(1);
-              fileBrowserViewModel.targetPath("${url('filebrowser.views.view', path='')}" + stripHashes(this.url));
+              fileBrowserViewModel.targetPath("${url('filebrowser:filebrowser.views.view', path='')}" + stripHashes(this.url));
               updateHash(this.url);
               updateHash(this.url);
             }
             }
             else {
             else {
@@ -1156,7 +1156,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
       self.showSummary = function () {
       self.showSummary = function () {
         self.isLoadingSummary(true);
         self.isLoadingSummary(true);
         $("#contentSummaryModal").modal("show");
         $("#contentSummaryModal").modal("show");
-        $.getJSON("${url('content_summary', path='')}" + self.selectedFile().path, function (data) {
+        $.getJSON("${url('filebrowser:content_summary', path='')}" + self.selectedFile().path, function (data) {
           if (data.status == 0) {
           if (data.status == 0) {
             self.contentSummary(ko.mapping.fromJS(data.summary));
             self.contentSummary(ko.mapping.fromJS(data.summary));
             self.isLoadingSummary(false);
             self.isLoadingSummary(false);
@@ -1333,12 +1333,12 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
             e.stopPropagation();
             e.stopPropagation();
             e.preventDefault();
             e.preventDefault();
             fileBrowserViewModel.targetPageNum(1);
             fileBrowserViewModel.targetPageNum(1);
-            fileBrowserViewModel.targetPath("${url('filebrowser.views.view', path='')}?" + folderPath);
+            fileBrowserViewModel.targetPath("${url('filebrowser:filebrowser.views.view', path='')}?" + folderPath);
             updateHash('');
             updateHash('');
             fileBrowserViewModel.retrieveData();
             fileBrowserViewModel.retrieveData();
           }
           }
           else {
           else {
-            window.open("${url('filebrowser.views.view', path='')}?" + folderPath);
+            window.open("${url('filebrowser:filebrowser.views.view', path='')}?" + folderPath);
           }
           }
         }
         }
       }
       }
@@ -1370,11 +1370,11 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
       };
       };
 
 
       self.editFile = function () {
       self.editFile = function () {
-        huePubSub.publish('open.link', self.selectedFile().url.replace("${url('filebrowser.views.view', path='')}", "${url('filebrowser_views_edit', path='')}"));
+        huePubSub.publish('open.link', self.selectedFile().url.replace("${url('filebrowser:filebrowser.views.view', path='')}", "${url('filebrowser:filebrowser_views_edit', path='')}"));
       };
       };
 
 
       self.downloadFile = function () {
       self.downloadFile = function () {
-        huePubSub.publish('open.link', self.selectedFile().url.replace("${url('filebrowser.views.view', path='')}", "${url('filebrowser_views_download', path='')}"));
+        huePubSub.publish('open.link', self.selectedFile().url.replace("${url('filebrowser:filebrowser.views.view', path='')}", "${url('filebrowser:filebrowser_views_download', path='')}"));
       };
       };
 
 
       self.renameFile = function () {
       self.renameFile = function () {
@@ -1384,7 +1384,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
         $("#newNameInput").val(self.selectedFile().name);
         $("#newNameInput").val(self.selectedFile().name);
 
 
-        $("#renameForm").attr("action", "/filebrowser/rename?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+        $("#renameForm").attr("action", "/filebrowser/rename?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
 
 
         $('#renameForm').ajaxForm({
         $('#renameForm').ajaxForm({
           dataType:  'json',
           dataType:  'json',
@@ -1406,7 +1406,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
         $("#setReplFileName").text(self.selectedFile().path);
         $("#setReplFileName").text(self.selectedFile().path);
 
 
-        $("#setReplicationFactorForm").attr("action", "/filebrowser/set_replication?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+        $("#setReplicationFactorForm").attr("action", "/filebrowser/set_replication?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
 
 
         $('#setReplicationFactorForm').ajaxForm({
         $('#setReplicationFactorForm').ajaxForm({
           dataType: 'json',
           dataType: 'json',
@@ -1442,7 +1442,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
         if (!isMoveOnSelf){
         if (!isMoveOnSelf){
           hiddenFields($("#moveForm"), "src_path", paths);
           hiddenFields($("#moveForm"), "src_path", paths);
-          $("#moveForm").attr("action", "/filebrowser/move?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+          $("#moveForm").attr("action", "/filebrowser/move?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
           $('#moveForm').ajaxForm({
           $('#moveForm').ajaxForm({
             dataType:  'json',
             dataType:  'json',
             success: function() {
             success: function() {
@@ -1500,7 +1500,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
         hiddenFields($("#copyForm"), "src_path", paths);
         hiddenFields($("#copyForm"), "src_path", paths);
 
 
-        $("#copyForm").attr("action", "/filebrowser/copy?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+        $("#copyForm").attr("action", "/filebrowser/copy?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
 
 
         $("#copyModal").modal({
         $("#copyModal").modal({
           keyboard:true,
           keyboard:true,
@@ -1552,7 +1552,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
           hiddenFields($("#chownForm"), 'path', paths);
           hiddenFields($("#chownForm"), 'path', paths);
 
 
-          $("#chownForm").attr("action", "/filebrowser/chown?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+          $("#chownForm").attr("action", "/filebrowser/chown?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
 
 
           $("select[name='user']").val(self.selectedFile().stats.user);
           $("select[name='user']").val(self.selectedFile().stats.user);
 
 
@@ -1604,7 +1604,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
           hiddenFields($("#chmodForm"), 'path', paths);
           hiddenFields($("#chmodForm"), 'path', paths);
 
 
-          $("#chmodForm").attr("action", "/filebrowser/chmod?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+          $("#chmodForm").attr("action", "/filebrowser/chmod?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
 
 
           $("#changePermissionModal").modal({
           $("#changePermissionModal").modal({
             keyboard: true,
             keyboard: true,
@@ -1652,7 +1652,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
         $("#deleteForm").attr("action", "/filebrowser/rmtree" + "?" +
         $("#deleteForm").attr("action", "/filebrowser/rmtree" + "?" +
           (self.skipTrash() ? "skip_trash=true&" : "") +
           (self.skipTrash() ? "skip_trash=true&" : "") +
-          "next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+          "next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
 
 
         $("#deleteModal").modal({
         $("#deleteModal").modal({
           keyboard:true,
           keyboard:true,
@@ -1806,7 +1806,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
       };
       };
 
 
       self.createDirectory = function (formElement) {
       self.createDirectory = function (formElement) {
-        $(formElement).attr("action", "/filebrowser/mkdir?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+        $(formElement).attr("action", "/filebrowser/mkdir?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
         if ($.trim($("#newDirectoryNameInput").val()) == "") {
         if ($.trim($("#newDirectoryNameInput").val()) == "") {
           $("#directoryNameRequiredAlert").show();
           $("#directoryNameRequiredAlert").show();
           $("#newDirectoryNameInput").addClass("fieldError");
           $("#newDirectoryNameInput").addClass("fieldError");
@@ -1843,7 +1843,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
       };
       };
 
 
       self.createFile = function (formElement) {
       self.createFile = function (formElement) {
-        $(formElement).attr("action", "/filebrowser/touch?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+        $(formElement).attr("action", "/filebrowser/touch?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
         if ($.trim($("#newFileNameInput").val()) == "") {
         if ($.trim($("#newFileNameInput").val()) == "") {
           $("#fileNameRequiredAlert").show();
           $("#fileNameRequiredAlert").show();
           $("#newFileNameInput").addClass("fieldError");
           $("#newFileNameInput").addClass("fieldError");
@@ -1882,7 +1882,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
         hiddenFields($("#restoreTrashForm"), 'path', paths);
         hiddenFields($("#restoreTrashForm"), 'path', paths);
 
 
-        $("#restoreTrashForm").attr("action", "/filebrowser/trash/restore?next=${url('filebrowser.views.view', path='')}" + self.currentPath());
+        $("#restoreTrashForm").attr("action", "/filebrowser/trash/restore?next=${url('filebrowser:filebrowser.views.view', path='')}" + self.currentPath());
 
 
         $("#restoreTrashModal").modal({
         $("#restoreTrashModal").modal({
           keyboard:true,
           keyboard:true,
@@ -1911,7 +1911,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
 
 
         hiddenFields($("#purgeTrashForm"), 'path', paths);
         hiddenFields($("#purgeTrashForm"), 'path', paths);
 
 
-        $("#purgeTrashForm").attr("action", "/filebrowser/trash/purge?next=${url('filebrowser.views.view', path='')}" + fileBrowserViewModel.homeDir() + "/.Trash");
+        $("#purgeTrashForm").attr("action", "/filebrowser/trash/purge?next=${url('filebrowser:filebrowser.views.view', path='')}" + fileBrowserViewModel.homeDir() + "/.Trash");
 
 
         $("#purgeTrashModal").modal({
         $("#purgeTrashModal").modal({
           keyboard:true,
           keyboard:true,
@@ -2440,7 +2440,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
           var targetPath = "";
           var targetPath = "";
           var hash = decodeURI(window.location.hash.substring(1));
           var hash = decodeURI(window.location.hash.substring(1));
           if (hash != null && hash != "" && hash.indexOf('/') > -1) {
           if (hash != null && hash != "" && hash.indexOf('/') > -1) {
-            targetPath = "${url('filebrowser.views.view', path='')}";
+            targetPath = "${url('filebrowser:filebrowser.views.view', path='')}";
             if (hash.indexOf("!!") != 0) {
             if (hash.indexOf("!!") != 0) {
               targetPath += stripHashes(encodeURIComponent(hash));
               targetPath += stripHashes(encodeURIComponent(hash));
             }
             }
@@ -2483,7 +2483,7 @@ from filebrowser.conf import ENABLE_EXTRACT_UPLOADED_ARCHIVE
         root: fileBrowserViewModel.rootTarget(),
         root: fileBrowserViewModel.rootTarget(),
         skipKeydownEvents: true,
         skipKeydownEvents: true,
         onEnter: function (el) {
         onEnter: function (el) {
-          fileBrowserViewModel.targetPath("${url('filebrowser.views.view', path='')}" + stripHashes(el.val()));
+          fileBrowserViewModel.targetPath("${url('filebrowser:filebrowser.views.view', path='')}" + stripHashes(el.val()));
           fileBrowserViewModel.getStats(function (data) {
           fileBrowserViewModel.getStats(function (data) {
             if (data.type != null && data.type == "file") {
             if (data.type != null && data.type == "file") {
               %if is_embeddable:
               %if is_embeddable:

+ 1 - 1
apps/filebrowser/src/filebrowser/templates/saveas.mako

@@ -29,7 +29,7 @@
       </div>
       </div>
     % endif
     % endif
     <div class="saveAsPrompt_popup">
     <div class="saveAsPrompt_popup">
-      <form method="post" action="${url('filebrowser_views_save_file')}">
+      <form method="post" action="${url('filebrowser:filebrowser_views_save_file')}">
           ${ csrf_token(request) | n,unicode }
           ${ csrf_token(request) | n,unicode }
           ${ _('Enter the location where you would like to save the file.') }
           ${ _('Enter the location where you would like to save the file.') }
           ${edit.render_field(form["path"], notitle=True)}
           ${edit.render_field(form["path"], notitle=True)}

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

@@ -361,7 +361,7 @@ def save_file(request):
   except Exception as e:
   except Exception as e:
     raise PopupException(_("The file could not be saved"), detail=e)
     raise PopupException(_("The file could not be saved"), detail=e)
 
 
-  request.path = reverse("filebrowser_views_edit", kwargs=dict(path=path))
+  request.path = reverse("filebrowser:filebrowser_views_edit", kwargs=dict(path=path))
   return edit(request, path, form)
   return edit(request, path, form)
 
 
 
 
@@ -665,7 +665,7 @@ def display(request, path):
   # display inline files just if it's not an ajax request
   # display inline files just if it's not an ajax request
   if not request.is_ajax():
   if not request.is_ajax():
     if _can_inline_display(path):
     if _can_inline_display(path):
-      return redirect(reverse('filebrowser_views_download', args=[path]) + '?disposition=inline')
+      return redirect(reverse('filebrowser:filebrowser_views_download', args=[path]) + '?disposition=inline')
 
 
   stats = request.fs.stats(path)
   stats = request.fs.stats(path)
   encoding = request.GET.get('encoding') or i18n.get_site_encoding()
   encoding = request.GET.get('encoding') or i18n.get_site_encoding()

+ 1 - 0
apps/help/src/help/settings.py

@@ -18,3 +18,4 @@ NICE_NAME = "Help"
 REQUIRES_HADOOP = False
 REQUIRES_HADOOP = False
 ICON = "help/art/icon_help_24.png"
 ICON = "help/art/icon_help_24.png"
 MENU_INDEX = 90
 MENU_INDEX = 90
+IS_URL_NAMESPACED = True

+ 1 - 1
apps/help/src/help/templates/display.mako

@@ -58,7 +58,7 @@ ${ commonheader("Hue Help", "help", user, request, "40px") | n,unicode }
       <div class="sidebar-nav">
       <div class="sidebar-nav">
         <ul class="nav nav-list">
         <ul class="nav nav-list">
             % for app in apps:
             % for app in apps:
-              <li class="${is_selected(app.name, current)}"><a href="${url("help.views.view", app=app.name, path="/")}">${app.nice_name}</a></li>
+              <li class="${is_selected(app.name, current)}"><a href="${url("help:help.views.view", app=app.name, path="/")}">${app.nice_name}</a></li>
             % endfor
             % endfor
         </ul>
         </ul>
       </div>
       </div>

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

@@ -209,7 +209,7 @@ class LinkJobLogs(object):
   @classmethod
   @classmethod
   def _replace_mr_link(self, match):
   def _replace_mr_link(self, match):
     try:
     try:
-      return '<a href="/hue%s">%s</a>' % (reverse('jobbrowser.views.single_job', kwargs={'job': match.group(0)}), match.group(0))
+      return '<a href="/hue%s">%s</a>' % (reverse('jobbrowser:jobbrowser.views.single_job', kwargs={'job': match.group(0)}), match.group(0))
     except:
     except:
       LOG.exception('failed to replace mr links: %s' % (match.groups(),))
       LOG.exception('failed to replace mr links: %s' % (match.groups(),))
       return match.group(0)
       return match.group(0)

+ 1 - 0
apps/jobbrowser/src/jobbrowser/settings.py

@@ -20,3 +20,4 @@ NICE_NAME = "Job Browser"
 REQUIRES_HADOOP = True
 REQUIRES_HADOOP = True
 ICON = "jobbrowser/art/icon_jobbrowser_48.png"
 ICON = "jobbrowser/art/icon_jobbrowser_48.png"
 MENU_INDEX = 30
 MENU_INDEX = 30
+IS_URL_NAMESPACED = True

+ 5 - 5
apps/jobbrowser/src/jobbrowser/templates/attempt.mako

@@ -32,11 +32,11 @@ ${ comps.menubar() }
           <li class="nav-header">${_('Attempt ID')}</li>
           <li class="nav-header">${_('Attempt ID')}</li>
           <li class="white truncate-text" title="${attempt.attemptId_short}">${attempt.attemptId_short}</li>
           <li class="white truncate-text" title="${attempt.attemptId_short}">${attempt.attemptId_short}</li>
           <li class="nav-header">${_('Task')}</li>
           <li class="nav-header">${_('Task')}</li>
-          <li><a href="${url('jobbrowser.views.single_task', job=joblnk.jobId, taskid=taskid)}"
+          <li><a href="${url('jobbrowser:jobbrowser.views.single_task', job=joblnk.jobId, taskid=taskid)}"
                  class="truncate-text" title="${task.taskId_short}">${task.taskId_short}</a>
                  class="truncate-text" title="${task.taskId_short}">${task.taskId_short}</a>
           </li>
           </li>
           <li class="nav-header">${_('Job')}</li>
           <li class="nav-header">${_('Job')}</li>
-          <li><a href="${url('jobbrowser.views.single_job', job=joblnk.jobId)}"
+          <li><a href="${url('jobbrowser:jobbrowser.views.single_job', job=joblnk.jobId)}"
                  class="truncate-text" title="${joblnk.jobId_short}">${joblnk.jobId_short}</a></li>
                  class="truncate-text" title="${joblnk.jobId_short}">${joblnk.jobId_short}</a></li>
           <li class="nav-header">${_('Status')}</li>
           <li class="nav-header">${_('Status')}</li>
           <li class="white">
           <li class="white">
@@ -65,7 +65,7 @@ ${ comps.menubar() }
             <li class="active"><a href="#metadata" data-toggle="tab">${_('Metadata')}</a></li>
             <li class="active"><a href="#metadata" data-toggle="tab">${_('Metadata')}</a></li>
             <li><a href="#counters" data-toggle="tab">${_('Counters')}</a></li>
             <li><a href="#counters" data-toggle="tab">${_('Counters')}</a></li>
             <li><a
             <li><a
-                href="${ url('single_task_attempt_logs', job=task.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }">${_('Logs')}</a>
+                href="${ url('jobbrowser:single_task_attempt_logs', job=task.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }">${_('Logs')}</a>
             </li>
             </li>
           </ul>
           </ul>
 
 
@@ -85,7 +85,7 @@ ${ comps.menubar() }
                 </tr>
                 </tr>
                 <tr>
                 <tr>
                   <td>${_('Task ID')}</td>
                   <td>${_('Task ID')}</td>
-                  <td><a href="${url('jobbrowser.views.single_task', job=joblnk.jobId, taskid=taskid)}"
+                  <td><a href="${url('jobbrowser:jobbrowser.views.single_task', job=joblnk.jobId, taskid=taskid)}"
                          title="${_('View this task')}">${task.taskId_short}</a></td>
                          title="${_('View this task')}">${task.taskId_short}</a></td>
                 </tr>
                 </tr>
                 <tr>
                 <tr>
@@ -94,7 +94,7 @@ ${ comps.menubar() }
                 </tr>
                 </tr>
                 <tr>
                 <tr>
                   <td>${_('JobId')}</td>
                   <td>${_('JobId')}</td>
-                  <td><a href="${url('jobbrowser.views.single_job', job=joblnk.jobId)}"
+                  <td><a href="${url('jobbrowser:jobbrowser.views.single_job', job=joblnk.jobId)}"
                          title="${_('View this job')}">${joblnk.jobId_short}</a></td>
                          title="${_('View this job')}">${joblnk.jobId_short}</a></td>
                 </tr>
                 </tr>
                 <tr>
                 <tr>

+ 4 - 4
apps/jobbrowser/src/jobbrowser/templates/attempt_logs.mako

@@ -30,10 +30,10 @@ ${ comps.menubar() }
           <li class="nav-header">${_('Attempt ID')}</li>
           <li class="nav-header">${_('Attempt ID')}</li>
           <li class="white truncate-texts" title="${attempt.attemptId_short}">${attempt.attemptId_short}</li>
           <li class="white truncate-texts" title="${attempt.attemptId_short}">${attempt.attemptId_short}</li>
           <li class="nav-header">${_('Task')}</li>
           <li class="nav-header">${_('Task')}</li>
-          <li><a href="${url('jobbrowser.views.single_task', job=joblnk.jobId, taskid=taskid)}" class="truncate-text" title="${task.taskId_short}">${task.taskId_short}</a>
+          <li><a href="${url('jobbrowser:jobbrowser.views.single_task', job=joblnk.jobId, taskid=taskid)}" class="truncate-text" title="${task.taskId_short}">${task.taskId_short}</a>
           </li>
           </li>
           <li class="nav-header">${_('Job')}</li>
           <li class="nav-header">${_('Job')}</li>
-          <li><a href="${url('jobbrowser.views.single_job', job=joblnk.jobId)}" class="truncate-text" title="${joblnk.jobId_short}">${joblnk.jobId_short}</a></li>
+          <li><a href="${url('jobbrowser:jobbrowser.views.single_job', job=joblnk.jobId)}" class="truncate-text" title="${joblnk.jobId_short}">${joblnk.jobId_short}</a></li>
           <li class="nav-header">${_('Status')}</li>
           <li class="nav-header">${_('Status')}</li>
           <li class="white">
           <li class="white">
               <%
               <%
@@ -57,8 +57,8 @@ ${ comps.menubar() }
         <div class="card-body">
         <div class="card-body">
           <p>
           <p>
             <ul class="nav nav-tabs">
             <ul class="nav nav-tabs">
-              <li><a href="${ url('single_task_attempt', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }#tmetadata">${_('Metadata')}</a></li>
-              <li><a href="${ url('single_task_attempt', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }#tcounters">${_('Counters')}</a></li>
+              <li><a href="${ url('jobbrowser:single_task_attempt', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }#tmetadata">${_('Metadata')}</a></li>
+              <li><a href="${ url('jobbrowser:single_task_attempt', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }#tcounters">${_('Counters')}</a></li>
               <li class="active"><a href="#logs" data-toggle="tab">${_('Logs')}</a></li>
               <li class="active"><a href="#logs" data-toggle="tab">${_('Logs')}</a></li>
             </ul>
             </ul>
             <div class="tab-content">
             <div class="tab-content">

+ 6 - 6
apps/jobbrowser/src/jobbrowser/templates/job.mako

@@ -40,13 +40,13 @@
             <tr>
             <tr>
                 <td data-row-selector-exclude="true">
                 <td data-row-selector-exclude="true">
                 %if task.taskAttemptIds:
                 %if task.taskAttemptIds:
-                    <a href="${ url('single_task_attempt_logs', job=task.jobId, taskid=task.taskId, attemptid=task.taskAttemptIds[-1]) }"
+                    <a href="${ url('jobbrowser:single_task_attempt_logs', job=task.jobId, taskid=task.taskId, attemptid=task.taskAttemptIds[-1]) }"
                         data-row-selector="true"><i class="fa fa-tasks"></i>
                         data-row-selector="true"><i class="fa fa-tasks"></i>
                     </a>
                     </a>
                 %endif
                 %endif
                 </td>
                 </td>
                 <td>
                 <td>
-                    <a title="${_('View this task')}" href="${ url('jobbrowser.views.single_task', job=job.jobId, taskid=task.taskId) }"
+                    <a title="${_('View this task')}" href="${ url('jobbrowser:jobbrowser.views.single_task', job=job.jobId, taskid=task.taskId) }"
                         data-row-selector-exclude="true">${task.taskId_short}
                         data-row-selector-exclude="true">${task.taskId_short}
                     </a>
                     </a>
                 </td>
                 </td>
@@ -241,7 +241,7 @@ ${ comps.menubar() }
           <li class="nav-header">${_('Status')}</li>
           <li class="nav-header">${_('Status')}</li>
           <li class="white" id="jobStatus">&nbsp;</li>
           <li class="white" id="jobStatus">&nbsp;</li>
           <li class="nav-header">${_('Logs')}</li>
           <li class="nav-header">${_('Logs')}</li>
-          <li><a href="${ url('jobbrowser.views.job_single_logs', job=job.jobId) }"><i class="fa fa-tasks"></i> ${_('Logs')}</a></li>
+          <li><a href="${ url('jobbrowser:jobbrowser.views.job_single_logs', job=job.jobId) }"><i class="fa fa-tasks"></i> ${_('Logs')}</a></li>
           % if not job.is_retired:
           % if not job.is_retired:
           <li class="nav-header">${_('Maps')}</li>
           <li class="nav-header">${_('Maps')}</li>
           <li class="white" id="jobMaps">&nbsp;</li>
           <li class="white" id="jobMaps">&nbsp;</li>
@@ -309,7 +309,7 @@ ${ comps.menubar() }
                       % for attempt in job.job_attempts['jobAttempt']:
                       % for attempt in job.job_attempts['jobAttempt']:
                       <tr>
                       <tr>
                         <td>
                         <td>
-                          <a href="${ url('job_attempt_logs', job=job.jobId, attempt_index=loop.index) }" data-row-selector="true">
+                          <a href="${ url('jobbrowser:job_attempt_logs', job=job.jobId, attempt_index=loop.index) }" data-row-selector="true">
                             <i class="fa fa-tasks"></i>
                             <i class="fa fa-tasks"></i>
                           </a>
                           </a>
                         </td>
                         </td>
@@ -330,14 +330,14 @@ ${ comps.menubar() }
                   <br/>
                   <br/>
                 % else:
                 % else:
                   <div id="failedTasksContainer">
                   <div id="failedTasksContainer">
-                    <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser.views.tasks', job=job.jobId)}?taskstate=failed">${_('View All Failed Tasks')} &raquo;</a>
+                    <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser:jobbrowser.views.tasks', job=job.jobId)}?taskstate=failed">${_('View All Failed Tasks')} &raquo;</a>
                     <h3>${_('Failed Tasks')}</h3>
                     <h3>${_('Failed Tasks')}</h3>
                     <div>
                     <div>
                       ${task_table('failedTasks', failed_tasks)}
                       ${task_table('failedTasks', failed_tasks)}
                     </div>
                     </div>
                   </div>
                   </div>
                   <div>
                   <div>
-                  <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser.views.tasks', job=job.jobId)}">${_('View All Tasks')} &raquo;</a>
+                  <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser:jobbrowser.views.tasks', job=job.jobId)}">${_('View All Tasks')} &raquo;</a>
                   <h3>${_('Recent Tasks')}</h3>
                   <h3>${_('Recent Tasks')}</h3>
                   <div>
                   <div>
                     ${task_table('recentTasks', recent_tasks)}
                     ${task_table('recentTasks', recent_tasks)}

+ 4 - 4
apps/jobbrowser/src/jobbrowser/templates/job_attempt_logs.mako

@@ -37,7 +37,7 @@ ${ comps.menubar() }
     <div class="span10">
     <div class="span10">
       <div class="card card-small">
       <div class="card card-small">
         <h1 class="card-heading simple">
         <h1 class="card-heading simple">
-          ${ _('Job') } <a href="${url('jobbrowser.views.single_job', job=job.jobId)}" title="${_('View this job')}">${ job.jobId_short }</a>
+          ${ _('Job') } <a href="${url('jobbrowser:jobbrowser.views.single_job', job=job.jobId)}" title="${_('View this job')}">${ job.jobId_short }</a>
           ${ _('Attempt: %(attempt_index)s') % {'attempt_index': attempt_index} }
           ${ _('Attempt: %(attempt_index)s') % {'attempt_index': attempt_index} }
         </h1>
         </h1>
         <div class="card-body">
         <div class="card-body">
@@ -113,7 +113,7 @@ ${ comps.menubar() }
     initLogsElement($("#stderr-container"));
     initLogsElement($("#stderr-container"));
 
 
     function refreshSyslogs() {
     function refreshSyslogs() {
-      $.getJSON("${ url("job_attempt_logs_json", job=job.jobId, attempt_index=attempt_index, name='syslog', offset=log_offset) }", function (data) {
+      $.getJSON("${ url("jobbrowser:job_attempt_logs_json", job=job.jobId, attempt_index=attempt_index, name='syslog', offset=log_offset) }", function (data) {
         if (data && data.log) {
         if (data && data.log) {
           appendAndScroll($("#syslog-container"), data.log);
           appendAndScroll($("#syslog-container"), data.log);
           window.setTimeout(refreshSyslogs, 5000);
           window.setTimeout(refreshSyslogs, 5000);
@@ -122,7 +122,7 @@ ${ comps.menubar() }
     }
     }
 
 
     function refreshStdout() {
     function refreshStdout() {
-      $.getJSON("${ url("job_attempt_logs_json", job=job.jobId, attempt_index=attempt_index, name='stdout', offset=log_offset) }", function (data) {
+      $.getJSON("${ url("jobbrowser:job_attempt_logs_json", job=job.jobId, attempt_index=attempt_index, name='stdout', offset=log_offset) }", function (data) {
         if (data && data.log) {
         if (data && data.log) {
           appendAndScroll($("#stdout-container"), data.log);
           appendAndScroll($("#stdout-container"), data.log);
           window.setTimeout(refreshStdout, 5000);
           window.setTimeout(refreshStdout, 5000);
@@ -131,7 +131,7 @@ ${ comps.menubar() }
     }
     }
 
 
     function refreshStderr() {
     function refreshStderr() {
-      $.getJSON("${ url("job_attempt_logs_json", job=job.jobId, attempt_index=attempt_index, name='stderr', offset=log_offset) }", function (data) {
+      $.getJSON("${ url("jobbrowser:job_attempt_logs_json", job=job.jobId, attempt_index=attempt_index, name='stderr', offset=log_offset) }", function (data) {
         if (data && data.log) {
         if (data && data.log) {
           appendAndScroll($("#stderr-container"), data.log);
           appendAndScroll($("#stderr-container"), data.log);
           window.setTimeout(refreshStderr, 5000);
           window.setTimeout(refreshStderr, 5000);

+ 1 - 1
apps/jobbrowser/src/jobbrowser/templates/jobbrowser_components.mako

@@ -194,7 +194,7 @@
 <%def name="get_container_link(status, node_manager_http_address, container_id)">
 <%def name="get_container_link(status, node_manager_http_address, container_id)">
     ## As soon as the job finishes the container disappears
     ## As soon as the job finishes the container disappears
     % if status.lower() in ('running', 'accepted', 'ready', 'prep', 'waiting', 'suspended', 'prepsuspended', 'preppaused', 'paused', 'submitted', 'suspendedwitherror', 'pausedwitherror', 'finishing', 'started'):
     % if status.lower() in ('running', 'accepted', 'ready', 'prep', 'waiting', 'suspended', 'prepsuspended', 'preppaused', 'paused', 'submitted', 'suspendedwitherror', 'pausedwitherror', 'finishing', 'started'):
-        <a href="${ url('jobbrowser.views.container', node_manager_http_address=node_manager_http_address, containerid=container_id) }" class="task_tracker_link">${ container_id }</a>
+        <a href="${ url('jobbrowser:jobbrowser.views.container', node_manager_http_address=node_manager_http_address, containerid=container_id) }" class="task_tracker_link">${ container_id }</a>
     % else:
     % else:
         ${ container_id }
         ${ container_id }
     % endif
     % endif

+ 4 - 4
apps/jobbrowser/src/jobbrowser/templates/task.mako

@@ -32,7 +32,7 @@ ${ comps.menubar() }
           <li class="nav-header">${_('Task ID')}</li>
           <li class="nav-header">${_('Task ID')}</li>
           <li class="white truncate-text" title="${task.taskId_short}">${task.taskId_short}</li>
           <li class="white truncate-text" title="${task.taskId_short}">${task.taskId_short}</li>
           <li class="nav-header">${_('Job')}</li>
           <li class="nav-header">${_('Job')}</li>
-          <li><a href="${url('jobbrowser.views.single_job', job=joblnk.jobId)}" class="truncate-text" title="${joblnk.jobId_short}">${joblnk.jobId_short}</a></li>
+          <li><a href="${url('jobbrowser:jobbrowser.views.single_job', job=joblnk.jobId)}" class="truncate-text" title="${joblnk.jobId_short}">${joblnk.jobId_short}</a></li>
           <li class="nav-header">${_('Status')}</li>
           <li class="nav-header">${_('Status')}</li>
           <li class="white">
           <li class="white">
             % if task.state.lower() == 'running' or task.state.lower() == 'pending':
             % if task.state.lower() == 'running' or task.state.lower() == 'pending':
@@ -83,8 +83,8 @@ ${ comps.menubar() }
                   <tbody>
                   <tbody>
                   % for attempt in task.attempts:
                   % for attempt in task.attempts:
                     <tr>
                     <tr>
-                      <td data-row-selector-exclude="true"><a href="${ url('single_task_attempt_logs', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a></td>
-                      <td><a title="${_('View this attempt')}" href="${ url('single_task_attempt', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }" data-row-selector="true">${attempt.attemptId_short}</a></td>
+                      <td data-row-selector-exclude="true"><a href="${ url('jobbrowser:single_task_attempt_logs', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a></td>
+                      <td><a title="${_('View this attempt')}" href="${ url('jobbrowser:single_task_attempt', job=joblnk.jobId, taskid=task.taskId, attemptid=attempt.attemptId) }" data-row-selector="true">${attempt.attemptId_short}</a></td>
                       <td>${"%d" % (attempt.progress * 100)}%</td>
                       <td>${"%d" % (attempt.progress * 100)}%</td>
                       <td><span class="status_link ${attempt.state}">${attempt.state}</span></td>
                       <td><span class="status_link ${attempt.state}">${attempt.state}</span></td>
                       <td>
                       <td>
@@ -129,7 +129,7 @@ ${ comps.menubar() }
                     </tr>
                     </tr>
                     <tr>
                     <tr>
                       <td>${_('JobId')}</td>
                       <td>${_('JobId')}</td>
-                      <td><a href="${url('jobbrowser.views.single_job', job=joblnk.jobId)}" title="${_('View this job')}">${joblnk.jobId}</a></td>
+                      <td><a href="${url('jobbrowser:jobbrowser.views.single_job', job=joblnk.jobId)}" title="${_('View this job')}">${joblnk.jobId}</a></td>
                     </tr>
                     </tr>
                     <tr>
                     <tr>
                       <td>${_('State')}</td>
                       <td>${_('State')}</td>

+ 4 - 4
apps/jobbrowser/src/jobbrowser/templates/tasks.mako

@@ -35,7 +35,7 @@ ${ comps.menubar() }
     <h1 class="card-heading simple">${_('Task View: Job: %(jobId)s') % dict(jobId=job.jobId_short)}</h1>
     <h1 class="card-heading simple">${_('Task View: Job: %(jobId)s') % dict(jobId=job.jobId_short)}</h1>
     <div class="card-body">
     <div class="card-body">
       <p>
       <p>
-        <form method="get" action="${ url('jobbrowser.views.tasks', job=job.jobId) }">
+        <form method="get" action="${ url('jobbrowser:jobbrowser.views.tasks', job=job.jobId) }">
           <b>${_('Filter tasks:')}</b>
           <b>${_('Filter tasks:')}</b>
           <select name="taskstate" class="submitter">
           <select name="taskstate" class="submitter">
             <option value="">${_('All states')}</option>
             <option value="">${_('All states')}</option>
@@ -81,7 +81,7 @@ ${ comps.menubar() }
           <tr>
           <tr>
             <td data-row-selector-exclude="true">
             <td data-row-selector-exclude="true">
                 %if t.taskAttemptIds:
                 %if t.taskAttemptIds:
-                <a href="${ url('single_task_attempt_logs', job=t.jobId, taskid=t.taskId, attemptid=t.taskAttemptIds[-1]) }" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a>
+                <a href="${ url('jobbrowser:single_task_attempt_logs', job=t.jobId, taskid=t.taskId, attemptid=t.taskAttemptIds[-1]) }" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a>
                 %endif
                 %endif
             </td>
             </td>
             <td>${t.taskId_short}</td>
             <td>${t.taskId_short}</td>
@@ -90,7 +90,7 @@ ${ comps.menubar() }
               <div class="bar">${ "%d" % (t.progress * 100) }%</div>
               <div class="bar">${ "%d" % (t.progress * 100) }%</div>
             </td>
             </td>
             <td>
             <td>
-              <a href="${ url('jobbrowser.views.tasks', job=job.jobId) }?${ get_state_link(request, 'taskstate', t.state.lower()) }"
+              <a href="${ url('jobbrowser:jobbrowser.views.tasks', job=job.jobId) }?${ get_state_link(request, 'taskstate', t.state.lower()) }"
                  title="${ _('Show only %(state)s tasks') % dict(state=t.state.lower()) }"
                  title="${ _('Show only %(state)s tasks') % dict(state=t.state.lower()) }"
                  class="${ t.state.lower() }">${ t.state.lower() }
                  class="${ t.state.lower() }">${ t.state.lower() }
               </a>
               </a>
@@ -98,7 +98,7 @@ ${ comps.menubar() }
             <td>${t.mostRecentState}</td>
             <td>${t.mostRecentState}</td>
             <td>${t.execStartTimeFormatted}</td>
             <td>${t.execStartTimeFormatted}</td>
             <td>${t.execFinishTimeFormatted}</td>
             <td>${t.execFinishTimeFormatted}</td>
-            <td><a href="${ url('jobbrowser.views.single_task', job=job.jobId, taskid=t.taskId) }" data-row-selector="true">${_('Attempts')}</a></td>
+            <td><a href="${ url('jobbrowser:jobbrowser.views.single_task', job=job.jobId, taskid=t.taskId) }" data-row-selector="true">${_('Attempts')}</a></td>
           </tr>
           </tr>
         %endfor
         %endfor
         </tbody>
         </tbody>

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

@@ -132,7 +132,7 @@ class TestJobBrowserWithHadoop(unittest.TestCase, OozieServerProvider):
   def create_design(cls):
   def create_design(cls):
     job_name = '%s_%s' % (cls.username, 'sleep_job')
     job_name = '%s_%s' % (cls.username, 'sleep_job')
     if not Document.objects.available_docs(Workflow, cls.user).filter(name=job_name).exists():
     if not Document.objects.available_docs(Workflow, cls.user).filter(name=job_name).exists():
-      response = cls.client.post(reverse('jobsub.views.new_design',
+      response = cls.client.post(reverse('jobsub:jobsub.views.new_design',
         kwargs={'node_type': 'mapreduce'}),
         kwargs={'node_type': 'mapreduce'}),
         data={'name': job_name,
         data={'name': job_name,
               'description': '',
               'description': '',
@@ -189,7 +189,7 @@ class TestJobBrowserWithHadoop(unittest.TestCase, OozieServerProvider):
       LOG.exception('failed to teardown tests')
       LOG.exception('failed to teardown tests')
 
 
     job_name = '%s_%s' % (TestJobBrowserWithHadoop.username, 'test_failed_jobs-1')
     job_name = '%s_%s' % (TestJobBrowserWithHadoop.username, 'test_failed_jobs-1')
-    response = TestJobBrowserWithHadoop.client.post(reverse('jobsub.views.new_design', kwargs={'node_type': 'mapreduce'}), {
+    response = TestJobBrowserWithHadoop.client.post(reverse('jobsub:jobsub.views.new_design', kwargs={'node_type': 'mapreduce'}), {
         'name': [job_name],
         'name': [job_name],
         'description': ['description test_failed_jobs-1'],
         'description': ['description test_failed_jobs-1'],
         'args': '',
         'args': '',

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

@@ -189,8 +189,8 @@ def massage_job_for_json(job, request=None, user=None):
     'name': hasattr(job, 'jobName') and job.jobName or '',
     'name': hasattr(job, 'jobName') and job.jobName or '',
     'status': job.status,
     'status': job.status,
     'yarnStatus': hasattr(job, 'yarnStatus') and job.yarnStatus or '',
     'yarnStatus': hasattr(job, 'yarnStatus') and job.yarnStatus or '',
-    'url': job.jobId and reverse('jobbrowser.views.single_job', kwargs={'job': job.jobId}) or '',
-    'logs': job.jobId and reverse('jobbrowser.views.job_single_logs', kwargs={'job': job.jobId}) or '',
+    'url': job.jobId and reverse('jobbrowser:jobbrowser.views.single_job', kwargs={'job': job.jobId}) or '',
+    'logs': job.jobId and reverse('jobbrowser:jobbrowser.views.job_single_logs', kwargs={'job': job.jobId}) or '',
     'queueName': hasattr(job, 'queueName') and job.queueName or _('N/A'),
     'queueName': hasattr(job, 'queueName') and job.queueName or _('N/A'),
     'priority': hasattr(job, 'priority') and job.priority or _('N/A'),
     'priority': hasattr(job, 'priority') and job.priority or _('N/A'),
     'user': job.user,
     'user': job.user,
@@ -219,7 +219,7 @@ def massage_job_for_json(job, request=None, user=None):
     'durationFormatted': hasattr(job, 'durationFormatted') and job.durationFormatted or '',
     'durationFormatted': hasattr(job, 'durationFormatted') and job.durationFormatted or '',
     'durationMs': hasattr(job, 'durationInMillis') and job.durationInMillis or 0,
     'durationMs': hasattr(job, 'durationInMillis') and job.durationInMillis or 0,
     'canKill': can_kill_job(job, request.user if request else user),
     'canKill': can_kill_job(job, request.user if request else user),
-    'killUrl': job.jobId and reverse('kill_job', kwargs={'job': job.jobId}) or '',
+    'killUrl': job.jobId and reverse('jobbrowser:kill_job', kwargs={'job': job.jobId}) or '',
     'diagnostics': hasattr(job, 'diagnostics') and job.diagnostics or '',
     'diagnostics': hasattr(job, 'diagnostics') and job.diagnostics or '',
   }
   }
   return job
   return job
@@ -229,8 +229,8 @@ def massage_task_for_json(task):
   task = {
   task = {
     'id': task.taskId,
     'id': task.taskId,
     'shortId': task.taskId_short,
     'shortId': task.taskId_short,
-    'url': task.taskId and reverse('jobbrowser.views.single_task', kwargs={'job': task.jobId, 'taskid': task.taskId}) or '',
-    'logs': task.taskAttemptIds and reverse('single_task_attempt_logs', kwargs={'job': task.jobId, 'taskid': task.taskId,
+    'url': task.taskId and reverse('jobbrowser:jobbrowser.views.single_task', kwargs={'job': task.jobId, 'taskid': task.taskId}) or '',
+    'logs': task.taskAttemptIds and reverse('jobbrowser:single_task_attempt_logs', kwargs={'job': task.jobId, 'taskid': task.taskId,
                                                                                 'attemptid': task.taskAttemptIds[-1]}) or '',
                                                                                 'attemptid': task.taskAttemptIds[-1]}) or '',
     'type': task.taskType
     'type': task.taskType
   }
   }

+ 2 - 2
apps/jobsub/src/jobsub/models.py

@@ -50,10 +50,10 @@ class JobDesign(models.Model):
     return reverse("jobsub.views.edit_design", kwargs=dict(id=self.id))
     return reverse("jobsub.views.edit_design", kwargs=dict(id=self.id))
 
 
   def clone_url(self):
   def clone_url(self):
-    return reverse("jobsub.views.clone_design", kwargs=dict(id=self.id))
+    return reverse("jobsub:jobsub.views.clone_design", kwargs=dict(id=self.id))
 
 
   def delete_url(self):
   def delete_url(self):
-    return reverse("jobsub.views.delete_design", kwargs=dict(id=self.id))
+    return reverse("jobsub:jobsub.views.delete_design", kwargs=dict(id=self.id))
 
 
   def submit_url(self):
   def submit_url(self):
     return reverse("jobsub.views.submit_design", kwargs=dict(id=self.id))
     return reverse("jobsub.views.submit_design", kwargs=dict(id=self.id))

+ 1 - 0
apps/jobsub/src/jobsub/settings.py

@@ -16,6 +16,7 @@
 DJANGO_APPS=['jobsub']
 DJANGO_APPS=['jobsub']
 NICE_NAME = "Job Designer"
 NICE_NAME = "Job Designer"
 REQUIRES_HADOOP = True
 REQUIRES_HADOOP = True
+IS_URL_NAMESPACED = True
 
 
 MIDDLEWARE_CLASSES=[]
 MIDDLEWARE_CLASSES=[]
 
 

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

@@ -64,7 +64,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     Workflow.objects.all().delete()
     Workflow.objects.all().delete()
 
 
   def create_design(self):
   def create_design(self):
-    response = self.client.post(reverse('jobsub.views.new_design',
+    response = self.client.post(reverse('jobsub:jobsub.views.new_design',
       kwargs={'node_type': 'mapreduce'}),
       kwargs={'node_type': 'mapreduce'}),
       data={'name': 'sleep_job',
       data={'name': 'sleep_job',
             'description': '',
             'description': '',
@@ -92,7 +92,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     assert_equal(3, Link.objects.filter(parent__workflow=self.design).count())
     assert_equal(3, Link.objects.filter(parent__workflow=self.design).count())
 
 
   def test_save_design(self):
   def test_save_design(self):
-    response = self.client.post(reverse('jobsub.views.save_design',
+    response = self.client.post(reverse('jobsub:jobsub.views.save_design',
       kwargs={'design_id': self.design.id}),
       kwargs={'design_id': self.design.id}),
       data={'name': 'mapreduce1',
       data={'name': 'mapreduce1',
             'description': '',
             'description': '',
@@ -108,7 +108,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     assert_equal(self.design.start.get_child('to').get_full_node().files, '[{"dummy": "", "name": "test"}]')
     assert_equal(self.design.start.get_child('to').get_full_node().files, '[{"dummy": "", "name": "test"}]')
 
 
   def test_get_design(self):
   def test_get_design(self):
-    response = self.client.get(reverse('jobsub.views.get_design',
+    response = self.client.get(reverse('jobsub:jobsub.views.get_design',
       kwargs={'design_id': self.design.id}),
       kwargs={'design_id': self.design.id}),
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
     assert_equal(response.status_code, 200)
     assert_equal(response.status_code, 200)
@@ -117,7 +117,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     grant_access("jobsub_test_note_me", "jobsub_test_note_me", "jobsub")
     grant_access("jobsub_test_note_me", "jobsub_test_note_me", "jobsub")
     add_to_group("jobsub_test_note_me")
     add_to_group("jobsub_test_note_me")
 
 
-    response = client_note_me.get(reverse('jobsub.views.get_design',
+    response = client_note_me.get(reverse('jobsub:jobsub.views.get_design',
       kwargs={'design_id': self.design.id}),
       kwargs={'design_id': self.design.id}),
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
     assert_equal(response.status_code, 500)
     assert_equal(response.status_code, 500)
@@ -129,7 +129,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     n_available = Document.objects.available_docs(Workflow, self.user).count()
     n_available = Document.objects.available_docs(Workflow, self.user).count()
     n_trashed = Document.objects.trashed_docs(Workflow, self.user).count()
     n_trashed = Document.objects.trashed_docs(Workflow, self.user).count()
 
 
-    response = self.client.post(reverse('jobsub.views.delete_design',
+    response = self.client.post(reverse('jobsub:jobsub.views.delete_design',
       kwargs={'design_id': self.design.id}),
       kwargs={'design_id': self.design.id}),
       follow=True,
       follow=True,
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
@@ -139,7 +139,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     assert_equal(n_trashed + 1, Document.objects.trashed_docs(Workflow, self.user).count())
     assert_equal(n_trashed + 1, Document.objects.trashed_docs(Workflow, self.user).count())
 
 
     # Destroy
     # Destroy
-    response = self.client.post(reverse('jobsub.views.delete_design',
+    response = self.client.post(reverse('jobsub:jobsub.views.delete_design',
       kwargs={'design_id': self.design.id}) + '?skip_trash',
       kwargs={'design_id': self.design.id}) + '?skip_trash',
       follow=True,
       follow=True,
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
@@ -153,7 +153,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     raise SkipTest
     raise SkipTest
     n_available = Document.objects.available_docs(Workflow, self.user).count()
     n_available = Document.objects.available_docs(Workflow, self.user).count()
 
 
-    response = self.client.post(reverse('jobsub.views.clone_design',
+    response = self.client.post(reverse('jobsub:jobsub.views.clone_design',
       kwargs={'design_id': self.design.id}),
       kwargs={'design_id': self.design.id}),
       follow=True,
       follow=True,
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
@@ -165,7 +165,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     n_available = Document.objects.available_docs(Workflow, self.user).count()
     n_available = Document.objects.available_docs(Workflow, self.user).count()
     n_trashed = Document.objects.trashed_docs(Workflow, self.user).count()
     n_trashed = Document.objects.trashed_docs(Workflow, self.user).count()
 
 
-    response = self.client.post(reverse('jobsub.views.delete_design',
+    response = self.client.post(reverse('jobsub:jobsub.views.delete_design',
       kwargs={'design_id': self.design.id}),
       kwargs={'design_id': self.design.id}),
       follow=True,
       follow=True,
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
@@ -174,7 +174,7 @@ class TestJobsubWithHadoop(OozieServerProvider):
     assert_equal(n_available - 1, Document.objects.available_docs(Workflow, self.user).count())
     assert_equal(n_available - 1, Document.objects.available_docs(Workflow, self.user).count())
     assert_equal(n_trashed + 1, Document.objects.trashed_docs(Workflow, self.user).count())
     assert_equal(n_trashed + 1, Document.objects.trashed_docs(Workflow, self.user).count())
 
 
-    response = self.client.post(reverse('jobsub.views.restore_design',
+    response = self.client.post(reverse('jobsub:jobsub.views.restore_design',
       kwargs={'design_id': self.design.id}),
       kwargs={'design_id': self.design.id}),
       follow=True,
       follow=True,
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')
       HTTP_X_REQUESTED_WITH='XMLHttpRequest')

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

@@ -256,7 +256,7 @@ class TestMetastoreWithHadoop(BeeswaxSampleProvider):
       path = '/user/hive/warehouse/%s.db/test_partitions/baz=baz_one/boom=12345' % self.db_name
       path = '/user/hive/warehouse/%s.db/test_partitions/baz=baz_one/boom=12345' % self.db_name
     else:
     else:
       path = '/user/hive/warehouse/test_partitions/baz=baz_one/boom=12345'
       path = '/user/hive/warehouse/test_partitions/baz=baz_one/boom=12345'
-    filebrowser_path = urllib.parse.unquote(reverse("filebrowser.views.view", kwargs={'path': path}))
+    filebrowser_path = urllib.parse.unquote(reverse("filebrowser:filebrowser.views.view", kwargs={'path': path}))
     assert_equal(response.request['PATH_INFO'], filebrowser_path)
     assert_equal(response.request['PATH_INFO'], filebrowser_path)
 
 
   def test_drop_partition(self):
   def test_drop_partition(self):

+ 2 - 2
apps/oozie/src/oozie/templates/dashboard/list_oozie_workflow_action.mako

@@ -179,12 +179,12 @@ ${ layout.menubar(section='workflows', dashboard=True) }
             % for child_id in action.externalChildIDs.split(','):
             % for child_id in action.externalChildIDs.split(','):
               <tr>
               <tr>
                 <td>
                 <td>
-                  <a href="${ url('jobbrowser.views.job_single_logs', job=child_id) }" title="${ _('View the logs') }" rel="tooltip">
+                  <a href="${ url('jobbrowser:jobbrowser.views.job_single_logs', job=child_id) }" title="${ _('View the logs') }" rel="tooltip">
                     <i class="fa fa-tasks"></i>
                     <i class="fa fa-tasks"></i>
                   </a>
                   </a>
                 </td>
                 </td>
                 <td>
                 <td>
-                  <a href="${ url('jobbrowser.views.single_job', job=child_id) }">
+                  <a href="${ url('jobbrowser:jobbrowser.views.single_job', job=child_id) }">
                     ${ "_".join(child_id.split("_")[-2:]) }
                     ${ "_".join(child_id.split("_")[-2:]) }
                   </a>
                   </a>
                 </td>
                 </td>

+ 1 - 1
apps/oozie/src/oozie/templates/editor/gen/workflow-graph-status.xml.mako

@@ -54,7 +54,7 @@
   <div class="row-fluid">
   <div class="row-fluid">
     % if action and action.externalId and re.match('\\w+', action.externalId):
     % if action and action.externalId and re.match('\\w+', action.externalId):
       <div style="text-align:left; padding:10px;border:1px solid #DDD; border-top:0" class="span12">
       <div style="text-align:left; padding:10px;border:1px solid #DDD; border-top:0" class="span12">
-          <div style="font-size: 30px; margin-top:14px" class="pull-right"><a href="${ url('jobbrowser.views.job_single_logs', job=action.externalId) }" title="${ _('View the logs') }" rel="tooltip" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a></div>
+          <div style="font-size: 30px; margin-top:14px" class="pull-right"><a href="${ url('jobbrowser:jobbrowser.views.job_single_logs', job=action.externalId) }" title="${ _('View the logs') }" rel="tooltip" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a></div>
           <h4><a href="${ action.get_absolute_url() }" title="${ _('View workflow action') }" rel="tooltip">${ form.instance.__unicode__() }</a></h4>
           <h4><a href="${ action.get_absolute_url() }" title="${ _('View workflow action') }" rel="tooltip">${ form.instance.__unicode__() }</a></h4>
           <span class="muted">${ form.instance.description }&nbsp;</span>
           <span class="muted">${ form.instance.description }&nbsp;</span>
           % if action:
           % if action:

+ 1 - 1
apps/oozie/src/oozie/templates/editor2/gen/workflow-graph-status.xml.mako

@@ -53,7 +53,7 @@
   <div class="row-fluid">
   <div class="row-fluid">
     % if action and action.externalId:
     % if action and action.externalId:
       <div style="text-align:left; padding:10px;border:1px solid #DDD; border-top:0" class="span12">
       <div style="text-align:left; padding:10px;border:1px solid #DDD; border-top:0" class="span12">
-          <div style="font-size: 30px; margin-top:14px" class="pull-right"><a href="${ url('jobbrowser.views.job_single_logs', job=action.externalId) }" title="${ _('View the logs') }" rel="tooltip" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a></div>
+          <div style="font-size: 30px; margin-top:14px" class="pull-right"><a href="${ url('jobbrowser:jobbrowser.views.job_single_logs', job=action.externalId) }" title="${ _('View the logs') }" rel="tooltip" data-row-selector-exclude="true"><i class="fa fa-tasks"></i></a></div>
           <h4><a href="${ action.get_absolute_url() }" title="${ _('View workflow action') }" rel="tooltip">${ form.instance.__unicode__() }</a></h4>
           <h4><a href="${ action.get_absolute_url() }" title="${ _('View workflow action') }" rel="tooltip">${ form.instance.__unicode__() }</a></h4>
           <span class="muted">${ form.instance.description }&nbsp;</span>
           <span class="muted">${ form.instance.description }&nbsp;</span>
           % if action:
           % if action:

+ 1 - 0
apps/proxy/src/proxy/settings.py

@@ -16,3 +16,4 @@
 DJANGO_APPS = [ "proxy" ]
 DJANGO_APPS = [ "proxy" ]
 NICE_NAME = "Proxy"
 NICE_NAME = "Proxy"
 REQUIRES_HADOOP = False
 REQUIRES_HADOOP = False
+IS_URL_NAMESPACED = True

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

@@ -114,7 +114,7 @@ def proxy(request, host, port, path):
   return HttpResponse(resp_text, content_type=data.headers.get("content-type"))
   return HttpResponse(resp_text, content_type=data.headers.get("content-type"))
 
 
 def _reverse(host, port, path):
 def _reverse(host, port, path):
-  return reverse("proxy.views.proxy", kwargs=dict(host=host, port=port, path=path))
+  return reverse("proxy:proxy.views.proxy", kwargs=dict(host=host, port=port, path=path))
 def _rewrite_url(url):
 def _rewrite_url(url):
   """Used by _rewrite_links"""
   """Used by _rewrite_links"""
   scheme, netloc, path, params, query, fragment = urlparse(url)
   scheme, netloc, path, params, query, fragment = urlparse(url)

+ 1 - 0
apps/useradmin/src/useradmin/settings.py

@@ -19,6 +19,7 @@ NICE_NAME = "User Admin"
 REQUIRES_HADOOP = False
 REQUIRES_HADOOP = False
 ICON = "useradmin/art/icon_useradmin_48.png"
 ICON = "useradmin/art/icon_useradmin_48.png"
 MENU_INDEX = 60
 MENU_INDEX = 60
+IS_URL_NAMESPACED = True
 
 
 PERMISSION_ACTIONS = (
 PERMISSION_ACTIONS = (
   ("access_view:useradmin:edit_user", "Access to profile page on User Admin"),
   ("access_view:useradmin:edit_user", "Access to profile page on User Admin"),

+ 4 - 4
apps/useradmin/src/useradmin/templates/add_ldap_users.mako

@@ -31,7 +31,7 @@ ${ layout.menubar(section='users') }
     <h1 class="card-heading simple">${_('Hue Users - Add/Sync LDAP user')}</h1>
     <h1 class="card-heading simple">${_('Hue Users - Add/Sync LDAP user')}</h1>
     <br/>
     <br/>
 
 
-    <form id="syncForm" action="${ url('useradmin.views.add_ldap_users') }" method="POST" class="form form-horizontal" autocomplete="off">
+    <form id="syncForm" action="${ url('useradmin:useradmin.views.add_ldap_users') }" method="POST" class="form form-horizontal" autocomplete="off">
       ${ csrf_token(request) | n,unicode }
       ${ csrf_token(request) | n,unicode }
       % if is_embeddable:
       % if is_embeddable:
         <input type="hidden" value="true" name="is_embeddable" />
         <input type="hidden" value="true" name="is_embeddable" />
@@ -52,7 +52,7 @@ ${ layout.menubar(section='users') }
         % else:
         % else:
           <input type="submit" class="btn btn-primary disable-feedback" value="${_('Add/Sync user')}"/>
           <input type="submit" class="btn btn-primary disable-feedback" value="${_('Add/Sync user')}"/>
         % endif
         % endif
-        <a href="${ url('useradmin.views.list_users') }" class="btn">${_('Cancel')}</a>
+        <a href="${ url('useradmin:useradmin.views.list_users') }" class="btn">${_('Cancel')}</a>
       </div>
       </div>
     </form>
     </form>
   </div>
   </div>
@@ -64,7 +64,7 @@ ${ layout.menubar(section='users') }
     $addLdapUsersComponents.find("#id_groups").jHueSelector({
     $addLdapUsersComponents.find("#id_groups").jHueSelector({
       selectAllLabel: "${_('Select all')}",
       selectAllLabel: "${_('Select all')}",
       searchPlaceholder: "${_('Search')}",
       searchPlaceholder: "${_('Search')}",
-      noChoicesFound: "${_('No groups found.')} <a href='${url('useradmin.views.edit_group')}'>${_('Create a new group now')} &raquo;</a>",
+      noChoicesFound: "${_('No groups found.')} <a href='${url('useradmin:useradmin.views.edit_group')}'>${_('Create a new group now')} &raquo;</a>",
       width: 618,
       width: 618,
       height: 240
       height: 240
     });
     });
@@ -76,7 +76,7 @@ ${ layout.menubar(section='users') }
           renderUseradminErrors(data.errors);
           renderUseradminErrors(data.errors);
         }
         }
         else if (data && data.status === 0) {
         else if (data && data.status === 0) {
-          huePubSub.publish('open.link', '${ url('useradmin.views.list_users') }');
+          huePubSub.publish('open.link', '${ url('useradmin:useradmin.views.list_users') }');
           $.jHueNotify.info("${ _('User added/synced correctly') }");
           $.jHueNotify.info("${ _('User added/synced correctly') }");
         }
         }
       },
       },

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

@@ -106,7 +106,7 @@ ${ layout.menubar(section='groups') }
     $("#id_members").jHueSelector({
     $("#id_members").jHueSelector({
       selectAllLabel: "${_('Select all')}",
       selectAllLabel: "${_('Select all')}",
       searchPlaceholder: "${_('Search')}",
       searchPlaceholder: "${_('Search')}",
-      noChoicesFound: "${_('No users found.')} <a href='${url('useradmin.views.edit_user')}'>${_('Create a new user now')} &raquo;</a>",
+      noChoicesFound: "${_('No users found.')} <a href='${url('useradmin:useradmin.views.edit_user')}'>${_('Create a new user now')} &raquo;</a>",
       width: 600,
       width: 600,
       height: 240
       height: 240
     });
     });

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

@@ -147,7 +147,7 @@ $(document).ready(function(){
   $editUserComponents.find("#id_groups").jHueSelector({
   $editUserComponents.find("#id_groups").jHueSelector({
     selectAllLabel: "${_('Select all')}",
     selectAllLabel: "${_('Select all')}",
     searchPlaceholder: "${_('Search')}",
     searchPlaceholder: "${_('Search')}",
-    noChoicesFound: "${_('No groups found.')} <a href='${url('useradmin.views.edit_group')}'>${_('Create a new group now')} &raquo;</a>",
+    noChoicesFound: "${_('No groups found.')} <a href='${url('useradmin:useradmin.views.edit_group')}'>${_('Create a new group now')} &raquo;</a>",
     width:618,
     width:618,
     height:240
     height:240
   });
   });

+ 5 - 5
apps/useradmin/src/useradmin/templates/layout.mako

@@ -64,30 +64,30 @@ def is_selected(section, matcher):
               </li>
               </li>
               % if is_admin(user):
               % if is_admin(user):
                 <li class="${is_selected(section, 'users')}">
                 <li class="${is_selected(section, 'users')}">
-                  <a href="${ url('useradmin.views.list_users') }">
+                  <a href="${ url('useradmin:useradmin.views.list_users') }">
                     ${ _('Users') }
                     ${ _('Users') }
                   </a>
                   </a>
                 </li>
                 </li>
                 <li class="${is_selected(section, 'groups')}">
                 <li class="${is_selected(section, 'groups')}">
-                  <a href="${ url('useradmin.views.list_groups') }">
+                  <a href="${ url('useradmin:useradmin.views.list_groups') }">
                     ${ _('Groups') }
                     ${ _('Groups') }
                   </a>
                   </a>
                 </li>
                 </li>
                 <li class="${is_selected(section, 'permissions')}">
                 <li class="${is_selected(section, 'permissions')}">
-                  <a href="${ url('useradmin.views.list_permissions') }">
+                  <a href="${ url('useradmin:useradmin.views.list_permissions') }">
                     ${ _('Permissions') }
                     ${ _('Permissions') }
                   </a>
                   </a>
                 </li>
                 </li>
                 % if ENABLE_ORGANIZATIONS.get():
                 % if ENABLE_ORGANIZATIONS.get():
                 <li class="${is_selected(section, 'organizations')}">
                 <li class="${is_selected(section, 'organizations')}">
-                  <a href="${ url('useradmin.views.list_organizations') }">
+                  <a href="${ url('useradmin:useradmin.views.list_organizations') }">
                     ${ _('Organizations') }
                     ${ _('Organizations') }
                   </a>
                   </a>
                 </li>
                 </li>
                 % endif
                 % endif
                 % if USE_DEFAULT_CONFIGURATION.get():
                 % if USE_DEFAULT_CONFIGURATION.get():
                 <li class="${is_selected(section, 'configurations')}">
                 <li class="${is_selected(section, 'configurations')}">
-                  <a href="${ url('useradmin.views.list_configurations') }">
+                  <a href="${ url('useradmin:useradmin.views.list_configurations') }">
                     ${ _('Configurations') }
                     ${ _('Configurations') }
                   </a>
                   </a>
                 </li>
                 </li>

+ 4 - 4
apps/useradmin/src/useradmin/templates/list_groups.mako

@@ -53,10 +53,10 @@ ${layout.menubar(section='groups')}
       </%def>
       </%def>
       <%def name="creation()">
       <%def name="creation()">
         %if is_admin(user):
         %if is_admin(user):
-          <a id="addGroupBtn" href="${url('useradmin.views.edit_group')}" class="btn"><i
+          <a id="addGroupBtn" href="${url('useradmin:useradmin.views.edit_group')}" class="btn"><i
               class="fa fa-plus-circle"></i> ${_('Add group')}</a>
               class="fa fa-plus-circle"></i> ${_('Add group')}</a>
           % if is_ldap_setup:
           % if is_ldap_setup:
-            <a id="addLdapGroupBtn" href="${url('useradmin.views.add_ldap_groups')}" class="btn"><i
+            <a id="addLdapGroupBtn" href="${url('useradmin:useradmin.views.add_ldap_groups')}" class="btn"><i
                 class="fa fa-refresh"></i> ${_('Add/Sync LDAP group')}</a>
                 class="fa fa-refresh"></i> ${_('Add/Sync LDAP group')}</a>
           % endif
           % endif
           <a href="http://gethue.com/making-hadoop-accessible-to-your-employees-with-ldap/"
           <a href="http://gethue.com/making-hadoop-accessible-to-your-employees-with-ldap/"
@@ -92,7 +92,7 @@ ${layout.menubar(section='groups')}
           <td>
           <td>
             % if is_admin(user):
             % if is_admin(user):
               <strong><a title="${ _('Edit %(groupname)s') % dict(groupname=group.name) }"
               <strong><a title="${ _('Edit %(groupname)s') % dict(groupname=group.name) }"
-                        href="${ url('useradmin.views.edit_group', name=group.name) }"
+                        href="${ url('useradmin:useradmin.views.edit_group', name=group.name) }"
                         data-row-selector="true">${group.name}</a></strong>
                         data-row-selector="true">${group.name}</a></strong>
             % else:
             % else:
               <strong>${group.name}</strong>
               <strong>${group.name}</strong>
@@ -115,7 +115,7 @@ ${layout.menubar(section='groups')}
     </table>
     </table>
   </div>
   </div>
   <div class="modal hide fade delete-group">
   <div class="modal hide fade delete-group">
-    <form action="${ url('useradmin.views.delete_group') }" method="POST">
+    <form action="${ url('useradmin:useradmin.views.delete_group') }" method="POST">
       ${ csrf_token(request) | n,unicode }
       ${ csrf_token(request) | n,unicode }
       % if is_embeddable:
       % if is_embeddable:
         <input type="hidden" value="true" name="is_embeddable" />
         <input type="hidden" value="true" name="is_embeddable" />

+ 3 - 3
apps/useradmin/src/useradmin/templates/list_organizations.mako

@@ -51,10 +51,10 @@ ${ layout.menubar(section='organizations') }
       </%def>
       </%def>
       <%def name="creation()">
       <%def name="creation()">
         %if is_admin(user):
         %if is_admin(user):
-          <a id="addGroupBtn" href="${url('useradmin.views.edit_group')}" class="btn"><i
+          <a id="addGroupBtn" href="${url('useradmin:useradmin.views.edit_group')}" class="btn"><i
               class="fa fa-plus-circle"></i> ${_('Add organization')}</a>
               class="fa fa-plus-circle"></i> ${_('Add organization')}</a>
           % if is_ldap_setup:
           % if is_ldap_setup:
-            <a id="addLdapGroupBtn" href="${url('useradmin.views.add_ldap_groups')}" class="btn"><i
+            <a id="addLdapGroupBtn" href="${url('useradmin:useradmin.views.add_ldap_groups')}" class="btn"><i
                 class="fa fa-refresh"></i> ${_('Add/Sync LDAP group')}</a>
                 class="fa fa-refresh"></i> ${_('Add/Sync LDAP group')}</a>
           % endif
           % endif
           <a href="http://gethue.com/making-hadoop-accessible-to-your-employees-with-ldap/"
           <a href="http://gethue.com/making-hadoop-accessible-to-your-employees-with-ldap/"
@@ -110,7 +110,7 @@ ${ layout.menubar(section='organizations') }
   </div>
   </div>
 
 
   <div class="modal hide fade delete-group">
   <div class="modal hide fade delete-group">
-    <form action="${ url('useradmin.views.delete_group') }" method="POST">
+    <form action="${ url('useradmin:useradmin.views.delete_group') }" method="POST">
       ${ csrf_token(request) | n,unicode }
       ${ csrf_token(request) | n,unicode }
       % if is_embeddable:
       % if is_embeddable:
         <input type="hidden" value="true" name="is_embeddable" />
         <input type="hidden" value="true" name="is_embeddable" />

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

@@ -62,7 +62,7 @@ from useradmin.models import group_permissions, Group
               % if is_admin(user):
               % if is_admin(user):
                 <strong>
                 <strong>
                   <a title="${ _('Edit permission') }"
                   <a title="${ _('Edit permission') }"
-                      href="${ url('useradmin.views.edit_permission', app=perm.app, priv=perm.action) }"
+                      href="${ url('useradmin:useradmin.views.edit_permission', app=perm.app, priv=perm.action) }"
                       data-name="${ perm.app }" data-row-selector="true">${ perm.app }
                       data-name="${ perm.app }" data-row-selector="true">${ perm.app }
                   </a>
                   </a>
                 </strong>
                 </strong>

+ 5 - 5
apps/useradmin/src/useradmin/templates/list_users.mako

@@ -55,15 +55,15 @@ ${layout.menubar(section='users')}
       <%def name="creation()">
       <%def name="creation()">
         % if is_admin(user):
         % if is_admin(user):
           % if is_ldap_setup:
           % if is_ldap_setup:
-            <a href="${ url('useradmin.views.add_ldap_users') }" class="btn">
+            <a href="${ url('useradmin:useradmin.views.add_ldap_users') }" class="btn">
               <i class="fa fa-plus-circle"></i> ${_('Add/Sync LDAP user')}
               <i class="fa fa-plus-circle"></i> ${_('Add/Sync LDAP user')}
             </a>
             </a>
             <a href="javascript:void(0)" class="btn confirmationModal"
             <a href="javascript:void(0)" class="btn confirmationModal"
-                data-confirmation-url="${ url('useradmin_views_sync_ldap_users_groups') }${ is_embeddable and '?is_embeddable=true' or ''}">
+                data-confirmation-url="${ url('useradmin:useradmin_views_sync_ldap_users_groups') }${ is_embeddable and '?is_embeddable=true' or ''}">
                 <i class="fa fa-refresh"></i> ${_('Sync LDAP users/groups')}
                 <i class="fa fa-refresh"></i> ${_('Sync LDAP users/groups')}
             </a>
             </a>
           % else:
           % else:
-            <a href="${ url('useradmin.views.edit_user') }" class="btn">
+            <a href="${ url('useradmin:useradmin.views.edit_user') }" class="btn">
               <i class="fa fa-plus-circle"></i> ${_('Add user')}
               <i class="fa fa-plus-circle"></i> ${_('Add user')}
             </a>
             </a>
           % endif
           % endif
@@ -107,7 +107,7 @@ ${layout.menubar(section='users')}
             % if is_admin(user) or user.username == listed_user.username:
             % if is_admin(user) or user.username == listed_user.username:
               <strong>
               <strong>
                 <a title="${_('Edit %(username)s') % dict(username=listed_user.username)}"
                 <a title="${_('Edit %(username)s') % dict(username=listed_user.username)}"
-                    href="${ url('useradmin.views.edit_user', username=listed_user.username) }"
+                    href="${ url('useradmin:useradmin.views.edit_user', username=listed_user.username) }"
                     data-row-selector="true">
                     data-row-selector="true">
                   ${ listed_user.username }
                   ${ listed_user.username }
                 </a>
                 </a>
@@ -149,7 +149,7 @@ ${layout.menubar(section='users')}
   <div id="syncLdap" class="modal hide fade"></div>
   <div id="syncLdap" class="modal hide fade"></div>
 
 
   <div class="modal hide fade delete-user">
   <div class="modal hide fade delete-user">
-    <form action="${ url('useradmin.views.delete_user') }" method="POST">
+    <form action="${ url('useradmin:useradmin.views.delete_user') }" method="POST">
       ${ csrf_token(request) | n,unicode }
       ${ csrf_token(request) | n,unicode }
       % if is_embeddable:
       % if is_embeddable:
         <input type="hidden" value="true" name="is_embeddable" />
         <input type="hidden" value="true" name="is_embeddable" />

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

@@ -178,7 +178,7 @@ def massage_users_for_json(users, extended=False):
       'last_name': user.last_name,
       'last_name': user.last_name,
       'email': user.email,
       'email': user.email,
       'last_login': user.last_login,
       'last_login': user.last_login,
-      'editURL': reverse('useradmin.views.edit_user', kwargs={'username': user.username})
+      'editURL': reverse('useradmin:useradmin.views.edit_user', kwargs={'username': user.username})
     }
     }
     if extended:
     if extended:
       appendable['groups'] = massage_groups_for_json(user.groups.all())
       appendable['groups'] = massage_groups_for_json(user.groups.all())

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

@@ -155,7 +155,7 @@ def dt_login(request, from_modal=False):
           LOG.error('Could not create home directory at login for %s.' % user, exc_info=e)
           LOG.error('Could not create home directory at login for %s.' % user, exc_info=e)
 
 
         if require_change_password(userprofile):
         if require_change_password(userprofile):
-          return HttpResponseRedirect('/hue' + reverse('useradmin.views.edit_user', kwargs={'username': user.username}))
+          return HttpResponseRedirect('/hue' + reverse('useradmin:useradmin.views.edit_user', kwargs={'username': user.username}))
 
 
         userprofile.first_login = False
         userprofile.first_login = False
         userprofile.last_activity = datetime.now()
         userprofile.last_activity = datetime.now()

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

@@ -109,7 +109,7 @@ def location_to_url(location, strict=True, is_embeddable=False):
       path = split_path[2]
       path = split_path[2]
 
 
     try:
     try:
-      filebrowser_path = reverse("filebrowser.views.view", kwargs=dict(path=path))
+      filebrowser_path = reverse("filebrowser:filebrowser.views.view", kwargs=dict(path=path))
     except Exception as e:
     except Exception as e:
       LOG.warn('No table filesystem link: %s' % e)
       LOG.warn('No table filesystem link: %s' % e)
       return None
       return None

+ 2 - 2
desktop/core/src/desktop/templates/common_header.mako

@@ -299,7 +299,7 @@ ${ hueIcons.symbols() }
       <ul class="dropdown-menu pull-right">
       <ul class="dropdown-menu pull-right">
       % if view_profile:
       % if view_profile:
       <li>
       <li>
-        <a href="${ url('useradmin.views.edit_user', username=user.username) }"><i class="fa fa-fw fa-key"></i>
+        <a href="${ url('useradmin:useradmin.views.edit_user', username=user.username) }"><i class="fa fa-fw fa-key"></i>
           % if is_ldap_setup:
           % if is_ldap_setup:
             ${_('View Profile')}
             ${_('View Profile')}
           % else:
           % else:
@@ -308,7 +308,7 @@ ${ hueIcons.symbols() }
         </a>
         </a>
       </li>
       </li>
         % if is_admin(user):
         % if is_admin(user):
-          <li><a href="${ url('useradmin.views.list_users') }"><i class="fa fa-fw fa-group"></i> ${_('Manage Users')}</a></li>
+          <li><a href="${ url('useradmin:useradmin.views.list_users') }"><i class="fa fa-fw fa-group"></i> ${_('Manage Users')}</a></li>
         % endif
         % endif
       % endif
       % endif
       </ul>
       </ul>

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

@@ -250,7 +250,7 @@ for app in appmanager.DESKTOP_MODULES:
     else:
     else:
       namespace = None
       namespace = None
     if namespace or app in appmanager.DESKTOP_APPS:
     if namespace or app in appmanager.DESKTOP_APPS:
-      app_urls_patterns.append(url('^' + re.escape(app.name) + '/', include(app.urls, namespace=namespace)))
+      app_urls_patterns.append(url('^' + re.escape(app.name) + '/', include((app.urls, app.name), namespace=namespace)))
       app.urls_imported = True
       app.urls_imported = True
 
 
 static_patterns.append(
 static_patterns.append(

+ 2 - 2
desktop/libs/liboozie/src/liboozie/types.py

@@ -198,7 +198,7 @@ class WorkflowAction(Action):
   def get_absolute_log_url(self):
   def get_absolute_log_url(self):
     url = None
     url = None
     if self.externalId and (re.match('job_.*', self.externalId) or re.match('application_.*', self.externalId)):
     if self.externalId and (re.match('job_.*', self.externalId) or re.match('application_.*', self.externalId)):
-      url = self.externalId and reverse('jobbrowser.views.job_single_logs', kwargs={'job': self.externalId}) or ''
+      url = self.externalId and reverse('jobbrowser:jobbrowser.views.job_single_logs', kwargs={'job': self.externalId}) or ''
     return url
     return url
 
 
   def get_external_id_url(self):
   def get_external_id_url(self):
@@ -206,7 +206,7 @@ class WorkflowAction(Action):
     if self.externalId and self.externalId.endswith('W'):
     if self.externalId and self.externalId.endswith('W'):
       url = reverse('oozie:list_oozie_workflow', kwargs={'job_id': self.externalId}) or ''
       url = reverse('oozie:list_oozie_workflow', kwargs={'job_id': self.externalId}) or ''
     elif self.externalId and re.match('job_.*', self.externalId):
     elif self.externalId and re.match('job_.*', self.externalId):
-      url = reverse('jobbrowser.views.single_job', kwargs={'job': self.externalId}) or ''
+      url = reverse('jobbrowser:jobbrowser.views.single_job', kwargs={'job': self.externalId}) or ''
     return url
     return url
 
 
 
 

+ 1 - 1
desktop/libs/notebook/src/notebook/connectors/dataeng.py

@@ -122,7 +122,7 @@ class DataEngApi(Api):
     job_id = snippet['result']['handle']['id']
     job_id = snippet['result']['handle']['id']
     return [{
     return [{
         'name': job_id,
         'name': job_id,
-        'url': reverse('jobbrowser.views.apps') + '#!' + job_id,
+        'url': reverse('jobbrowser:jobbrowser.views.apps') + '#!' + job_id,
         'started': True,
         'started': True,
         'finished': False # Would need call to check_status
         'finished': False # Would need call to check_status
       }
       }

+ 1 - 1
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -489,7 +489,7 @@ class HS2Api(Api):
 
 
       jobs = [{
       jobs = [{
           'name': job.get('job_id', ''),
           'name': job.get('job_id', ''),
-          'url': reverse('jobbrowser.views.single_job', kwargs={'job': job.get('job_id', '')}) if has_jobbrowser else '',
+          'url': reverse('jobbrowser:jobbrowser.views.single_job', kwargs={'job': job.get('job_id', '')}) if has_jobbrowser else '',
           'started': job.get('started', False),
           'started': job.get('started', False),
           'finished': job.get('finished', False)
           'finished': job.get('finished', False)
         }
         }

+ 1 - 1
desktop/libs/notebook/src/notebook/connectors/oozie_batch.py

@@ -160,7 +160,7 @@ class OozieApi(Api):
       if action.externalId is not None:
       if action.externalId is not None:
         jobs.append({
         jobs.append({
           'name': action.externalId,
           'name': action.externalId,
-          'url': reverse('jobbrowser.views.single_job', kwargs={'job': action.externalId}),
+          'url': reverse('jobbrowser:jobbrowser.views.single_job', kwargs={'job': action.externalId}),
           'started': action.startTime is not None,
           'started': action.startTime is not None,
           'finished': action.endTime is not None
           'finished': action.endTime is not None
         })
         })

+ 1 - 1
docs/docs-site/content/releases/release-notes-2.0.0-beta.md

@@ -365,7 +365,7 @@ List of All Commits
 * HUE-633. [jobsub] Port examples to new design models
 * HUE-633. [jobsub] Port examples to new design models
 * [test] Work around a webhdfs redirect bug in test
 * [test] Work around a webhdfs redirect bug in test
 * [doc] document dependency on libldap2-dev
 * [doc] document dependency on libldap2-dev
-* HUE-648. [fb] filebrowser.views.view() makes too many filesystem calls
+* HUE-648. [fb] filebrowser:filebrowser.views.view() makes too many filesystem calls
 * HUE-635 Porting to Bootstrap 2
 * HUE-635 Porting to Bootstrap 2
 * HUE-647 changed my home link and breadcrumbs
 * HUE-647 changed my home link and breadcrumbs
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643

+ 1 - 1
docs/docs-site/content/releases/release-notes-2.0.1.md

@@ -373,7 +373,7 @@ List of All Commits
 * HUE-633. [jobsub] Port examples to new design models
 * HUE-633. [jobsub] Port examples to new design models
 * [test] Work around a webhdfs redirect bug in test
 * [test] Work around a webhdfs redirect bug in test
 * [doc] document dependency on libldap2-dev
 * [doc] document dependency on libldap2-dev
-* HUE-648. [fb] filebrowser.views.view() makes too many filesystem calls
+* HUE-648. [fb] filebrowser:filebrowser.views.view() makes too many filesystem calls
 * HUE-635 Porting to Bootstrap 2
 * HUE-635 Porting to Bootstrap 2
 * HUE-647 changed my home link and breadcrumbs
 * HUE-647 changed my home link and breadcrumbs
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643

+ 2 - 2
docs/gethue/content/en/posts/2015-04-08-developer-guide-on-upgrading-apps-for-django-1-6.md

@@ -92,13 +92,13 @@ We recommend that developers migrate over to returning objects. Hue itself shoul
 
 
 Django’s `django.core.urlresolvers.reverse` (and therefore the `url` function in mako scripts) now automatically escapes arguments. So so uses of these functions should be changed from:
 Django’s `django.core.urlresolvers.reverse` (and therefore the `url` function in mako scripts) now automatically escapes arguments. So so uses of these functions should be changed from:
 
 
-<pre><code class="python"><a href="${ url('useradmin.views.edit_user', username=urllib.quote(user.username)) }">...</a>
+<pre><code class="python"><a href="${ url('useradmin:useradmin.views.edit_user', username=urllib.quote(user.username)) }">...</a>
 
 
 </code></pre>
 </code></pre>
 
 
 To:
 To:
 
 
-<pre><code class="python"><a href="${ url('useradmin.views.edit_user', username=user.username) }">...</a>
+<pre><code class="python"><a href="${ url('useradmin:useradmin.views.edit_user', username=user.username) }">...</a>
 
 
 </code></pre>
 </code></pre>
 
 

+ 2 - 2
docs/gethue/content/jp/posts/2015-04-10-developer-guide-on-upgrading-apps-for-django-1-6-2.md

@@ -87,12 +87,12 @@ HueはDjango 1.4.5からDjango1.6.10にアップグレードされています
 
 
 Djangoの`django.core.urlresolvers.reverse`(およびmakoスクリプトの `url`関数)は自動的に引数をエスケープします。従って、これらの関数の使用は、以下から:
 Djangoの`django.core.urlresolvers.reverse`(およびmakoスクリプトの `url`関数)は自動的に引数をエスケープします。従って、これらの関数の使用は、以下から:
 
 
-<pre><code class="python">&lt;a href="${ url('useradmin.views.edit_user', username=urllib.quote(user.username)) }"&gt;...&lt;/a&gt;
+<pre><code class="python">&lt;a href="${ url('useradmin:useradmin.views.edit_user', username=urllib.quote(user.username)) }"&gt;...&lt;/a&gt;
 </pre>
 </pre>
 
 
 下記のように更新します:
 下記のように更新します:
 
 
-<pre><code class="python">&lt;a href="${ url('useradmin.views.edit_user', username=user.username) }"&gt;...&lt;/a&gt;
+<pre><code class="python">&lt;a href="${ url('useradmin:useradmin.views.edit_user', username=user.username) }"&gt;...&lt;/a&gt;
 </pre>
 </pre>
 
 
 ### StreamingHttpResponse
 ### StreamingHttpResponse

+ 1 - 1
docs/release-notes/release-notes-2.0.0-beta.txt

@@ -357,7 +357,7 @@ List of All Commits
 * HUE-633. [jobsub] Port examples to new design models
 * HUE-633. [jobsub] Port examples to new design models
 * [test] Work around a webhdfs redirect bug in test
 * [test] Work around a webhdfs redirect bug in test
 * [doc] document dependency on libldap2-dev
 * [doc] document dependency on libldap2-dev
-* HUE-648. [fb] filebrowser.views.view() makes too many filesystem calls
+* HUE-648. [fb] filebrowser:filebrowser.views.view() makes too many filesystem calls
 * HUE-635 Porting to Bootstrap 2
 * HUE-635 Porting to Bootstrap 2
 * HUE-647 changed my home link and breadcrumbs
 * HUE-647 changed my home link and breadcrumbs
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643

+ 1 - 1
docs/release-notes/release-notes-2.0.1.txt

@@ -365,7 +365,7 @@ List of All Commits
 * HUE-633. [jobsub] Port examples to new design models
 * HUE-633. [jobsub] Port examples to new design models
 * [test] Work around a webhdfs redirect bug in test
 * [test] Work around a webhdfs redirect bug in test
 * [doc] document dependency on libldap2-dev
 * [doc] document dependency on libldap2-dev
-* HUE-648. [fb] filebrowser.views.view() makes too many filesystem calls
+* HUE-648. [fb] filebrowser:filebrowser.views.view() makes too many filesystem calls
 * HUE-635 Porting to Bootstrap 2
 * HUE-635 Porting to Bootstrap 2
 * HUE-647 changed my home link and breadcrumbs
 * HUE-647 changed my home link and breadcrumbs
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643
 * Various fixes: HUE-657, HUE-650, HUE-649, HUE-646, HUE-645, HUE-652, HUE-642 and HUE-643