@lazy_property
def groups(self):
groups = self.memcache.get("accounts:%s:groups" % self.dn)
- if groups:
- return groups
+ if not groups:
+ # Fetch groups from LDAP
+ groups = self._get_groups()
- # Fetch groups from LDAP
- groups = self._get_groups()
+ # Cache groups for 5 min
+ self.memcache.set("accounts:%s:groups" % self.dn, groups, 300)
- # Cache groups for 5 min
- self.memcache.set("accounts:%s:groups" % self.dn, groups, 300)
-
- return groups
+ return sorted((Group(self.backend, gid) for gid in groups))
def _get_groups(self):
groups = []
return 100 - min(confidences)
+
+class Groups(Object):
+ @property
+ def search_base(self):
+ return "ou=Group,%s" % self.backend.accounts.search_base
+
+
+class Group(Object):
+ def init(self, gid):
+ self.gid = gid
+
+ def __repr__(self):
+ if self.description:
+ return "<%s %s (%s)>" % (
+ self.__class__.__name__,
+ self.gid,
+ self.description,
+ )
+
+ return "<%s %s>" % (self.__class__.__name__, self.gid)
+
+ def __str__(self):
+ return self.description or self.gid
+
+ def __eq__(self, other):
+ if isinstance(other, self.__class__):
+ return self.gid == other.gid
+
+ def __lt__(self, other):
+ if isinstance(other, self.__class__):
+ return (self.description or self.gid) < (other.description or other.gid)
+
+ @lazy_property
+ def attributes(self):
+ attrs = self.memcache.get("groups:%s:attrs" % self.gid)
+ if not attrs:
+ attrs = self._get_attrs()
+
+ # Cache this for 5 mins
+ self.memcache.set("groups:%s:attrs" % self.gid, attrs, 300)
+
+ return attrs
+
+ def _get_attrs(self):
+ res = self.backend.accounts._query(
+ "(&(|(objectClass=posixGroup)(objectClass=groupOfNames))(cn=%s))" % self.gid,
+ search_base=self.backend.groups.search_base, limit=1)
+
+ for dn, attrs in res:
+ return attrs
+
+ @property
+ def description(self):
+ try:
+ description = self.attributes["description"][0]
+ except KeyError:
+ return None
+
+ return description.decode()
+
+
if __name__ == "__main__":
a = Accounts()
{% block main %}
{% import phonenumbers %}
- <div class="card p-3 mb-3">
+ <div class="card mb-3">
<div class="card-body">
<div class="row">
<div class="col">
</div>
{% end %}
</div>
+
+ {% if account.groups %}
+ <div class="card-body">
+ <div class="row">
+ <div class="col">
+ <h6 class="mb-0">{{ _("Groups") }}</h6>
+ </div>
+ </div>
+ </div>
+
+ <ul class="list-group list-group-flush">
+ {% for g in account.groups %}
+ <li class="list-group-item">
+ <i class="fas fa-users mr-2"></i>
+ {{ g }}
+ </li>
+ {% end %}
+ </ul>
+ {% end %}
</div>
<ul class="list-unstyled small text-muted">