From 51225175ce75304aca715378d774d9d79f05bf57 Mon Sep 17 00:00:00 2001
From: Thor77 <thor77@thor77.org>
Date: Sat, 19 Nov 2016 22:50:28 +0100
Subject: [PATCH] Refactor clients preperation into prepare_clients

---
 tsstats/template.py | 57 ++++++++++++++++++++++++++++++---------------
 1 file changed, 38 insertions(+), 19 deletions(-)

diff --git a/tsstats/template.py b/tsstats/template.py
index c53c881..8b5f50d 100644
--- a/tsstats/template.py
+++ b/tsstats/template.py
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import logging
+from collections import namedtuple
 from datetime import datetime
 from os.path import dirname, join
 
@@ -10,6 +11,36 @@ from tsstats.utils import filter_threshold, seconds_to_text, sort_clients
 
 logger = logging.getLogger('tsstats')
 
+SortedClients = namedtuple('SortedClients', [
+    'onlinetime', 'kicks', 'pkicks', 'bans', 'pbans'])
+
+
+def prepare_clients(clients, onlinetime_threshold=-1):
+    '''
+    Prepare `clients` for rendering
+
+    sort them and convert onlinetime to string
+    '''
+    # sort by onlinetime
+    onlinetime_ = sort_clients(
+        clients, lambda c: c.onlinetime.total_seconds()
+    )
+    # filter clients not matching threshold
+    onlinetime_ = filter_threshold(onlinetime_,
+                                   onlinetime_threshold)
+    # convert timespans to text
+    onlinetime = [
+        (client, seconds_to_text(int(onlinetime)))
+        for client, onlinetime in onlinetime_
+    ]
+    return SortedClients(
+        onlinetime=onlinetime,
+        kicks=sort_clients(clients, lambda c: c.kicks),
+        pkicks=sort_clients(clients, lambda c: c.pkicks),
+        bans=sort_clients(clients, lambda c: c.bans),
+        pbans=sort_clients(clients, lambda c: c.pbans)
+    )
+
 
 def render_template(clients, output, title='TeamspeakStats',
                     template='stats.jinja2', datetime_fmt='%x %X %Z',
@@ -33,27 +64,15 @@ def render_template(clients, output, title='TeamspeakStats',
     :type datetime_fmt: str
     :type onlinetime_threshold: int
     '''
-    # prepare clients
-    clients_onlinetime_ = sort_clients(
-        clients, lambda c: c.onlinetime.total_seconds()
-    )
-    # filter clients for onlinetime threshold
-    clients_onlinetime_ = filter_threshold(clients_onlinetime_,
-                                           onlinetime_threshold)
-
-    clients_onlinetime = [
-        (client, seconds_to_text(int(onlinetime)))
-        for client, onlinetime in clients_onlinetime_
+    prepared_clients = prepare_clients(clients)
+    objs = [
+        ('Onlinetime', prepared_clients.onlinetime),
+        ('Kicks', prepared_clients.kicks),
+        ('passive Kicks', prepared_clients.pkicks),
+        ('Bans', prepared_clients.bans),
+        ('passive Bans', prepared_clients.pbans)
     ]
 
-    clients_kicks = sort_clients(clients, lambda c: c.kicks)
-    clients_pkicks = sort_clients(clients, lambda c: c.pkicks)
-    clients_bans = sort_clients(clients, lambda c: c.bans)
-    clients_pbans = sort_clients(clients, lambda c: c.pbans)
-    objs = [('Onlinetime', clients_onlinetime), ('Kicks', clients_kicks),
-            ('passive Kicks', clients_pkicks),
-            ('Bans', clients_bans), ('passive Bans', clients_pbans)]
-
     # render
     template_loader = ChoiceLoader([
         PackageLoader(__package__, 'templates'),