Pārlūkot izejas kodu

[indexer] Hook into search app

Also add admin restraints
Abraham Elmahrek 11 gadi atpakaļ
vecāks
revīzija
5c7feecbf0

+ 1 - 1
apps/search/src/search/templates/search2.mako

@@ -37,7 +37,7 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
       <button type="button" title="${ _('Share') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}"><i class="fa fa-link"></i></button>
       &nbsp;&nbsp;&nbsp;            
       <a class="btn" href="${ url('search:new_search') }" title="${ _('New') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}"><i class="fa fa-file-o"></i></a>
-      <a class="btn" href="${ url('search:admin_collections') }" title="${ _('Collections') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}"><i class="fa fa-tags"></i></a> 
+      <a class="btn" href="${ url('indexer:collections') }" title="${ _('Collections') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}"><i class="fa fa-tags"></i></a> 
     </div>
   % endif
   

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

@@ -115,7 +115,8 @@ if settings.OAUTH_AUTHENTICATION:
 
 # Add indexer app
 if 'search' in [app.name for app in appmanager.DESKTOP_APPS]:
-  dynamic_patterns.extend( patterns('', ('^indexer/', include('indexer.urls'))) )
+  namespace = {'namespace': 'indexer', 'app_name': 'indexer'}
+  dynamic_patterns.extend( patterns('', ('^indexer/', include('indexer.urls', **namespace))) )
   static_patterns.append(static_pattern('indexer/static',
                                         os.path.join(os.path.dirname(__file__), "..", '..', '..', "libs/indexer/static/")))
 

+ 26 - 1
desktop/libs/indexer/src/indexer/api.py

@@ -15,18 +15,20 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from functools import wraps
 import json
 import logging
 import re
 
 from django.http import HttpResponse, Http404
+from django.utils.decorators import available_attrs
 from django.utils.translation import ugettext as _
 
 from desktop.lib.exceptions_renderable import PopupException
 from search.models import Collection
 
 from controller import CollectionManagerController
-from utils import example_schema_xml_with_fields_and_unique_key, fields_from_log,\
+from utils import fields_from_log,\
                   field_values_from_separated_file, get_type_from_morphline_type,\
                   get_field_types
 
@@ -34,6 +36,22 @@ from utils import example_schema_xml_with_fields_and_unique_key, fields_from_log
 LOG = logging.getLogger(__name__)
 
 
+def admin_only():
+  """
+  Ensure only admins are allowed.
+  """
+  def decorator(view_func):
+    @wraps(view_func, assigned=available_attrs(view_func))
+    def _wrapped_view(request, *args, **kwargs):
+      if request.user.is_superuser:
+        return view_func(request, *args, **kwargs)
+      else:
+        raise PopupException(_("Must be a superuser to access this module."))
+    return _wrapped_view
+  return decorator
+
+
+@admin_only()
 def parse_fields(request):
   if request.method != 'POST':
     raise PopupException(_('POST request required.'))
@@ -87,6 +105,7 @@ def parse_fields(request):
   return HttpResponse(json.dumps(result), mimetype="application/json")
 
 
+@admin_only()
 def collections(request):
   searcher = CollectionManagerController(request.user)
   solr_collections = searcher.get_collections()
@@ -115,6 +134,7 @@ def collections(request):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
+@admin_only()
 def collections_create(request):
   if request.method != 'POST':
     raise PopupException(_('POST request required.'))
@@ -164,6 +184,7 @@ def collections_create(request):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
+@admin_only()
 def collections_import(request):
   if request.method != 'POST':
     raise PopupException(_('POST request required.'))
@@ -192,6 +213,7 @@ def collections_import(request):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
+@admin_only()
 def collections_remove(request):
   if request.method != 'POST':
     raise PopupException(_('POST request required.'))
@@ -219,6 +241,7 @@ def collections_remove(request):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
+@admin_only()
 def collections_fields_and_metadata(request, collection_or_core):
   if request.method != 'GET':
     raise PopupException(_('GET request required.'))
@@ -244,6 +267,7 @@ def collections_fields_and_metadata(request, collection_or_core):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
+@admin_only()
 def collections_update(request, collection_or_core):
   if request.method != 'POST':
     raise PopupException(_('POST request required.'))
@@ -278,6 +302,7 @@ def collections_update(request, collection_or_core):
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
 
+@admin_only()
 def collections_data(request, collection_or_core):
   if request.method != 'POST':
     raise PopupException(_('POST request required.'))

+ 1 - 1
desktop/libs/indexer/src/indexer/urls.py

@@ -18,7 +18,7 @@
 from django.conf.urls.defaults import patterns, url
 
 urlpatterns = patterns('indexer.views',
-  url(r'^$', 'collections', name='index')
+  url(r'^$', 'collections', name='collections')
 )
 
 urlpatterns += patterns('indexer.api',