Browse Source

Preload user model extensions if configured to do so. #138

Ralfp 12 years ago
parent
commit
07240eac8d

+ 5 - 1
misago/apps/profiles/decorators.py

@@ -1,4 +1,5 @@
 from functools import wraps
 from functools import wraps
+from django.conf import settings
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from misago.apps.errors import error404
 from misago.apps.errors import error404
@@ -12,7 +13,10 @@ def profile_view(fallback='user'):
             user_pk = int(user)
             user_pk = int(user)
             user_slug = username
             user_slug = username
             try:
             try:
-                user = User.objects.get(pk=user_pk)
+                user = User.objects
+                if settings.PROFILE_EXTENSIONS_PRELOAD:
+                    user = user.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
+                user = user.get(pk=user_pk)
                 if user.username_slug != user_slug:
                 if user.username_slug != user_slug:
                     # Force crawlers to take notice of updated username
                     # Force crawlers to take notice of updated username
                     return redirect(reverse(fallback, args=(user.username_slug, user.pk)), permanent=True)
                     return redirect(reverse(fallback, args=(user.username_slug, user.pk)), permanent=True)

+ 11 - 2
misago/apps/profiles/views.py

@@ -1,3 +1,4 @@
+from django.conf import settings
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.http import Http404
 from django.http import Http404
 from django.shortcuts import redirect
 from django.shortcuts import redirect
@@ -46,7 +47,10 @@ def list(request, slug=None, page=0):
             # Direct hit?
             # Direct hit?
             username = search_form.cleaned_data['username']
             username = search_form.cleaned_data['username']
             try:
             try:
-                user = User.objects.get(username__iexact=username)
+                user = User.objects
+                if settings.PROFILE_EXTENSIONS_PRELOAD:
+                    user = user.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
+                user = user.get(username__iexact=username)
                 return redirect(reverse('user', args=(user.username_slug, user.pk)))
                 return redirect(reverse('user', args=(user.username_slug, user.pk)))
             except User.DoesNotExist:
             except User.DoesNotExist:
                 pass
                 pass
@@ -62,7 +66,10 @@ def list(request, slug=None, page=0):
 
 
             # Go for rought match
             # Go for rought match
             if len(username) > 0:
             if len(username) > 0:
-                users = User.objects.filter(username_slug__startswith=username).order_by('username_slug')[:10]
+                users = User.objects
+                if settings.PROFILE_EXTENSIONS_PRELOAD:
+                    users = users.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
+                users = users.filter(username_slug__startswith=username).order_by('username_slug')[:10]
         elif search_form.non_field_errors()[0] == 'form_contains_errors':
         elif search_form.non_field_errors()[0] == 'form_contains_errors':
             message = Message(_("To search users you have to enter username in search field."), 'error')
             message = Message(_("To search users you have to enter username in search field."), 'error')
         else:
         else:
@@ -78,6 +85,8 @@ def list(request, slug=None, page=0):
                 if not default_rank and active_rank:
                 if not default_rank and active_rank:
                     return redirect(reverse('users', kwargs={'slug': active_rank.slug}))
                     return redirect(reverse('users', kwargs={'slug': active_rank.slug}))
                 return redirect(reverse('users'))
                 return redirect(reverse('users'))
+            if settings.PROFILE_EXTENSIONS_PRELOAD:
+                users = users.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
             users = users.order_by('username_slug')[pagination['start']:pagination['stop']]
             users = users.order_by('username_slug')[pagination['start']:pagination['stop']]
 
 
     return request.theme.render_to_response('profiles/list.html',
     return request.theme.render_to_response('profiles/list.html',

+ 9 - 4
misago/sessions.py

@@ -148,10 +148,13 @@ class HumanSession(MisagoSession):
             if self._cookie_sid not in request.COOKIES or len(request.COOKIES[self._cookie_sid]) != 42:
             if self._cookie_sid not in request.COOKIES or len(request.COOKIES[self._cookie_sid]) != 42:
                 raise IncorrectSessionException()
                 raise IncorrectSessionException()
             self._session_key = request.COOKIES[self._cookie_sid]
             self._session_key = request.COOKIES[self._cookie_sid]
-            self._session_rk = Session.objects.select_related().get(
-                                                                    pk=self._session_key,
-                                                                    admin=request.firewall.admin
-                                                                    )
+            self._session_rk = Session.objects.select_related('user', 'rank')
+            if settings.USER_EXTENSIONS_PRELOAD:
+                self._session_rk = self._session_rk.select_related(*settings.USER_EXTENSIONS_PRELOAD)
+            self._session_rk = self._session_rk.get(
+                                                    pk=self._session_key,
+                                                    admin=request.firewall.admin
+                                                    )
             # IP invalid
             # IP invalid
             if request.settings.sessions_validate_ip and self._session_rk.ip != self._ip:
             if request.settings.sessions_validate_ip and self._session_rk.ip != self._ip:
                 raise IncorrectSessionException()
                 raise IncorrectSessionException()
@@ -202,6 +205,8 @@ class HumanSession(MisagoSession):
                                          admin=request.firewall.admin,
                                          admin=request.firewall.admin,
                                          )
                                          )
                 self._session_rk.save(force_insert=True)
                 self._session_rk.save(force_insert=True)
+                if settings.USER_EXTENSIONS_PRELOAD:
+                    self._session_rk = self._session_rk.select_related(*settings.USER_EXTENSIONS_PRELOAD)
                 if user:
                 if user:
                     # Update user data
                     # Update user data
                     user.set_last_visit(
                     user.set_last_visit(

+ 6 - 0
misago/settings_base.py

@@ -148,6 +148,12 @@ PROFILE_EXTENSIONS = (
     'misago.apps.profiles.details',
     'misago.apps.profiles.details',
 )
 )
 
 
+# List of User Model relations that should be loaded by session handler
+USER_EXTENSIONS_PRELOAD = ()
+
+# List of User Model relations that should be loaded when displaying users profiles
+PROFILE_EXTENSIONS_PRELOAD = ()
+
 # List of Markdown Extensions
 # List of Markdown Extensions
 MARKDOWN_EXTENSIONS = (
 MARKDOWN_EXTENSIONS = (
     'misago.markdown.extensions.strikethrough.StrikethroughExtension',
     'misago.markdown.extensions.strikethrough.StrikethroughExtension',