def realm_client_table( user_summaries: Dict[str, Dict[str, Dict[str, Any]]]) -> str: exclude_keys = [ "internal", "name", "use", "send", "pointer", "website", "desktop", ] rows = [] for email, user_summary in user_summaries.items(): email_link = user_activity_link(email) name = user_summary["name"] for k, v in user_summary.items(): if k in exclude_keys: continue client = k count = v["count"] last_visit = v["last_visit"] row = [ format_date_for_activity_reports(last_visit), client, name, email_link, count, ] rows.append(row) rows = sorted(rows, key=lambda r: r[0], reverse=True) cols = [ "Last visit", "Client", "Name", "Email", "Count", ] title = "Clients" return make_table(title, cols, rows)
def realm_user_summary_table( all_records: List[QuerySet], admin_emails: Set[str]) -> Tuple[Dict[str, Dict[str, Any]], str]: user_records = {} def by_email(record: QuerySet) -> str: return record.user_profile.delivery_email for email, records in itertools.groupby(all_records, by_email): user_records[email] = get_user_activity_summary(list(records)) def get_last_visit(user_summary: Dict[str, Dict[str, datetime]], k: str) -> Optional[datetime]: if k in user_summary: return user_summary[k]["last_visit"] else: return None def get_count(user_summary: Dict[str, Dict[str, str]], k: str) -> str: if k in user_summary: return user_summary[k]["count"] else: return "" def is_recent(val: Optional[datetime]) -> bool: age = timezone_now() - val return age.total_seconds() < 5 * 60 rows = [] for email, user_summary in user_records.items(): email_link = user_activity_link(email) sent_count = get_count(user_summary, "send") cells = [user_summary["name"], email_link, sent_count] row_class = "" for field in [ "use", "send", "pointer", "desktop", "ZulipiOS", "Android" ]: visit = get_last_visit(user_summary, field) if field == "use": if visit and is_recent(visit): row_class += " recently_active" if email in admin_emails: row_class += " admin" val = format_date_for_activity_reports(visit) cells.append(val) row = dict(cells=cells, row_class=row_class) rows.append(row) def by_used_time(row: Dict[str, Any]) -> str: return row["cells"][3] rows = sorted(rows, key=by_used_time, reverse=True) cols = [ "Name", "Email", "Total sent", "Heard from", "Message sent", "Pointer motion", "Desktop", "ZulipiOS", "Android", ] title = "Summary" content = make_table(title, cols, rows, has_row_class=True) return user_records, content