From 229e2a392289c004befec0909a5950f73cb90ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Caune?= Date: Tue, 22 Jan 2019 18:18:11 +0200 Subject: [PATCH] Admin improvements. --- hc/accounts/admin.py | 87 +++++++++++++++++----- static/css/admin/profiles.css | 5 +- static/css/admin/projects.css | 11 +++ templates/admin/profile_list_projects.html | 5 ++ templates/admin/profile_list_team.html | 6 -- templates/admin/project_list_team.html | 6 ++ 6 files changed, 91 insertions(+), 29 deletions(-) create mode 100644 static/css/admin/projects.css create mode 100644 templates/admin/profile_list_projects.html delete mode 100644 templates/admin/profile_list_team.html create mode 100644 templates/admin/project_list_team.html diff --git a/hc/accounts/admin.py b/hc/accounts/admin.py index 69c49e0f..db98f7c3 100644 --- a/hc/accounts/admin.py +++ b/hc/accounts/admin.py @@ -41,8 +41,8 @@ class ProfileAdmin(admin.ModelAdmin): readonly_fields = ("user", "email") raw_id_fields = ("current_project", ) list_select_related = ("user", ) - list_display = ("id", "users", "checks", "invited", - "reports_allowed", "ping_log_limit", "sms") + list_display = ("id", "email", "last_login", "projects", "checks", "invited", + "reports_allowed", "sms") search_fields = ["id", "user__email"] list_filter = ("team_limit", "reports_allowed", "check_limit", "next_report_date") @@ -55,14 +55,17 @@ class ProfileAdmin(admin.ModelAdmin): qs = qs.annotate(num_checks=Count("user__project__check", distinct=True)) return qs - @mark_safe - def users(self, obj): - if obj.num_members == 0: + def email(self, obj): return obj.user.email - else: - return render_to_string("admin/profile_list_team.html", { - "profile": obj - }) + + def last_login(self, obj): + return obj.user.last_login + + @mark_safe + def projects(self, obj): + return render_to_string("admin/profile_list_projects.html", { + "profile": obj + }) @mark_safe def checks(self, obj): @@ -80,23 +83,72 @@ class ProfileAdmin(admin.ModelAdmin): def sms(self, obj): return "%d of %d" % (obj.sms_sent, obj.sms_limit) - def email(self, obj): - return obj.user.email - @admin.register(Project) class ProjectAdmin(admin.ModelAdmin): list_select_related = ("owner", ) - list_display = ("id", "name", "email") + list_display = ("id", "name_", "users", "engagement", "switch") + + class Media: + css = { + 'all': ('css/admin/projects.css',) + } + + def get_queryset(self, request): + qs = super(ProjectAdmin, self).get_queryset(request) + qs = qs.annotate(num_channels=Count("channel", distinct=True)) + qs = qs.annotate(num_checks=Count("check", distinct=True)) + qs = qs.annotate(num_members=Count("member", distinct=True)) + return qs + + def name_(self, obj): + if obj.name: + return obj.name + + return "Default Project for %s" % obj.owner.email + + @mark_safe + def users(self, obj): + if obj.num_members == 0: + return obj.owner.email + else: + return render_to_string("admin/project_list_team.html", { + "project": obj + }) def email(self, obj): return obj.owner.email + @mark_safe + def engagement(self, obj): + result = "" + + if obj.num_checks == 0: + result += "0 checks, " + elif obj.num_checks == 1: + result += "1 check, " + else: + result += "%d checks, " % obj.num_checks + + if obj.num_channels == 0: + result += "0 channels" + elif obj.num_channels == 1: + result += "1 channel, " + else: + result += "%d channels, " % obj.num_channels + + return result + + @mark_safe + def switch(self, obj): + url = reverse("hc-switch-project", args=[obj.code]) + return "Show Checks" % url + class HcUserAdmin(UserAdmin): actions = ["send_report"] - list_display = ('id', 'email', 'date_joined', 'last_login', 'engagement', - 'is_staff', 'checks') + list_display = ('id', 'email', 'engagement', 'date_joined', 'last_login', + 'is_staff') list_display_links = ("id", "email") list_filter = ("last_login", "date_joined", "is_staff", "is_active") @@ -130,11 +182,6 @@ class HcUserAdmin(UserAdmin): return result - @mark_safe - def checks(self, user): - url = reverse("hc-switch-team", args=[user.username]) - return "Checks" % url - def send_report(self, request, qs): for user in qs: user.profile.send_report() diff --git a/static/css/admin/profiles.css b/static/css/admin/profiles.css index 3588349e..2aa8a52b 100644 --- a/static/css/admin/profiles.css +++ b/static/css/admin/profiles.css @@ -1,11 +1,10 @@ -.field-users ul { +.field-projects ul { list-style: none; margin: 0; padding: 0; - color: #888; } -.field-users ul li { +.field-projects ul li { list-style-type: none; } diff --git a/static/css/admin/projects.css b/static/css/admin/projects.css new file mode 100644 index 00000000..2cc18045 --- /dev/null +++ b/static/css/admin/projects.css @@ -0,0 +1,11 @@ +.field-users ul { + list-style: none; + margin: 0; + padding: 0; + color: #999; +} + +.field-users ul li { + list-style-type: none; +} + diff --git a/templates/admin/profile_list_projects.html b/templates/admin/profile_list_projects.html new file mode 100644 index 00000000..638d53de --- /dev/null +++ b/templates/admin/profile_list_projects.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/templates/admin/profile_list_team.html b/templates/admin/profile_list_team.html deleted file mode 100644 index 3c552b41..00000000 --- a/templates/admin/profile_list_team.html +++ /dev/null @@ -1,6 +0,0 @@ -{{ profile.user.email }} - \ No newline at end of file diff --git a/templates/admin/project_list_team.html b/templates/admin/project_list_team.html new file mode 100644 index 00000000..3f159d5a --- /dev/null +++ b/templates/admin/project_list_team.html @@ -0,0 +1,6 @@ +{{ project.owner.email }} + \ No newline at end of file