From 2af7439b975eaf816c0a224f41ead264f7b34477 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Tue, 28 Jun 2022 14:43:20 +0200 Subject: [PATCH] VBV-76: Refactor user and login handling --- client/src/router/guards.ts | 37 +++----- client/src/router/index.ts | 10 +-- client/src/services/circle.ts | 4 +- client/src/services/http.ts | 8 -- client/src/stores/user.ts | 37 +++++++- client/src/views/CircleView.vue | 2 + client/src/views/HomeView.vue | 5 +- client/src/views/LoginView.vue | 66 ++++++++++++++ server/config/settings/base.py | 2 +- server/config/urls.py | 9 +- .../vbv_lernwelt/completion/tests/test_api.py | 2 +- .../vbv_lernwelt/core/create_default_users.py | 84 ++++++++++++++---- .../core/management/commands/cypress_reset.py | 2 +- .../core/migrations/0002_user_model.py | 23 +++++ ...2_create_users.py => 0003_create_users.py} | 2 +- server/vbv_lernwelt/core/models.py | 2 + server/vbv_lernwelt/core/serializers.py | 11 +++ .../core/templates/core/login.html | 35 -------- server/vbv_lernwelt/core/utils.py | 2 - server/vbv_lernwelt/core/views.py | 32 +++++++ .../commands/create_default_learning_path.py | 2 +- .../tests/create_default_learning_path.py | 29 +++--- .../static/avatars/avatar_axel.jpg | Bin 0 -> 10111 bytes .../static/avatars/avatar_christoph.png | Bin 0 -> 10440 bytes .../static/avatars/avatar_iterativ.png | Bin 0 -> 32607 bytes 25 files changed, 281 insertions(+), 125 deletions(-) delete mode 100644 client/src/services/http.ts create mode 100644 client/src/views/LoginView.vue create mode 100644 server/vbv_lernwelt/core/migrations/0002_user_model.py rename server/vbv_lernwelt/core/migrations/{0002_create_users.py => 0003_create_users.py} (94%) create mode 100644 server/vbv_lernwelt/core/serializers.py delete mode 100644 server/vbv_lernwelt/core/templates/core/login.html create mode 100644 server/vbv_lernwelt/static/avatars/avatar_axel.jpg create mode 100644 server/vbv_lernwelt/static/avatars/avatar_christoph.png create mode 100644 server/vbv_lernwelt/static/avatars/avatar_iterativ.png diff --git a/client/src/router/guards.ts b/client/src/router/guards.ts index b96e1849..80596c46 100644 --- a/client/src/router/guards.ts +++ b/client/src/router/guards.ts @@ -1,24 +1,21 @@ import type {NavigationGuardWithThis, RouteLocationNormalized} from 'vue-router'; -import type {UserState} from '@/stores/user' -import {useUserStore} from '@/stores/user' -import type {Store} from 'pinia'; - -const cookieName = 'loginStatus' -let userStore: Store | null = null - +import {useUserStore} from '@/stores/user'; export const updateLoggedIn: NavigationGuardWithThis = (_to) => { - const loggedIn = getCookieValue(cookieName) === 'true' - const store = getUserStore() + const loggedIn = getCookieValue('loginStatus') === 'true' + const userStore = useUserStore() - store.$patch({ loggedIn }) + userStore.$patch({loggedIn}); + if (loggedIn && !userStore.email) { + userStore.fetchUser(); + } } export const redirectToLoginIfRequired: NavigationGuardWithThis = (to, _from) => { - const store = getUserStore() - if(loginRequired(to) && !store.loggedIn) { - return { name: 'home' } + const userStore = useUserStore() + if(loginRequired(to) && !userStore.loggedIn) { + return `/login?next=${to.fullPath}` } } @@ -31,20 +28,6 @@ export const getCookieValue = (cookieName: string): string => { return cookieValue.pop() || ''; } -// Pina is not ready when router is called the first time by app.use(), so we need to load it here -const getUserStore = (): UserState & Store => { - if (!userStore) { - userStore = useUserStore() - } - return userStore as unknown as UserState & Store -} - const loginRequired = (to: RouteLocationNormalized) => { return !to.meta?.public } - - - -// export const unauthorizedAccess: NavigationGuardWithThis = (to) => { -// r loginRequired(to) && getCookieValue('loginStatus') !== 'true'; -// } diff --git a/client/src/router/index.ts b/client/src/router/index.ts index ff276668..08fb9fcb 100644 --- a/client/src/router/index.ts +++ b/client/src/router/index.ts @@ -1,9 +1,8 @@ import {createRouter, createWebHistory} from 'vue-router' import HomeView from '../views/HomeView.vue'; +import LoginView from '../views/LoginView.vue'; import {redirectToLoginIfRequired, updateLoggedIn} from '@/router/guards'; -const loginUrl = '/sso/login/' - const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ @@ -18,15 +17,12 @@ const router = createRouter({ }, { path: '/login', - component: HomeView, - beforeEnter(_to, _from) { - window.location.href = loginUrl - }, + component: LoginView, meta: { public: true } }, - { + { path: '/learningpath/:learningPathSlug', component: () => import('../views/LearningPathView.vue'), props: true diff --git a/client/src/services/circle.ts b/client/src/services/circle.ts index 9c0178ce..3cb8c462 100644 --- a/client/src/services/circle.ts +++ b/client/src/services/circle.ts @@ -1,7 +1,7 @@ import type {CircleChild, LearningContent, LearningSequence, LearningUnit} from '@/types'; -function createEmptyLearningUnit(parentLearningSequence: LearningSequence): LearningUnit { +function _createEmptyLearningUnit(parentLearningSequence: LearningSequence): LearningUnit { return { id: 0, title: '', @@ -35,7 +35,7 @@ export function parseLearningSequences (children: CircleChild[]): LearningSequen learningSequence = Object.assign(child, {learningUnits: []}); // initialize empty learning unit if there will not come a learning unit next - learningUnit = createEmptyLearningUnit(learningSequence); + learningUnit = _createEmptyLearningUnit(learningSequence); } else if (child.type === 'learnpath.LearningUnit') { if (!learningSequence) { throw new Error('LearningUnit found before LearningSequence'); diff --git a/client/src/services/http.ts b/client/src/services/http.ts deleted file mode 100644 index ba95cecc..00000000 --- a/client/src/services/http.ts +++ /dev/null @@ -1,8 +0,0 @@ -import axios from 'axios'; - -export function getUserData () { - return axios({ - method: 'get', - url: 'http://localhost:3000/api/me', - }) -} diff --git a/client/src/stores/user.ts b/client/src/stores/user.ts index 15a52714..32d9aaf3 100644 --- a/client/src/stores/user.ts +++ b/client/src/stores/user.ts @@ -1,8 +1,15 @@ +import * as log from 'loglevel'; + import {defineStore} from 'pinia' +import {itGet, itPost} from '@/fetchHelpers'; // typed state https://stackoverflow.com/questions/71012513/when-using-pinia-and-typescript-how-do-you-use-an-action-to-set-the-state export type UserState = { + first_name: string, + last_name: string, email: string; + username: string, + avatar_url: string, loggedIn: boolean; } @@ -10,16 +17,38 @@ export const useUserStore = defineStore({ id: 'user', state: () => ({ email: '', + first_name: '', + last_name: '', + username: '', + avatar_url: '', loggedIn: false } as UserState), getters: { }, actions: { - setEmail (email: string) { - this.email = email + handleLogin(username: string, password: string, next='/') { + if (username && password) { + itPost('/core/login/', { + username, + password, + }).then((data) => { + this.$state = data; + this.loggedIn = true; + log.debug(`redirect to ${next}`); + window.location.href = next; + }).catch(() => { + this.loggedIn = false; + alert('Login failed'); + }); + } }, - setLoggedIn (isLoggedIn: boolean) { - this.loggedIn = isLoggedIn + fetchUser() { + itGet('/api/core/me/').then((data) => { + this.$state = data; + this.loggedIn = true; + }).catch(() => { + this.loggedIn = false; + }) } } }) diff --git a/client/src/views/CircleView.vue b/client/src/views/CircleView.vue index 1b2ff255..318e4da9 100644 --- a/client/src/views/CircleView.vue +++ b/client/src/views/CircleView.vue @@ -11,6 +11,8 @@ import {useCircleStore} from '@/stores/circle'; import SelfEvaluation from '@/components/circle/SelfEvaluation.vue'; import CircleDiagram from '@/components/circle/CircleDiagram.vue'; +log.debug('CircleView.vue created'); + const props = defineProps<{ circleSlug: string }>() diff --git a/client/src/views/HomeView.vue b/client/src/views/HomeView.vue index 35d4e0b9..7b72def6 100644 --- a/client/src/views/HomeView.vue +++ b/client/src/views/HomeView.vue @@ -9,8 +9,9 @@ import MainNavigationBar from '@/components/MainNavigationBar.vue';
Styelguide - Login - Lernpfad "Versicherungsvermittlerin" (Login benötigt) + Login + + Lernpfad "Versicherungsvermittlerin" (Login benötigt) Circle "Analyse" (Login benötigt)
diff --git a/client/src/views/LoginView.vue b/client/src/views/LoginView.vue new file mode 100644 index 00000000..6d6e78f0 --- /dev/null +++ b/client/src/views/LoginView.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/server/config/settings/base.py b/server/config/settings/base.py index 1f774569..43ce67e7 100644 --- a/server/config/settings/base.py +++ b/server/config/settings/base.py @@ -129,7 +129,7 @@ AUTH_USER_MODEL = "core.User" # FIXME make configurable!? # LOGIN_URL = "/sso/login/" -LOGIN_URL = "/login/" +LOGIN_URL = "/login" LOGIN_REDIRECT_URL = "/" ALLOW_LOCAL_LOGIN = env.bool("IT_ALLOW_LOCAL_LOGIN", default=False) diff --git a/server/config/urls.py b/server/config/urls.py index 008d58a3..f99b3bdb 100644 --- a/server/config/urls.py +++ b/server/config/urls.py @@ -1,7 +1,6 @@ from django.conf import settings from django.conf.urls.static import static from django.contrib import admin -from django.contrib.auth import views as auth_views from django.contrib.auth.decorators import user_passes_test from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import include, path, re_path @@ -17,7 +16,7 @@ from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt from vbv_lernwelt.core.views import ( rate_limit_exceeded_view, permission_denied_view, - check_rate_limit, cypress_reset_view, vue_home, ) + check_rate_limit, cypress_reset_view, vue_home, vue_login, me_user_view, ) from .wagtail_api import wagtail_api_router @@ -42,14 +41,16 @@ urlpatterns = [ path('pages/', include(wagtail_urls)), path('learnpath/', include("vbv_lernwelt.learnpath.urls")), path('api/completion/', include("vbv_lernwelt.completion.urls")), + re_path(r'api/core/me/$', me_user_view, name='me_user_view'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) if settings.DEBUG: # Static file serving when using Gunicorn + Uvicorn for local web socket development urlpatterns += staticfiles_urlpatterns() if settings.ALLOW_LOCAL_LOGIN: - urlpatterns += [path("login/", django_view_authentication_exempt( - auth_views.LoginView.as_view(template_name="core/login.html"))),] + urlpatterns += [ + re_path(r'core/login/$', django_view_authentication_exempt(vue_login), name='vue_login'), + ] # API URLS diff --git a/server/vbv_lernwelt/completion/tests/test_api.py b/server/vbv_lernwelt/completion/tests/test_api.py index 6d21296e..22bcca73 100644 --- a/server/vbv_lernwelt/completion/tests/test_api.py +++ b/server/vbv_lernwelt/completion/tests/test_api.py @@ -19,7 +19,7 @@ class CompletionApiTestCase(APITestCase): def setUp(self) -> None: self.user = User.objects.get(username='student') - self.client.login(username='student', password='student') + self.client.login(username='student', password='test') def test_completeLearningContent_works(self): learning_content = LearningContent.objects.get(title='Einleitung Circle "Anlayse"') diff --git a/server/vbv_lernwelt/core/create_default_users.py b/server/vbv_lernwelt/core/create_default_users.py index 886e736f..41f8be4f 100644 --- a/server/vbv_lernwelt/core/create_default_users.py +++ b/server/vbv_lernwelt/core/create_default_users.py @@ -5,25 +5,75 @@ from vbv_lernwelt.core.models import User def create_default_users(user_model=User, group_model=Group, default_password=None): + if default_password is None: + default_password = 'test' + admin_group, created = group_model.objects.get_or_create(name='admin_group') content_creator_grop, created = group_model.objects.get_or_create(name='content_creator_grop') student_group, created = group_model.objects.get_or_create(name='student_group') - admin_password = default_password - if not admin_password: - admin_password = 'admin' - admin_user, created = _get_or_create_user(user_model=user_model, username='admin', password=admin_password) - admin_user.is_superuser = True - admin_user.is_staff = True - admin_user.groups.add(admin_group) - admin_user.save() + def _create_student_user(email, first_name, last_name, avatar_url=''): + student_user, created = _get_or_create_user( + user_model=user_model, username=email, password=default_password, + ) + student_user.first_name = first_name + student_user.last_name = last_name + student_user.avatar_url = avatar_url + student_user.groups.add(student_group) + student_user.save() - student_user_password = default_password - if not student_user_password: - student_user_password = 'student' - student_user, created = _get_or_create_user(user_model=user_model, username='student', password=student_user_password) - student_user.groups.add(student_group) - student_user.save() + def _create_admin_user(email, first_name, last_name, avatar_url=''): + admin_user, created = _get_or_create_user( + user_model=user_model, username=email, password=default_password + ) + admin_user.is_superuser = True + admin_user.is_staff = True + admin_user.first_name = first_name + admin_user.last_name = last_name + admin_user.groups.add(admin_group) + admin_user.save() + + _create_admin_user( + email='info@iterativ.ch', + first_name='Info', + last_name='Iterativ', + avatar_url='/static/avatars/avatar_iterativ.png' + ) + + _create_admin_user( + email='admin', + first_name='Peter', + last_name='Adminson', + avatar_url='/static/avatars/avatar_iterativ.png' + ) + + _create_student_user( + email='student', + first_name='Student', + last_name='Meier', + avatar_url='/static/avatars/avatar_iterativ.png' + ) + + _create_student_user( + email='daniel.egger@iterativ.ch', + first_name='Daniel', + last_name='Egger', + avatar_url='/static/avatars/avatar_iterativ.png' + ) + + _create_student_user( + email='axel.manderbach@lernetz.ch', + first_name='Axel', + last_name='Manderbach', + avatar_url='/static/avatars/avatar_axel.png' + ) + + _create_student_user( + email='christoph.bosshard@vbv-afa.ch', + first_name='Christoph', + last_name='Bosshard', + avatar_url='/static/avatars/avatar_christoph.png' + ) def _get_or_create_user(user_model, *args, **kwargs): @@ -34,6 +84,10 @@ def _get_or_create_user(user_model, *args, **kwargs): user = user_model.objects.filter(username=username).first() if not user: - user = user_model.objects.create(username=username, password=make_password(password)) + user = user_model.objects.create( + username=username, + password=make_password(password), + email=username, + ) created = True return user, created diff --git a/server/vbv_lernwelt/core/management/commands/cypress_reset.py b/server/vbv_lernwelt/core/management/commands/cypress_reset.py index 934dc1f2..757ef365 100644 --- a/server/vbv_lernwelt/core/management/commands/cypress_reset.py +++ b/server/vbv_lernwelt/core/management/commands/cypress_reset.py @@ -10,4 +10,4 @@ def command(customer_language): print("cypress reset data") delete_default_learning_path() - create_default_learning_path() + create_default_learning_path(skip_locales=False) diff --git a/server/vbv_lernwelt/core/migrations/0002_user_model.py b/server/vbv_lernwelt/core/migrations/0002_user_model.py new file mode 100644 index 00000000..2733511e --- /dev/null +++ b/server/vbv_lernwelt/core/migrations/0002_user_model.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2022-06-28 12:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='avatar_url', + field=models.CharField(blank=True, default='', max_length=254), + ), + migrations.AlterField( + model_name='user', + name='email', + field=models.EmailField(max_length=254, unique=True, verbose_name='email address'), + ), + ] diff --git a/server/vbv_lernwelt/core/migrations/0002_create_users.py b/server/vbv_lernwelt/core/migrations/0003_create_users.py similarity index 94% rename from server/vbv_lernwelt/core/migrations/0002_create_users.py rename to server/vbv_lernwelt/core/migrations/0003_create_users.py index e5d92cfa..faf79e86 100644 --- a/server/vbv_lernwelt/core/migrations/0002_create_users.py +++ b/server/vbv_lernwelt/core/migrations/0003_create_users.py @@ -15,7 +15,7 @@ def create_users(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ("core", "0001_initial"), + ("core", "0002_user_model"), ] operations = [ diff --git a/server/vbv_lernwelt/core/models.py b/server/vbv_lernwelt/core/models.py index b679d72d..55054f86 100644 --- a/server/vbv_lernwelt/core/models.py +++ b/server/vbv_lernwelt/core/models.py @@ -10,6 +10,8 @@ class User(AbstractUser): """ # FIXME: look into it... # objects = UserManager() + avatar_url = models.CharField(max_length=254, blank=True, default='') + email = models.EmailField('email address', unique=True) class SecurityRequestResponseLog(models.Model): diff --git a/server/vbv_lernwelt/core/serializers.py b/server/vbv_lernwelt/core/serializers.py new file mode 100644 index 00000000..ddc5ef24 --- /dev/null +++ b/server/vbv_lernwelt/core/serializers.py @@ -0,0 +1,11 @@ +from rest_framework import serializers + +from vbv_lernwelt.core.models import User + + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = [ + 'id', 'first_name', 'last_name', 'email', 'username', 'avatar_url', + ] diff --git a/server/vbv_lernwelt/core/templates/core/login.html b/server/vbv_lernwelt/core/templates/core/login.html deleted file mode 100644 index 4a8794dd..00000000 --- a/server/vbv_lernwelt/core/templates/core/login.html +++ /dev/null @@ -1,35 +0,0 @@ -{% extends "base.html" %} - -{% block content %} - -
- -
-
-

Login

-
- {% csrf_token %} -
- - -
-
- - -
- -
- -
-
-
-
- -
- -{% endblock %} diff --git a/server/vbv_lernwelt/core/utils.py b/server/vbv_lernwelt/core/utils.py index d48f902c..8ad3171f 100644 --- a/server/vbv_lernwelt/core/utils.py +++ b/server/vbv_lernwelt/core/utils.py @@ -6,8 +6,6 @@ from rest_framework.throttling import UserRateThrottle from structlog.types import EventDict -#from .models import User - def structlog_add_app_info( logger: logging.Logger, method_name: str, event_dict: EventDict ) -> EventDict: diff --git a/server/vbv_lernwelt/core/views.py b/server/vbv_lernwelt/core/views.py index 29c9daa0..36c3a3b9 100644 --- a/server/vbv_lernwelt/core/views.py +++ b/server/vbv_lernwelt/core/views.py @@ -1,7 +1,9 @@ # Create your views here. import requests +import structlog from django.conf import settings +from django.contrib.auth import authenticate, login from django.core.management import call_command from django.http import JsonResponse, HttpResponse, HttpResponseRedirect from django.shortcuts import render @@ -11,8 +13,12 @@ from ratelimit.decorators import ratelimit from rest_framework import authentication from rest_framework.decorators import api_view, authentication_classes, permission_classes from rest_framework.permissions import IsAdminUser +from rest_framework.response import Response from vbv_lernwelt.core.middleware.auth import django_view_authentication_exempt +from vbv_lernwelt.core.serializers import UserSerializer + +logger = structlog.get_logger(__name__) @django_view_authentication_exempt @@ -37,6 +43,32 @@ def vue_home(request): return HttpResponse(content) +@api_view(['POST']) +@ensure_csrf_cookie +def vue_login(request): + try: + username = request.data.get('username') + password = request.data.get('password') + if username and password: + user = authenticate(request, username=username, password=password) + if user: + login(request, user) + logger.debug('login successful', username=username, email=user.email, label='login') + return Response(UserSerializer(user).data) + except Exception as e: + logger.exception(e) + + logger.debug('login failed', username=username, label='login') + return Response({'success': False}, status=401) + + +@api_view(['GET']) +def me_user_view(request): + if request.user.is_authenticated: + return Response(UserSerializer(request.user).data) + return Response(status=403) + + def permission_denied_view(request, exception): return render(request, "403.html", status=403) diff --git a/server/vbv_lernwelt/learnpath/management/commands/create_default_learning_path.py b/server/vbv_lernwelt/learnpath/management/commands/create_default_learning_path.py index 7df9caaf..2218afd3 100644 --- a/server/vbv_lernwelt/learnpath/management/commands/create_default_learning_path.py +++ b/server/vbv_lernwelt/learnpath/management/commands/create_default_learning_path.py @@ -5,4 +5,4 @@ from vbv_lernwelt.learnpath.tests.create_default_learning_path import create_def @click.command() def command(): - create_default_learning_path() + create_default_learning_path(skip_locales=False) diff --git a/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py b/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py index e6a6f45e..560b7434 100644 --- a/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py +++ b/server/vbv_lernwelt/learnpath/tests/create_default_learning_path.py @@ -12,9 +12,9 @@ from vbv_lernwelt.learnpath.tests.learning_path_factories import LearningPathFac ExerciseBlockFactory, DocumentBlockFactory, LearningUnitFactory, LearningUnitQuestionFactory -def create_default_learning_path(user=None): +def create_default_learning_path(user=None, skip_locales=True): if user is None: - user = User.objects.get(username='admin') + user = User.objects.get(username='info@iterativ.ch') site = Site.objects.filter(is_default_site=True).first() @@ -409,18 +409,19 @@ Fachspezialisten bei. # circle_7 = CircleFactory.create(title="Prüfungsvorbereitung", parent=lp, topic=tp) # locales - locale_de = Locale.objects.get(language_code='de-CH') - locale_fr, _ = Locale.objects.get_or_create(language_code='fr-CH') - LocaleSynchronization.objects.get_or_create( - locale_id=locale_fr.id, - sync_from_id=locale_de.id - ) - locale_it, _ = Locale.objects.get_or_create(language_code='it-CH') - LocaleSynchronization.objects.get_or_create( - locale_id=locale_it.id, - sync_from_id=locale_de.id - ) - call_command('sync_locale_trees') + if not skip_locales: + locale_de = Locale.objects.get(language_code='de-CH') + locale_fr, _ = Locale.objects.get_or_create(language_code='fr-CH') + LocaleSynchronization.objects.get_or_create( + locale_id=locale_fr.id, + sync_from_id=locale_de.id + ) + locale_it, _ = Locale.objects.get_or_create(language_code='it-CH') + LocaleSynchronization.objects.get_or_create( + locale_id=locale_it.id, + sync_from_id=locale_de.id + ) + call_command('sync_locale_trees') # all pages belong to 'admin' by default Page.objects.update(owner=user) diff --git a/server/vbv_lernwelt/static/avatars/avatar_axel.jpg b/server/vbv_lernwelt/static/avatars/avatar_axel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d888456828a0caeea164c65e43462104dcf916f1 GIT binary patch literal 10111 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 literal 0 HcmV?d00001 diff --git a/server/vbv_lernwelt/static/avatars/avatar_christoph.png b/server/vbv_lernwelt/static/avatars/avatar_christoph.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0bc0b79dac40fb652d15493e304329c2e907fb GIT binary patch literal 10440 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 literal 0 HcmV?d00001 diff --git a/server/vbv_lernwelt/static/avatars/avatar_iterativ.png b/server/vbv_lernwelt/static/avatars/avatar_iterativ.png new file mode 100644 index 0000000000000000000000000000000000000000..9167b36ecbadb86c5f2aa5d7204977a13173860d GIT binary patch literal 32607 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 I*R&7+U&2#i)c^nh literal 0 HcmV?d00001