diff --git a/wiki/macro/LostSoulsInGroups.py b/wiki/macro/LostSoulsInGroups.py
new file mode 100644
index 00000000..8258399c
--- /dev/null
+++ b/wiki/macro/LostSoulsInGroups.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+"""
+ MoinMoin - LostSoulsInGroups macro
+
+ List all items in custom groups that do not have user accounts
+ (either haven't registered yet or have been deleted or there's a typo)
+
+ @copyright: 2007 Alexander "Loki" Agibalov
+ @license: GNU GPL, see COPYING for details.
+
+ changes:
+ 12.2007 - conversion to new syntax by Bolesław Kulbabiński
+"""
+
+from MoinMoin import wikiutil, user
+from MoinMoin.Page import Page
+from MoinMoin.PageEditor import PageEditor
+import re, sys
+
+def macro_LostSoulsInGroups(macro, args):
+ request = macro.request
+ _ = macro.request.getText
+
+ sRet = "
Items in custom groups (Users in custom groups who don't have user accounts)
"
+ sRet = sRet + ""
+ userlist = []
+ lostsouls = {}
+ for uid in user.getUserList(request):
+ userlist.append(user.User(request, uid).name)
+
+ isgroup = request.cfg.cache.page_group_regex.search
+ grouppages = request.rootpage.getPageList(user='', filter=isgroup)
+
+ srch = re.compile("^ \* [^ ]*", re.M)
+ for pg in grouppages:
+ pged = PageEditor(request, pg)
+ pagelines = pged.getlines()
+ for lin in pagelines:
+ srchS = srch.match(lin)
+ if srchS:
+ st = srchS.group()
+ st = st[3:]
+ try:
+ usr = userlist.index(st)
+ except ValueError:
+ if lostsouls.has_key(pg):
+ temp_lst = lostsouls[pg]
+ temp_lst.append(st)
+ lostsouls[pg] = temp_lst
+ else:
+ lostsouls[pg] = [st]
+
+ for k, v in lostsouls.iteritems():
+ st = '%s | %s |
' % (Page(request, k).link_to(request), ", ".join(v))
+ sRet = sRet + st
+
+ sRet = sRet + "
"
+ return macro.formatter.rawHTML(sRet)
+
+
+def execute(macro, args):
+ try:
+ return wikiutil.invoke_extension_function(
+ macro.request, macro_LostSoulsInGroups, args, [macro])
+ except ValueError, err:
+ return macro.request.formatter.text(
+ "<>" % err.args[0])
+