]> git.openstreetmap.org Git - osqa.git/commitdiff
Removes the necessity of the "decoratable" decorator in modules and makes the api...
authorhernani <hernani@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Wed, 16 Jun 2010 23:25:40 +0000 (23:25 +0000)
committerhernani <hernani@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Wed, 16 Jun 2010 23:25:40 +0000 (23:25 +0000)
git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@434 0cfe37f9-358a-4d5e-be75-b63607b5c754

forum/models/question.py
forum/modules/__init__.py
forum/modules/decorators.py
forum/views/commands.py
forum/views/readers.py
forum/views/writers.py
forum_modules/akismet/startup.py
forum_modules/pgfulltext/handlers.py

index 1cc0884fcd79b615c00781f5a2afa5eb5247d0b1..7902a503646f92cb44910128ddc064ac219e1869 100644 (file)
@@ -1,12 +1,10 @@
 from base import *
 from tag import Tag
 from django.utils.translation import ugettext as _
-from forum.modules.decorators import decoratable
 
 question_view = django.dispatch.Signal(providing_args=['instance', 'user'])
 
 class QuestionManager(NodeManager):
-    @decoratable.method
     def search(self, keywords):
         return self.filter(models.Q(title__icontains=keywords) | models.Q(body__icontains=keywords))
 
index cd59875d65c3f0cc1b1acfc7fc6c767666f69464..14c56e875ff8eea2e50f3da1f926db2174a51969 100644 (file)
@@ -105,3 +105,5 @@ def module_templates_loader(name, dirs=None):
     raise TemplateDoesNotExist, name 
 
 module_templates_loader.is_usable = True
+
+from decorators import decorate
index a4c1fadd7dfacac0deb7250c85133732f453187d..90109a99d0fc916867f6997fce4f46d39844c45f 100644 (file)
@@ -4,7 +4,7 @@ class DecoratableObject(object):
     def __init__(self, fn):\r
         self._callable = fn\r
 \r
-    def decorate(self, fn, needs_origin):\r
+    def _decorate(self, fn, needs_origin):\r
         origin = self._callable\r
 \r
         if needs_origin:\r
@@ -12,48 +12,56 @@ class DecoratableObject(object):
         else:\r
             self._callable = lambda *args, **kwargs: fn(*args, **kwargs)\r
 \r
-    def __call__(self, *args, **kwargs):\r
-        return self._callable(*args, **kwargs)\r
+    def _decorate_method(self, fn, needs_origin):\r
+        origin = self._callable\r
 \r
+        if needs_origin:\r
+            self._callable = lambda inst, *args, **kwargs: fn(inst, origin, *args, **kwargs)\r
+        else:\r
+            self._callable = lambda inst, *args, **kwargs: fn(inst, *args, **kwargs)\r
 \r
-def decoratable(fn):\r
-    return DecoratableObject(fn)\r
 \r
-def decoratable_method(fn):\r
-    obj = DecoratableObject(fn)\r
-    def decorated(self, *args, **kwargs):\r
-        return obj(self, *args, **kwargs)\r
+    def __call__(self, *args, **kwargs):\r
+        return self._callable(*args, **kwargs)\r
 \r
-    decorated.__obj = obj\r
-    return decorated\r
 \r
-decoratable.method = decoratable_method\r
+def _decorate_method(origin, needs_origin):\r
+    if not hasattr(origin, '_decoratable_obj'):\r
+        name = origin.__name__\r
+        cls = origin.im_class\r
 \r
-def decorate(origin, needs_origin=True):\r
-    if not isinstance(origin, DecoratableObject):\r
-        if hasattr(origin, '__obj'):\r
-            def decorator(fn):\r
-                origin.__obj.decorate(fn, needs_origin)\r
-                return origin\r
-            return decorator\r
+        decoratable = DecoratableObject(origin)\r
+\r
+        def decoratable_method(self, *args, **kwargs):\r
+            return decoratable(self, *args, **kwargs)\r
 \r
-        raise TypeError('Not a decoratable function: %s' % origin.__name__)\r
+        decoratable_method._decoratable_obj = decoratable\r
+        setattr(cls, name, decoratable_method)\r
+    else:\r
+        decoratable = origin._decoratable_obj\r
 \r
     def decorator(fn):\r
-        origin.decorate(fn, needs_origin)\r
-        return origin\r
+        decoratable._decorate_method(fn, needs_origin)\r
 \r
     return decorator\r
 \r
+def _decorate_function(origin, needs_origin):\r
+    if not isinstance(origin, DecoratableObject):\r
+        mod = inspect.getmodule(origin)\r
 \r
-def decorate_all(module):\r
-    [setattr(module, n, decoratable(f)) for n, f in\r
-        [(n, getattr(module, n)) for n in dir(module)]\r
-        if (callable(f)) and (not inspect.isclass(f)) and (f.__module__ == module.__name__)]\r
-\r
-\r
+        name = origin.__name__\r
+        origin = DecoratableObject(origin)\r
+        setattr(mod, name, DecoratableObject(origin))\r
 \r
+    def decorator(fn):\r
+        origin._decorate(fn, needs_origin)\r
 \r
+    return decorator\r
 \r
 \r
+def decorate(origin, needs_origin=True):\r
+    if inspect.ismethod(origin):\r
+        return _decorate_method(origin, needs_origin)\r
 \r
+    if inspect.isfunction(origin):\r
+        return _decorate_function(origin, needs_origin)
\ No newline at end of file
index f04bd356c14b8c755abb3dfa4ad367801ea1d53c..a8f6d426fe28b3592f465c9ec6c788e2e6b6d607 100644 (file)
@@ -12,7 +12,6 @@ from forum.actions import *
 from django.core.urlresolvers import reverse
 from django.contrib.auth.decorators import login_required
 from forum.utils.decorators import ajax_method, ajax_login_required
-from forum.modules.decorators import decoratable
 from decorators import command, CommandException, RefreshPageCommand
 from forum import settings
 import logging
@@ -222,7 +221,6 @@ def mark_favorite(request, id):
     }
     }
 
-@decoratable
 @command
 def comment(request, id):
     post = get_object_or_404(Node, id=id)
index d988230f55d1d50042000c2aa216641c746f8b85..860f54c51f25d3a5efdb02df1ed4ab1f4514a1ee 100644 (file)
@@ -26,7 +26,6 @@ from forum.forms import *
 from forum.models import *
 from forum.forms import get_next_url
 from forum.actions import QuestionViewAction
-from forum.modules.decorators import decoratable
 import decorators
 
 # used in index page
index c7dbbf39117607807dc338ad5ca1c11835ff0a2b..e6309c80217380ee51863a7dd657292b6ac4c56f 100644 (file)
@@ -14,7 +14,6 @@ from django.core.urlresolvers import reverse
 from django.core.exceptions import PermissionDenied
 
 from forum.actions import AskAction, AnswerAction, ReviseAction, RollbackAction, RetagAction
-from forum.modules.decorators import decoratable
 from forum.forms import *
 from forum.models import *
 from forum.forms import get_next_url
@@ -64,7 +63,6 @@ def upload(request):#ajax upload file to a question or answer
 
     return HttpResponse(result, mimetype="application/xml")
 
-@decoratable
 def ask(request):
     if request.POST and "text" in request.POST:
         form = AskForm(request.POST, user=request.user)
@@ -197,7 +195,6 @@ def edit_answer(request, id):
                               'form': form,
                               }, context_instance=RequestContext(request))
 
-@decoratable
 def answer(request, id):
     question = get_object_or_404(Question, id=id)
     if request.POST:
index c1d548cfa538a292cc6f46d1c9ab378912e274ad..159efe17663b9172aa7ae99d4d007ee94eccbed1 100644 (file)
@@ -3,7 +3,7 @@ from django.http import HttpResponse, HttpResponseRedirect
 from django.utils import simplejson
 from django.utils.encoding import smart_str
 from django.shortcuts import render_to_response
-from forum.modules.decorators import decorate
+from forum.modules import decorate
 from forum import views
 from lib.akismet import Akismet
 from forum.settings import APP_URL, OSQA_VERSION
index 18a23e3d2c88b75721eb7b3e0b3c6ddb72eaa076..69527580c18f59e5232bab1553001b3124cdf6ee 100644 (file)
@@ -1,7 +1,7 @@
 import re
 from django.db.models import Q
 from forum.models.question import Question, QuestionManager
-from forum.modules.decorators import decorate
+from forum.modules import decorate
 
 repl_re = re.compile(r"^'|[^\'\-_\s\w]|'$", re.UNICODE)
 sing_quote_re = re.compile(r"\'+")