[#8378] misc minor py3 fixes
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 4fd8623..7b6b57c 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -110,7 +110,7 @@
                 tools.append(dict(name=name, app=App))
             # prevent from saving temporary config to db
             session(cfg).expunge(cfg)
-        tools.sort(key=lambda t: (t['app'].status_int(), t['app'].ordinal))
+        tools.sort(key=lambda t: (t['app'].status_int(), t['app'].ordinal or 0))
         return [t for t in tools
                 if t['app'].status in project.allowed_tool_status]
 
diff --git a/Allura/allura/lib/spam/__init__.py b/Allura/allura/lib/spam/__init__.py
index a3c45b3..4be8189 100644
--- a/Allura/allura/lib/spam/__init__.py
+++ b/Allura/allura/lib/spam/__init__.py
@@ -83,7 +83,7 @@
         methods = aslist(methods_string)
         self.filters = []
         for m in methods:
-            config = copy(config)
+            config = dict(config).copy()
             config['spam.method'] = m
             spam_filter = SpamFilter.get(config=config, entry_points=entry_points)
             self.filters.append(spam_filter)
diff --git a/Allura/allura/lib/spam/akismetfilter.py b/Allura/allura/lib/spam/akismetfilter.py
index b737ef7..ee9b0ee 100644
--- a/Allura/allura/lib/spam/akismetfilter.py
+++ b/Allura/allura/lib/spam/akismetfilter.py
@@ -83,7 +83,7 @@
         if user:
             kw['comment_author'] = user.display_name or user.username
             kw['comment_author_email'] = user.email_addresses[0] if user.email_addresses else ''
-        if request:
+        if request is not None:
             kw['user_ip'] = utils.ip_address(request)
             kw['user_agent'] = request.headers.get('USER_AGENT')
             kw['referrer'] = request.headers.get('REFERER')
diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
index 9a7063a..51c08c8 100644
--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -137,7 +137,7 @@
 
         """
         title = getproctitle()
-        if title.startswith(b'taskd:'):
+        if title.startswith('taskd:'):
             record.name = "{0}:{1}".format(title, record.name)
         return super(CustomWatchedFileHandler, self).format(record)
 
@@ -173,17 +173,6 @@
         page += 1
 
 
-def lsub_utf8(s, n):
-    '''Useful for returning n bytes of a UTF-8 string, rather than characters'''
-    byte2int = ord if six.PY2 else int
-    while len(s) > n:
-        k = n
-        while (byte2int(s[k]) & 0xc0) == 0x80:
-            k -= 1
-        return s[:k]
-    return s
-
-
 def chunked_list(l, n):
     """ Yield successive n-sized chunks from l.
     """
diff --git a/Allura/allura/tests/test_utils.py b/Allura/allura/tests/test_utils.py
index 24d324f..cff7a5d 100644
--- a/Allura/allura/tests/test_utils.py
+++ b/Allura/allura/tests/test_utils.py
@@ -421,18 +421,3 @@
     assert utils.close_ipv4_addrs('1.2.3.4', '1.2.3.255')
     assert not utils.close_ipv4_addrs('1.2.3.4', '1.2.4.4')
 
-
-def test_lsub_utf8():
-    assert_equal(b'asdf',
-                 utils.lsub_utf8(h.really_unicode('asdf').encode('utf-8'), 40))
-    assert_equal(b'as\xf0\x9f\x98\x84\xc2\xb6\xc2\xba\xc2\xb6',
-                 utils.lsub_utf8(h.really_unicode('as😄¶º¶').encode('utf-8'), 40))
-    assert_equal(b'as\xf0\x9f\x98\x84',
-                 utils.lsub_utf8(h.really_unicode('as😄¶º¶').encode('utf-8'), 6))
-    # these would truncate the smiley:
-    assert_equal(b'as',
-                 utils.lsub_utf8(h.really_unicode('as😄¶º¶').encode('utf-8'), 5))
-    assert_equal(b'as',
-                 utils.lsub_utf8(h.really_unicode('as😄¶º¶').encode('utf-8'), 4))
-    assert_equal(b'as',
-                 utils.lsub_utf8(h.really_unicode('as😄¶º¶').encode('utf-8'), 3))