Browse Source

#734: viewmodel for rank users

Rafał Pitoń 8 years ago
parent
commit
c36c3c036b

+ 11 - 35
misago/users/api/userendpoints/list.py

@@ -10,55 +10,31 @@ from django.utils import timezone
 
 from misago.conf import settings
 from misago.core.cache import cache
-from misago.core.shortcuts import get_int_or_404, paginate, paginated_response
+from misago.core.shortcuts import get_int_or_404, paginate
 from misago.users.models import Rank
 from misago.users.online.utils import make_users_status_aware
 from misago.users.serializers import UserCardSerializer
-from misago.users.viewmodels import ActivePosters
+from misago.users.viewmodels import ActivePosters, RankUsers
 
 
 UserModel = get_user_model()
 
 
 def active(request):
-    model = ActivePosters(request)
-    return Response(model.get_frontend_context())
+    users = ActivePosters(request)
+    return Response(users.get_frontend_context())
 
 
-def generic(request):
+def rank_users(request):
+    rank_pk = get_int_or_404(request.query_params.get('rank'))
+    rank = get_object_or_404(Rank.objects, pk=rank_pk, is_tab=True)
+
     page = get_int_or_404(request.GET.get('page', 0))
     if page == 1:
         page = 0 # api allows explicit first page
 
-    allow_name_search = True
-    queryset = UserModel.objects
-
-    if not request.user.is_staff:
-        queryset = queryset.filter(is_active=True)
-
-    if request.query_params.get('rank'):
-        rank_pk = get_int_or_404(request.query_params.get('rank'))
-        rank = get_object_or_404(Rank.objects, pk=rank_pk, is_tab=True)
-        queryset = queryset.filter(rank=rank)
-        allow_name_search = False
-    else:
-        raise Http404() # don't use this api for searches
-
-    if request.query_params.get('name'):
-        name_starts_with = request.query_params.get('name').strip().lower()
-        if name_starts_with and allow_name_search:
-            queryset = queryset.filter(slug__startswith=name_starts_with)
-        else:
-            raise Http404()
-
-    queryset = queryset.select_related(
-        'rank', 'ban_cache', 'online_tracker').order_by('slug')
-
-    list_page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
-
-    make_users_status_aware(request.user, list_page.object_list)
-
-    return paginated_response(list_page, serializer=UserCardSerializer)
+    users = RankUsers(request, rank, page)
+    return Response(users.get_frontend_context())
 
 
 LISTS = {
@@ -73,7 +49,7 @@ def list_endpoint(request):
     if list_handler:
         return list_handler(request)
     else:
-        return generic(request)
+        return rank_users(request)
 
 
 ScoredUserSerializer = UserCardSerializer.extend_fields('meta')

+ 1 - 0
misago/users/viewmodels/__init__.py

@@ -3,3 +3,4 @@ from .followers import Followers
 from .follows import Follows
 from .threads import UserThreads
 from .posts import UserPosts
+from .rankusers import RankUsers

+ 3 - 2
misago/users/viewmodels/followers.py

@@ -10,6 +10,9 @@ class Followers(object):
         queryset = self.get_queryset(profile).select_related(
             'rank', 'ban_cache', 'online_tracker').order_by('slug')
 
+        if not request.user.is_staff:
+            queryset = queryset.filter(is_active=True)
+
         if search:
             name_starts_with = search.strip().lower()
             if name_starts_with:
@@ -30,9 +33,7 @@ class Followers(object):
         context = {
             'results': UserCardSerializer(self.users, many=True).data
         }
-
         context.update(self.paginator)
-
         return context
 
     def get_template_context(self):

+ 33 - 0
misago/users/viewmodels/rankusers.py

@@ -0,0 +1,33 @@
+from misago.conf import settings
+from misago.core.shortcuts import paginate, pagination_dict
+from django.http import Http404
+from misago.users.online.utils import make_users_status_aware
+from misago.users.serializers import UserCardSerializer
+
+
+class RankUsers(object):
+    def __init__(self, request, rank, page=0):
+        queryset = rank.user_set.select_related(
+            'rank', 'ban_cache', 'online_tracker').order_by('slug')
+
+        if not request.user.is_staff:
+            queryset = queryset.filter(is_active=True)
+
+        list_page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
+        make_users_status_aware(request.user, list_page.object_list)
+
+        self.users = list_page.object_list
+        self.paginator = pagination_dict(list_page)
+
+    def get_frontend_context(self):
+        context = {
+            'results': UserCardSerializer(self.users, many=True).data
+        }
+        context.update(self.paginator)
+        return context
+
+    def get_template_context(self):
+        return {
+            'users': self.users,
+            'paginator': self.paginator,
+        }

+ 7 - 26
misago/users/views/lists.py

@@ -11,7 +11,7 @@ from misago.users.models import Rank
 from misago.users.pages import users_list
 from misago.users.permissions import allow_browse_users_list
 from misago.users.serializers import UserCardSerializer
-from misago.users.viewmodels import ActivePosters
+from misago.users.viewmodels import ActivePosters, RankUsers
 
 
 def render(request, template, context):
@@ -87,35 +87,16 @@ def active_posters(request):
 @allow_see_list
 def rank(request, slug, page=0):
     rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=slug)
-    queryset = rank.user_set.select_related('rank').order_by('slug')
+    users = RankUsers(request, rank, page)
 
-    if not request.user.is_staff:
-        queryset = queryset.filter(is_active=True)
+    request.frontend_context['USERS'] = users.get_frontend_context()
 
-    page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4)
-
-    data = pagination_dict(page)
-    data.update({
-        'results': UserCardSerializer(page.object_list, many=True).data
-    })
-
-    request.frontend_context['USERS'] = data
-
-    if rank.description:
-        description = {
-            'plain': rank.description,
-            'html': format_plaintext_for_html(rank.description)
-        }
-    else:
-        description = None
-
-    template = "misago/userslists/rank.html"
-    return render(request, template, {
+    context = {
         'rank': rank,
-        'users': page.object_list,
+    }
+    context.update(users.get_template_context())
 
-        'paginator': data
-    })
+    return render(request, "misago/userslists/rank.html", context)
 
 
 ScoredUserSerializer = UserCardSerializer.extend_fields('meta')