return sorted(groups)
+ def _get_group(self, query, **kwargs):
+ kwargs.update({
+ "limit" : 1,
+ })
+
+ groups = self._get_groups(query, **kwargs)
+ if groups:
+ return groups[0]
+
def get_all(self):
return self._get_groups(
"(|(objectClass=posixGroup)(objectClass=groupOfNames))",
)
+ def get_by_gid(self, gid):
+ return self._get_group(
+ "(&(|(objectClass=posixGroup)(objectClass=groupOfNames))(cn=%s))" % gid,
+ )
+
class Group(Object):
def init(self, dn, attrs=None):
return l
+ def __iter__(self):
+ return iter(self.members)
+
@property
def gid(self):
try:
return description.decode()
+ @lazy_property
+ def members(self):
+ members = []
+
+ # Get all members by DN
+ for dn in self.attributes.get("member", []):
+ member = self.backend.accounts.get_by_dn(dn.decode())
+ if member:
+ members.append(member)
+
+ # Get all meembers by UID
+ for uid in self.attributes.get("memberUid", []):
+ member = self.backend.accounts.get_by_uid(uid.decode())
+ if member:
+ members.append(member)
+
+ return sorted(members)
if __name__ == "__main__":
a = Accounts()
--- /dev/null
+{% extends "base.html" %}
+
+{% block title %}{{ group }}{% end block %}
+
+{% block sidebar %}
+ <div class="col-12 col-md-3">
+ <h3 class="my-3">
+ <a class="text-white" href="/groups/{{ group.gid }}">{{ group }}</a>
+ </h3>
+ </div>
+{% end block %}
+
+{% block main %}
+ <div class="card mb-3">
+ <div class="card-body">
+ </div>
+
+ {% if len(group) > 0 %}
+ <div class="card-body">
+ <div class="row">
+ <div class="col">
+ <h6 class="mb-0">{{ _("Members") }}</h6>
+ </div>
+ </div>
+ </div>
+
+ <ul class="list-group list-group-flush">
+ {% for account in group %}
+ <li class="list-group-item">
+ <i class="fas fa-user mr-2"></i>
+ {{ account }}
+ </li>
+ {% end %}
+ </ul>
+ {% end %}
+ </div>
+{% end block %}
(r"/activate/(\w+)/(\w+)", auth.ActivateHandler),
(r"/conferences", people.ConferencesHandler),
(r"/groups", people.GroupsHandler),
+ (r"/groups/(\w+)", people.GroupHandler),
(r"/register", auth.RegisterHandler),
(r"/search", people.SearchHandler),
(r"/users", people.UsersHandler),
self.render("people/groups.html")
+class GroupHandler(auth.CacheMixin, base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self, gid):
+ # Only staff can see other groups
+ if not self.current_user.is_staff():
+ raise tornado.web.HTTPError(403)
+
+ # Fetch group
+ group = self.backend.groups.get_by_gid(gid)
+ if not group:
+ raise tornado.web.HTTPError(404, "Could not find group %s" % gid)
+
+ self.render("people/group.html", group=group)
+
+
class SearchHandler(auth.CacheMixin, base.BaseHandler):
@tornado.web.authenticated
def get(self):