From bb57591387483aba42223cfd636529bccca479e4 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Thu, 25 Apr 2024 11:26:35 +0200 Subject: [PATCH] Add avatar images to dashboar persons page --- .../pages/dashboard/DashboardPersonsPage.vue | 7 +- client/src/services/dashboard.ts | 2 + server/config/settings/local_daniel.py | 11 +++ server/vbv_lernwelt/core/models.py | 26 +++-- server/vbv_lernwelt/dashboard/views.py | 95 ++++++++----------- 5 files changed, 77 insertions(+), 64 deletions(-) create mode 100644 server/config/settings/local_daniel.py diff --git a/client/src/pages/dashboard/DashboardPersonsPage.vue b/client/src/pages/dashboard/DashboardPersonsPage.vue index cff500dd..c367db56 100644 --- a/client/src/pages/dashboard/DashboardPersonsPage.vue +++ b/client/src/pages/dashboard/DashboardPersonsPage.vue @@ -161,9 +161,12 @@ watch(selectedCourse, () => {
diff --git a/client/src/services/dashboard.ts b/client/src/services/dashboard.ts index 26dfb485..7e2fba9d 100644 --- a/client/src/services/dashboard.ts +++ b/client/src/services/dashboard.ts @@ -56,6 +56,8 @@ export type DashboardPersonType = { last_name: string; email: string; course_sessions: DashboardPersonCourseSessionType[]; + avatar_url: string; + avatar_url_small: string; }; export type DashboardCourseConfigType = { diff --git a/server/config/settings/local_daniel.py b/server/config/settings/local_daniel.py new file mode 100644 index 00000000..55bfc8b2 --- /dev/null +++ b/server/config/settings/local_daniel.py @@ -0,0 +1,11 @@ +# pylint: disable=unused-wildcard-import,wildcard-import,wrong-import-position +import os +from environs import Env + +script_path = os.path.abspath(__file__) +script_dir = os.path.dirname(script_path) + +env = Env() +env.read_env(f"{script_dir}/../../../env_secrets/local_daniel.env", recurse=False) + +from .base import * # noqa diff --git a/server/vbv_lernwelt/core/models.py b/server/vbv_lernwelt/core/models.py index 41b1a487..75e18afb 100644 --- a/server/vbv_lernwelt/core/models.py +++ b/server/vbv_lernwelt/core/models.py @@ -1,10 +1,13 @@ import uuid +import structlog from django.contrib.auth.models import AbstractUser from django.db import models from django.db.models import JSONField from django.urls import reverse +logger = structlog.get_logger(__name__) + class Organisation(models.Model): organisation_id = models.IntegerField(primary_key=True) @@ -107,15 +110,24 @@ class User(AbstractUser): blank=True, ) + def create_avatar_url(self, size=400): + try: + if self.avatar: + filter_spec = f"fill-{size}x{size}" + self.avatar.get_rendition(filter_spec) + url = reverse("user_image", kwargs={"image_id": self.avatar.id}) + return f"{url}?filter={filter_spec}" + except Exception: + logger.warn("could not create avatar url", label="security", exc_info=True) + return "/static/avatars/myvbv-default-avatar.png" + @property def avatar_url(self): - if self.avatar: - filter_spec = "fill-400x400" - self.avatar.get_rendition(filter_spec) - url = reverse("user_image", kwargs={"image_id": self.avatar.id}) - return f"{url}?filter={filter_spec}" - else: - return "/static/avatars/myvbv-default-avatar.png" + return self.create_avatar_url() + + @property + def avatar_url_small(self): + return self.create_avatar_url(size=96) class SecurityRequestResponseLog(models.Model): diff --git a/server/vbv_lernwelt/dashboard/views.py b/server/vbv_lernwelt/dashboard/views.py index bac8875f..1f2e7e6a 100644 --- a/server/vbv_lernwelt/dashboard/views.py +++ b/server/vbv_lernwelt/dashboard/views.py @@ -126,6 +126,29 @@ def user_role(roles: Set[str]) -> str: @api_view(["GET"]) def get_dashboard_persons(request): + def create_user_dict(user_object): + return { + "user_id": user_object.id, + "first_name": user_object.first_name, + "last_name": user_object.last_name, + "email": user_object.email, + "avatar_url_small": user_object.avatar_url_small, + "avatar_url": user_object.avatar_url, + } + + def create_course_session_dict(course_session_object, user_role, my_role): + return { + "id": str(course_session_object.id), + "session_title": course_session_object.title, + "course_id": str(course_session_object.course.id), + "course_title": course_session_object.course.title, + "course_slug": course_session_object.course.slug, + "user_role": user_role, + "my_role": my_role, + "is_uk": course_session_object.course.configuration.is_uk, + "is_vv": course_session_object.course.configuration.is_vv, + } + try: course_sessions = get_course_sessions_with_roles_for_user(request.user) @@ -137,25 +160,11 @@ def get_dashboard_persons(request): ) my_role = user_role(cs.roles) for csu in course_session_users: - result_persons[csu.user.id] = { - "user_id": csu.user.id, - "first_name": csu.user.first_name, - "last_name": csu.user.last_name, - "email": csu.user.email, - "course_sessions": [ - { - "id": str(cs.id), - "session_title": cs.title, - "course_id": str(cs.course.id), - "course_title": cs.course.title, - "course_slug": cs.course.slug, - "user_role": csu.role, - "my_role": my_role, - "is_uk": cs.course.configuration.is_uk, - "is_vv": cs.course.configuration.is_vv, - } - ], - } + person_data = create_user_dict(csu.user) + person_data["course_sessions"] = [ + create_course_session_dict(cs, csu.role, my_role) + ] + result_persons[csu.user.id] = person_data # add persons where request.user is mentor for cs in course_sessions: @@ -165,26 +174,14 @@ def get_dashboard_persons(request): ).first() for participant in lm.participants.all(): - course_session_entry = { - "id": str(cs.id), - "session_title": cs.title, - "course_id": str(cs.course.id), - "course_title": cs.course.title, - "course_slug": cs.course.slug, - "user_role": "LEARNING_MENTEE", - "my_role": "LEARNING_MENTOR", - "is_uk": cs.course.configuration.is_uk, - "is_vv": cs.course.configuration.is_vv, - } + course_session_entry = create_course_session_dict( + cs, "LEARNING_MENTEE", "LEARNING_MENTOR" + ) if participant.user.id not in result_persons: - result_persons[participant.user.id] = { - "user_id": participant.user.id, - "first_name": participant.user.first_name, - "last_name": participant.user.last_name, - "email": participant.user.email, - "course_sessions": [course_session_entry], - } + person_data = create_user_dict(participant.user) + person_data["course_sessions"] = [course_session_entry] + result_persons[participant.user.id] = person_data else: # user is already in result_persons result_persons[participant.user.id]["course_sessions"].append( @@ -197,26 +194,14 @@ def get_dashboard_persons(request): ).prefetch_related("mentor", "course_session") for mentor_relation in mentor_relation_qs: cs = mentor_relation.course_session - course_session_entry = { - "id": str(cs.id), - "session_title": cs.title, - "course_id": str(cs.course.id), - "course_title": cs.course.title, - "course_slug": cs.course.slug, - "user_role": "LEARNING_MENTOR", - "my_role": "LEARNING_MENTEE", - "is_uk": cs.course.configuration.is_uk, - "is_vv": cs.course.configuration.is_vv, - } + course_session_entry = create_course_session_dict( + cs, "LEARNING_MENTOR", "LEARNING_MENTEE" + ) if mentor_relation.mentor.id not in result_persons: - result_persons[mentor_relation.mentor.id] = { - "user_id": mentor_relation.mentor.id, - "first_name": mentor_relation.mentor.first_name, - "last_name": mentor_relation.mentor.last_name, - "email": mentor_relation.mentor.email, - "course_sessions": [course_session_entry], - } + person_data = create_user_dict(mentor_relation.mentor) + person_data["course_sessions"] = [course_session_entry] + result_persons[mentor_relation.mentor.id] = person_data else: # user is already in result_persons result_persons[mentor_relation.mentor.id]["course_sessions"].append(