Moved threadlocals to utils
authorverrierj
Wed, 16 Nov 2011 12:34:49 +0100
changeset 241 8649bd4f2443
parent 240 a46cb257d8ee
child 242 bee98775a8e8
Moved threadlocals to utils
src/ldt/ldt/security/manager.py
src/ldt/ldt/security/middleware.py
src/ldt/ldt/security/utils.py
--- a/src/ldt/ldt/security/manager.py	Tue Nov 15 12:47:13 2011 +0100
+++ b/src/ldt/ldt/security/manager.py	Wed Nov 16 12:34:49 2011 +0100
@@ -1,6 +1,6 @@
 from django.db.models import Manager
-from guardian.core import ObjectPermissionChecker
 from guardian.shortcuts import get_objects_for_user
+from utils import get_current_user
 
 class SafeManager(Manager):
     
@@ -9,22 +9,25 @@
         if user:
             self.check_perm_for(user)
         else:
-            self.user = None   
+            self.user = get_current_user()
     
     def check_perm_for(self, user):
         self.user = user
-        self.checker = ObjectPermissionChecker(self.user)
         
     def stop_checking(self):
         self.user = None
       
     def has_user(self):
         return self.user != None
-    
+            
     def get_query_set(self):        
         if not self.has_user():
-            raise AttributeError("A user has to be chosen to check permissions.")
+            return super(SafeManager, self).get_query_set()
+        #    raise AttributeError("A user has to be chosen to check permissions.")
+        
+        perm_name = 'ldt_utils.view_%s' % self.model.__name__.lower() 
         
-        user_objects = get_objects_for_user(self.user, 'ldt_utils.view_%s' % self.model_name)
+        # call parent query_set below
+        user_objects = get_objects_for_user(self.user, perm_name) 
             
-        return user_objects 
\ No newline at end of file
+        return user_objects
--- a/src/ldt/ldt/security/middleware.py	Tue Nov 15 12:47:13 2011 +0100
+++ b/src/ldt/ldt/security/middleware.py	Wed Nov 16 12:34:49 2011 +0100
@@ -1,24 +1,19 @@
 from django.conf import settings
 from django.core.exceptions import MiddlewareNotUsed
-from ldt.security.utils import protect_models, unprotect_models
+from ldt.security.utils import protect_models, unprotect_models, _thread_locals
 
-try:
-    from threading import local
-except ImportError:
-    from django.utils._threading_local import local
-    
-_thread_locals = local()
-    
 class SecurityMiddleware(object):
     
     def __init__(self):
         if not hasattr(settings, 'USE_GROUP_PERMISSIONS') or not settings.USE_GROUP_PERMISSIONS:
             raise MiddlewareNotUsed()
 
-    def process_request(self, request):    
-        protect_models(request.user)      
+    def process_request(self, request):
+        _thread_locals.user = request.user 
+        protect_models()      
     
     def process_response(self, request, response):
         unprotect_models()
-        
+        del _thread_locals.user
+                
         return response
\ No newline at end of file
--- a/src/ldt/ldt/security/utils.py	Tue Nov 15 12:47:13 2011 +0100
+++ b/src/ldt/ldt/security/utils.py	Wed Nov 16 12:34:49 2011 +0100
@@ -3,45 +3,64 @@
 from django.contrib.auth.models import Group
 from guardian.shortcuts import assign, remove_perm
 
-def protect_models(user):
-    for cls in get_models_to_protect():
+try:
+    from threading import local
+except ImportError:
+    from django.utils._threading_local import local
+    
+_thread_locals = local()
+
+def get_current_user():
+    return getattr(_thread_locals, 'user', None)
+
+def protect_models():
+    user = get_current_user()
+    for cls in ToProtect.get_models():
             protect_model(cls, user)
     
 def unprotect_models():
-    for cls in get_models_to_protect():
+    for cls in ToProtect.get_models():
             unprotect_model(cls)
 
-def get_models_to_protect():        
-    to_protect = []
+class ToProtect(object):
+    
+    @staticmethod
+    def get_models():
+        if hasattr(ToProtect, 'cls_list'):
+            return ToProtect.cls_list
         
-    for cls_name in settings.USE_GROUP_PERMISSIONS:
-        cls_type = ContentType.objects.get(app_label="ldt_utils", model=cls_name.lower())
-        to_protect.append(cls_type.model_class())
-    return to_protect
+        cls_list = []
+        for cls_name in settings.USE_GROUP_PERMISSIONS:
+            cls_type = ContentType.objects.get(app_label='ldt_utils', model=cls_name.lower())
+            cls_list.append(cls_type.model_class())
+        ToProtect.cls_list = cls_list
+        
+        return cls_list
 
 def protect_model(cls, user):   
     cls.safe_objects.check_perm_for(user)
-     
-    cls.base_save = cls.save
-    cls.base_delete = cls.delete
+    
+    cls.old_save = cls.save
+    cls.old_delete = cls.delete
     class_name = cls.__name__.lower()
-    cls.save = change_security(user, class_name)(cls.save)
-    cls.delete = change_security(user, class_name)(cls.delete)    
+    cls.save = change_security(class_name)(cls.save)
+    cls.delete = change_security(class_name)(cls.delete)    
     
 def unprotect_model(cls):    
-    if hasattr(cls, 'base_save'):
-        cls.save = cls.base_save 
-        cls.delete = cls.base_delete
-        del cls.base_save    
-        del cls.base_delete
+    if hasattr(cls, 'old_save'):
+        cls.save = cls.old_save 
+        cls.delete = cls.old_delete 
+        del cls.old_save    
+        del cls.old_delete 
         
-def change_security(user, cls_name):
+def change_security(cls_name):
     def wrapper(func):
         def wrapped(self, *args, **kwargs):
-            
+            user = get_current_user()                        
+                        
             if self.pk and not user.has_perm('change_%s' % cls_name, self):
                 raise AttributeError('User %s is not allowed to change object %s' % (user, self))
-            
+      
             return func(self, *args, **kwargs)
         return wrapped    
     return wrapper
@@ -55,4 +74,5 @@
                 assign('change_project', group, project)
         else:
             remove_perm('view_project', group, project)
-            remove_perm('change_project', group, project) 
\ No newline at end of file
+            remove_perm('change_project', group, project) 
+            
\ No newline at end of file