]> git.ipfire.org Git - ipfire.org.git/commitdiff
people: List group members
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 29 Oct 2019 11:15:13 +0000 (11:15 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 29 Oct 2019 11:15:13 +0000 (11:15 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/accounts.py
src/templates/people/group.html [new file with mode: 0644]
src/web/__init__.py
src/web/people.py

index ca6b991e828cb2cbd9e71e810883bd44e2cd12b4..1a6b90b3cf84927fb73ae6aed49620707984ac04 100644 (file)
@@ -1104,11 +1104,25 @@ class Groups(Object):
 
                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):
@@ -1150,6 +1164,9 @@ class Group(Object):
 
                return l
 
+       def __iter__(self):
+               return iter(self.members)
+
        @property
        def gid(self):
                try:
@@ -1168,6 +1185,23 @@ class Group(Object):
 
                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()
diff --git a/src/templates/people/group.html b/src/templates/people/group.html
new file mode 100644 (file)
index 0000000..849c303
--- /dev/null
@@ -0,0 +1,37 @@
+{% 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 %}
index 072856f83e683d6bab20bbe0a9630eea65899850..b40de8159adf16c9de2c9a83b635431c83861a77 100644 (file)
@@ -271,6 +271,7 @@ class Application(tornado.web.Application):
                        (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),
index 2d265cfa3f6dc8aa6497543f976e80c760dddae0..fe167763e7eba8a3bb95a6eaf4c7a4edbfc544fe 100644 (file)
@@ -123,6 +123,21 @@ class GroupsHandler(auth.CacheMixin, base.BaseHandler):
                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):