diff --git a/format_code.sh b/format_code.sh index 7ae11c7a..d80d20b5 100755 --- a/format_code.sh +++ b/format_code.sh @@ -10,4 +10,6 @@ echo 'format client code' npm run prettier echo 'format python code' -ufmt format server +ruff check server --fix +ruff format server + diff --git a/git-pre-push.sh b/git-pre-push.sh index fcf48120..8594c37b 100755 --- a/git-pre-push.sh +++ b/git-pre-push.sh @@ -9,8 +9,11 @@ echo 'prettier:check' echo 'lint and typecheck' (cd client && npm run lint:errors && npm run typecheck) -echo 'python ufmt check' -ufmt check server +echo 'ruff check' +ruff check server + +echo 'ruff format --check' +ruff format server --check echo 'check git-crypt files diff' git-crypt status -e | sort > git-crypt-encrypted-files-check.txt && diff git-crypt-encrypted-files.txt git-crypt-encrypted-files-check.txt diff --git a/server/config/settings/local_cypress_datatrans.py b/server/config/settings/local_cypress_datatrans.py index e56165d2..d8492b52 100644 --- a/server/config/settings/local_cypress_datatrans.py +++ b/server/config/settings/local_cypress_datatrans.py @@ -1,4 +1,5 @@ # pylint: disable=unused-wildcard-import,wildcard-import,wrong-import-position +# ruff: noqa import os from dotenv import dotenv_values diff --git a/server/config/settings/test.py b/server/config/settings/test.py index 5115924b..3f24e144 100644 --- a/server/config/settings/test.py +++ b/server/config/settings/test.py @@ -1,7 +1,6 @@ # pylint: disable=unused-wildcard-import,wildcard-import,wrong-import-position import os - os.environ["IT_APP_ENVIRONMENT"] = "local" os.environ["AWS_S3_SECRET_ACCESS_KEY"] = os.environ.get( "AWS_S3_SECRET_ACCESS_KEY", diff --git a/server/config/settings/test_cypress.py b/server/config/settings/test_cypress.py index 10932526..e12da028 100644 --- a/server/config/settings/test_cypress.py +++ b/server/config/settings/test_cypress.py @@ -12,7 +12,7 @@ from .base import * # noqa # GENERAL # ------------------------------------------------------------------------------ # https://docs.djangoproject.com/en/dev/ref/settings/#secret-key -DATABASES["default"]["NAME"] = "vbv_lernwelt_cypress" +DATABASES["default"]["NAME"] = "vbv_lernwelt_cypress" # noqa F405 DATATRANS_API_ENDPOINT = "http://localhost:8001/server/fakeapi/datatrans/api" DATATRANS_PAY_URL = "http://localhost:8001/server/fakeapi/datatrans/pay" @@ -26,7 +26,7 @@ CYPRESS_TEST = True # Your stuff... # ------------------------------------------------------------------------------ -REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"] = { +REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"] = { # noqa F405 "anon": "10000/day", "hour-throttle": "40000/hour", "day-throttle": "2000000/day", diff --git a/server/config/urls.py b/server/config/urls.py index 79f0bcd7..81ad63a1 100644 --- a/server/config/urls.py +++ b/server/config/urls.py @@ -11,6 +11,9 @@ from django.views import defaults as default_views from django.views.decorators.csrf import csrf_exempt from django_ratelimit.exceptions import Ratelimited from graphene_django.views import GraphQLView +from wagtail import urls as wagtail_urls +from wagtail.admin import urls as wagtailadmin_urls +from wagtail.documents import urls as media_library_urls from vbv_lernwelt.api.directory import list_entities from vbv_lernwelt.api.user import get_profile, me_user_view, post_avatar @@ -74,9 +77,6 @@ from vbv_lernwelt.shop.datatrans.datatrans_fake_server import ( fake_datatrans_api_view, fake_datatrans_pay_view, ) -from wagtail import urls as wagtail_urls -from wagtail.admin import urls as wagtailadmin_urls -from wagtail.documents import urls as media_library_urls class SignedIntConverter(IntConverter): @@ -99,7 +99,7 @@ def raise_example_error(request): """ raise Exception("Test Error: I know python!") # pylint: disable=unreachable - return HttpResponse("no error?") + return HttpResponse("no error?") # noqa F821 # fmt: off @@ -241,7 +241,7 @@ urlpatterns = [ # testing and debug path('server/raise_error/', user_passes_test(lambda u: u.is_superuser, login_url='/login/')( - raise_example_error), ), + raise_example_error) ), path("server/checkratelimit/", check_rate_limit), ] diff --git a/server/integration_tests/ratelimit/test_ratelimit.py b/server/integration_tests/ratelimit/test_ratelimit.py index a3723a31..66cffadc 100644 --- a/server/integration_tests/ratelimit/test_ratelimit.py +++ b/server/integration_tests/ratelimit/test_ratelimit.py @@ -1,4 +1,4 @@ -from django.test import override_settings, TestCase +from django.test import TestCase, override_settings class RateLimitTest(TestCase): diff --git a/server/manage.py b/server/manage.py index 16551f11..776a2b19 100755 --- a/server/manage.py +++ b/server/manage.py @@ -15,7 +15,7 @@ if __name__ == "__main__": try: import django # noqa except ImportError: - raise ImportError( + raise ImportError( # noqa "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?" diff --git a/server/ruff.toml b/server/ruff.toml new file mode 100644 index 00000000..1c82cda6 --- /dev/null +++ b/server/ruff.toml @@ -0,0 +1,16 @@ +[lint] +select = [ + "E", "F", "B", "I", "COM818", "ISC002" + # "PL", + # "DJ", "RUF", +] + +ignore = [ + "E501", # line too long + "F841", # local variable assigned but never used + "B007", # loop control variable +] +unfixable = ["B"] + +[format] +quote-style = "double" \ No newline at end of file diff --git a/server/vbv_lernwelt/assignment/creators/create_assignments.py b/server/vbv_lernwelt/assignment/creators/create_assignments.py index 07875a7e..50fcbb7d 100644 --- a/server/vbv_lernwelt/assignment/creators/create_assignments.py +++ b/server/vbv_lernwelt/assignment/creators/create_assignments.py @@ -1,3 +1,7 @@ +from wagtail.blocks import StreamValue +from wagtail.blocks.list_block import ListBlock, ListValue +from wagtail.rich_text import RichText + from vbv_lernwelt.assignment.models import ( AssignmentListPage, AssignmentType, @@ -21,9 +25,6 @@ from vbv_lernwelt.course.consts import ( ) from vbv_lernwelt.course.models import CoursePage from vbv_lernwelt.media_files.models import ContentDocument -from wagtail.blocks import StreamValue -from wagtail.blocks.list_block import ListBlock, ListValue -from wagtail.rich_text import RichText def create_uk_fahrzeug_casework( diff --git a/server/vbv_lernwelt/assignment/export.py b/server/vbv_lernwelt/assignment/export.py index b9f8c163..e931445b 100644 --- a/server/vbv_lernwelt/assignment/export.py +++ b/server/vbv_lernwelt/assignment/export.py @@ -25,7 +25,6 @@ from vbv_lernwelt.course_session.services.export_attendance import ( make_export_filename, sanitize_sheet_name, ) -from vbv_lernwelt.duedate.models import DueDate from vbv_lernwelt.learnpath.models import LearningContent logger = structlog.get_logger(__name__) @@ -137,9 +136,7 @@ def _create_sheet( # common user headers, Circle
In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.
" f"Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.
" ), - content_url=f"/course/überbetriebliche-kurse/media", + content_url="/course/überbetriebliche-kurse/media", ) LearningContentPlaceholderFactory( @@ -291,22 +286,24 @@ In diesem Circle erfährst du wie die überbetrieblichen Kurse aufgebaut sind. Z ) LearningUnitFactory(title="Vorbereitung", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Allgemeines zu Versicherungen", + title="Allgemeines zu Versicherungen", parent=circle, description=RichText( - f"In der Mediathek unter «Allgemeines zu Versicherungen» findest du alle relevanten Ressourcen für deine Fachkompetenzen.
" - f"Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.
" + "In der Mediathek unter «Allgemeines zu Versicherungen» findest du alle relevanten Ressourcen für deine Fachkompetenzen.
" + "Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.
" ), - content_url=f"/course/überbetriebliche-kurse/media", + content_url="/course/überbetriebliche-kurse/media", ) - LearningContentAssignmentFactory( - title="Vorbereitungsauftrag Circle Kickoff", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"überbetriebliche-kurse-assignment-circle-kickoff" + ( + LearningContentAssignmentFactory( + title="Vorbereitungsauftrag Circle Kickoff", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith="überbetriebliche-kurse-assignment-circle-kickoff" + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Präsenzkurs", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -382,14 +379,16 @@ In diesem Circle erfährst du wie die überbetrieblichen Kurse aufgebaut sind. Z slug__startswith="überbetriebliche-kurse-assignment-redlichkeits" ), ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"überbetriebliche-kurse-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith="überbetriebliche-kurse-assignment-reflexion" + ), ), - ), + ) def create_uk_fr_circle_kickoff(lp, title="Lancement"): @@ -404,22 +403,24 @@ Dans ce cercle, tu apprendras comment les cours interentreprises sont structuré LearningSequenceFactory(title="Préparation", parent=circle, icon="it-icon-ls-start") LearningUnitFactory(title="Préparation", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Allgemeines zu Versicherungen", + title="Allgemeines zu Versicherungen", parent=circle, description=RichText( - f"Trouve toutes les ressources des champs d’action, comme les outils didactiques, les liens et autres informations utiles.
" - f"Nous te recommandons de te familiariser avec le sujet avant de suivre les autres unités de cours.
" + "Trouve toutes les ressources des champs d’action, comme les outils didactiques, les liens et autres informations utiles.
" + "Nous te recommandons de te familiariser avec le sujet avant de suivre les autres unités de cours.
" ), content_url=f"/course/{circle.get_course().slug}/media", ) - LearningContentAssignmentFactory( - title="Mission de préparation", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"cours-interentreprises-assignment-circle-lancement", + ( + LearningContentAssignmentFactory( + title="Mission de préparation", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith="cours-interentreprises-assignment-circle-lancement", + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Cours de présence", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -497,14 +498,16 @@ Dans ce cercle, tu apprendras comment les cours interentreprises sont structuré slug__startswith=f"{circle.get_course().slug}-assignment-redlichkeits" ), ) - LearningContentAssignmentFactory( - title="Réflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Réflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) def create_uk_it_circle_kickoff(lp, title="Introduzione"): @@ -521,22 +524,24 @@ In questo Circle imparerai come sono strutturati i corsi interaziendali. Imparer ) LearningUnitFactory(title="Preparazione", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Allgemeines zu Versicherungen", + title="Allgemeines zu Versicherungen", parent=circle, description=RichText( - f"Nella mediateca, sotto il campo d'azione «Allgemeines zu Versicherungen», troverai tutte le risorse rilevanti per le tue competenze professionali." - f"
Si consiglia di leggere l'argomento prima di completare le altre unità di apprendimento.
" + "Nella mediateca, sotto il campo d'azione «Allgemeines zu Versicherungen», troverai tutte le risorse rilevanti per le tue competenze professionali." + "
Si consiglia di leggere l'argomento prima di completare le altre unità di apprendimento.
" ), content_url=f"/course/{circle.get_course().slug}/media", ) - LearningContentAssignmentFactory( - title="Incarico di preparazione", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-circle-introduzione-incarico-di-preparazione" + ( + LearningContentAssignmentFactory( + title="Incarico di preparazione", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-circle-introduzione-incarico-di-preparazione" + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Corso di presenza", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -612,14 +617,16 @@ In questo Circle imparerai come sono strutturati i corsi interaziendali. Imparer slug__startswith="überbetriebliche-kurse-assignment-redlichkeits" ), ) - LearningContentAssignmentFactory( - title="Riflessione", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-riflessione" + ( + LearningContentAssignmentFactory( + title="Riflessione", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-riflessione" + ), ), - ), + ) def create_uk_circle_basis(lp, title="Basis"): @@ -636,22 +643,24 @@ In diesem Circle lernst du die wichtigsten Grundlagen bezüglich Versicherungswi ) LearningUnitFactory(title="Vorbereitung", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Allgemeines zu Versicherungen", + title="Allgemeines zu Versicherungen", parent=circle, description=RichText( - f"In der Mediathek unter «Allgemeines zu Versicherungen» findest du alle relevanten Ressourcen für deine Fachkompetenzen.
" - f"Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.
" + "In der Mediathek unter «Allgemeines zu Versicherungen» findest du alle relevanten Ressourcen für deine Fachkompetenzen.
" + "Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.
" ), - content_url=f"/course/überbetriebliche-kurse/media", + content_url="/course/überbetriebliche-kurse/media", ) - LearningContentAssignmentFactory( - title="Vorbereitungsauftrag Circle Basis", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"überbetriebliche-kurse-assignment-circle-basis" + ( + LearningContentAssignmentFactory( + title="Vorbereitungsauftrag Circle Basis", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith="überbetriebliche-kurse-assignment-circle-basis" + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Präsenzkurs", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -724,14 +733,16 @@ In diesem Circle lernst du die wichtigsten Grundlagen bezüglich Versicherungswi ), ) LearningUnitFactory(title="Reflexion", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"überbetriebliche-kurse-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith="überbetriebliche-kurse-assignment-reflexion" + ), ), - ), + ) def create_uk_fr_circle_basis(lp, title="Base"): @@ -746,22 +757,24 @@ Dans ce cercle, tu apprends les bases les plus importantes en matière d'assuran LearningSequenceFactory(title="Préparation", parent=circle, icon="it-icon-ls-start") LearningUnitFactory(title="Préparation", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Allgemeines zu Versicherungen", + title="Allgemeines zu Versicherungen", parent=circle, description=RichText( - f"Trouve toutes les ressources des champs d’action, comme les outils didactiques, les liens et autres informations utiles.
" - f"Nous te recommandons de te familiariser avec le sujet avant de suivre les autres unités de cours.
" + "Trouve toutes les ressources des champs d’action, comme les outils didactiques, les liens et autres informations utiles.
" + "Nous te recommandons de te familiariser avec le sujet avant de suivre les autres unités de cours.
" ), content_url=f"/course/{circle.get_course().slug}/media", ) - LearningContentAssignmentFactory( - title="Mandats préparatoires Circle Base", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-circle-base" + ( + LearningContentAssignmentFactory( + title="Mandats préparatoires Circle Base", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-circle-base" + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Cours de présence", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -833,14 +846,16 @@ Dans ce cercle, tu apprends les bases les plus importantes en matière d'assuran extended_time_test_url="https://exam.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1691157696911,2147478636", ) LearningUnitFactory(title="Réflexion", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Réflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Réflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) def create_uk_it_circle_basis(lp, title="Base"): @@ -855,22 +870,24 @@ In questo Circle imparerai le basi più importanti del settore assicurativo e de LearningSequenceFactory(title="Préparation", parent=circle, icon="it-icon-ls-start") LearningUnitFactory(title="Préparation", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Allgemeines zu Versicherungen", + title="Allgemeines zu Versicherungen", parent=circle, description=RichText( - f"Nella mediateca, sotto il campo d'azione «Allgemeines zu Versicherungen», troverai tutte le risorse rilevanti per le tue competenze professionali." - f"
Si consiglia di leggere l'argomento prima di completare le altre unità di apprendimento.
" + "Nella mediateca, sotto il campo d'azione «Allgemeines zu Versicherungen», troverai tutte le risorse rilevanti per le tue competenze professionali." + "
Si consiglia di leggere l'argomento prima di completare le altre unità di apprendimento.
" ), content_url=f"/course/{circle.get_course().slug}/media", ) - LearningContentAssignmentFactory( - title="Mandato di preparazione Circle Base", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-cercle-base" + ( + LearningContentAssignmentFactory( + title="Mandato di preparazione Circle Base", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-cercle-base" + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Corso di presenza", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -942,14 +959,16 @@ In questo Circle imparerai le basi più importanti del settore assicurativo e de extended_time_test_url="https://exam.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1691157696911,2147478636", ) LearningUnitFactory(title="Riflessione", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Riflessione", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-riflessione" + ( + LearningContentAssignmentFactory( + title="Riflessione", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-riflessione" + ), ), - ), + ) def create_uk_circle_fahrzeug(lp, title="Fahrzeug"): @@ -971,16 +990,18 @@ def create_uk_circle_fahrzeug(lp, title="Fahrzeug"): f"In der Mediathek unter dem Handlungsfeld «{title}» findest du alle relevanten Ressourcen für deine Fachkompetenzen.
" f"Wir empfehlen dir vor der Absolvierung der weiteren Lerneinheiten dich in die Thematik einzulesen.
" ), - content_url=f"/course/überbetriebliche-kurse/media/handlungsfelder/fahrzeug", + content_url="/course/überbetriebliche-kurse/media/handlungsfelder/fahrzeug", ) - LearningContentAssignmentFactory( - title="Fahrzeug - Mein erstes Auto", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-fahrzeug-mein-erstes-auto" + ( + LearningContentAssignmentFactory( + title="Fahrzeug - Mein erstes Auto", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-fahrzeug-mein-erstes-auto" + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Präsenzkurs", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -1070,22 +1091,26 @@ def create_uk_circle_fahrzeug(lp, title="Fahrzeug"): LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Kompetenznachweis", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Überprüfen einer Motorfahrzeug-Versicherungspolice", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-überprüfen-einer-motorfahrzeugs" + ( + LearningContentAssignmentFactory( + title="Überprüfen einer Motorfahrzeug-Versicherungspolice", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-überprüfen-einer-motorfahrzeugs" + ), ), - ), + ) LearningUnitFactory(title="Reflexion", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-reflexion" + ), ), - ), + ) def create_uk_fr_circle_fahrzeug(lp, title="Véhicule"): @@ -1099,22 +1124,24 @@ def create_uk_fr_circle_fahrzeug(lp, title="Véhicule"): LearningSequenceFactory(title="Préparation", parent=circle, icon="it-icon-ls-start") LearningUnitFactory(title="Préparation", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Champs d’action «Véhicule à moteur»", + title="Champs d’action «Véhicule à moteur»", parent=circle, description=RichText( - f"Trouve toutes les ressources des champs d’action, comme les outils didactiques, les liens et autres informations utiles.
" - f"Nous te recommandons de te familiariser avec le sujet avant de suivre les autres unités de cours.
" + "Trouve toutes les ressources des champs d’action, comme les outils didactiques, les liens et autres informations utiles.
" + "Nous te recommandons de te familiariser avec le sujet avant de suivre les autres unités de cours.
" ), content_url=f"/course/{course_slug}/media", ) - LearningContentAssignmentFactory( - title="Véhicule à moteur – Ma première voiture", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-véhicule-à-moteur-ma-première-voiture" + ( + LearningContentAssignmentFactory( + title="Véhicule à moteur – Ma première voiture", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-véhicule-à-moteur-ma-première-voiture" + ), ), - ), + ) LearningSequenceFactory(title="Training", parent=circle) LearningUnitFactory(title="Cours de présence", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -1206,22 +1233,26 @@ def create_uk_fr_circle_fahrzeug(lp, title="Véhicule"): LearningUnitFactory( title="Contrôle de compétences", title_hidden=True, parent=circle ) - LearningContentAssignmentFactory( - title="Vérification d'une police d’assurance de véhicule à moteur", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-vérification-d-une-police-d-assurance-de-véhicule-à-moteur" + ( + LearningContentAssignmentFactory( + title="Vérification d'une police d’assurance de véhicule à moteur", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-vérification-d-une-police-d-assurance-de-véhicule-à-moteur" + ), ), - ), + ) LearningUnitFactory(title="Réflexion", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Réflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Réflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-reflexion" + ), ), - ), + ) def create_uk_it_circle_fahrzeug(lp, title="Veicolo"): @@ -1237,22 +1268,24 @@ def create_uk_it_circle_fahrzeug(lp, title="Veicolo"): ) LearningUnitFactory(title="Preparazione", title_hidden=True, parent=circle) LearningContentMediaLibraryFactory( - title=f"Campo d’azione «Veicolo»", + title="Campo d’azione «Veicolo»", parent=circle, description=RichText( - f"Nella mediateca, sotto il campo d'azione «Veicolo», troverai tutte le risorse rilevanti per le tue competenze professionali.
" - f"Si consiglia di leggere l'argomento prima di completare le altre unità di apprendimento.
" + "Nella mediateca, sotto il campo d'azione «Veicolo», troverai tutte le risorse rilevanti per le tue competenze professionali.
" + "Si consiglia di leggere l'argomento prima di completare le altre unità di apprendimento.
" ), content_url=f"/course/{course_slug}/media", ) - LearningContentAssignmentFactory( - title="Veicolo, la mia prima auto", - assignment_type="PREP_ASSIGNMENT", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-veicolo-la-mia-prima-auto" + ( + LearningContentAssignmentFactory( + title="Veicolo, la mia prima auto", + assignment_type="PREP_ASSIGNMENT", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-veicolo-la-mia-prima-auto" + ), ), - ), + ) LearningSequenceFactory(title="Formazione", parent=circle) LearningUnitFactory(title="Corso di presenza", title_hidden=True, parent=circle) LearningContentAttendanceCourseFactory( @@ -1344,19 +1377,23 @@ def create_uk_it_circle_fahrzeug(lp, title="Veicolo"): LearningUnitFactory( title="Controllo delle competenze", title_hidden=True, parent=circle ) - LearningContentAssignmentFactory( - title="Verifica di una polizza di assicurazione veicoli a motore", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-verifica-di-una-polizza-di-assicurazione-veicoli-a-motore" + ( + LearningContentAssignmentFactory( + title="Verifica di una polizza di assicurazione veicoli a motore", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-verifica-di-una-polizza-di-assicurazione-veicoli-a-motore" + ), ), - ), + ) LearningUnitFactory(title="Riflessione", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Riflessione", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-riflessione" + ( + LearningContentAssignmentFactory( + title="Riflessione", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-riflessione" + ), ), - ), + ) diff --git a/server/vbv_lernwelt/course/graphql/interfaces.py b/server/vbv_lernwelt/course/graphql/interfaces.py index c1d42a03..ef43142a 100644 --- a/server/vbv_lernwelt/course/graphql/interfaces.py +++ b/server/vbv_lernwelt/course/graphql/interfaces.py @@ -1,7 +1,6 @@ import graphene from vbv_lernwelt.core.utils import get_django_content_type -from vbv_lernwelt.learnpath.models import Circle class CoursePageInterface(graphene.Interface): diff --git a/server/vbv_lernwelt/course/graphql/types.py b/server/vbv_lernwelt/course/graphql/types.py index 934fa119..4da9db9c 100644 --- a/server/vbv_lernwelt/course/graphql/types.py +++ b/server/vbv_lernwelt/course/graphql/types.py @@ -30,7 +30,6 @@ from vbv_lernwelt.course_session.models import ( ) from vbv_lernwelt.course_session_group.models import CourseSessionGroup from vbv_lernwelt.iam.permissions import has_course_access -from vbv_lernwelt.learnpath.consts import COURSE_PROFILE_ALL_ID from vbv_lernwelt.learnpath.graphql.types import LearningPathObjectType from vbv_lernwelt.learnpath.models import Circle, CourseProfile diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index 5388dc35..e9b4d51f 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -3,7 +3,7 @@ import random from datetime import datetime, timedelta import djclick as click -from dateutil.relativedelta import MO, relativedelta, TH, TU +from dateutil.relativedelta import MO, TH, TU, relativedelta from django.utils import timezone from vbv_lernwelt.assignment.creators.create_assignments import ( diff --git a/server/vbv_lernwelt/course/migrations/0008_auto_20240403_1132.py b/server/vbv_lernwelt/course/migrations/0008_auto_20240403_1132.py index 7e7c1e21..471d9f23 100644 --- a/server/vbv_lernwelt/course/migrations/0008_auto_20240403_1132.py +++ b/server/vbv_lernwelt/course/migrations/0008_auto_20240403_1132.py @@ -2,7 +2,6 @@ from django.db import migrations, models - TEST_COURSE_ID = -1 UK_COURSE_IDS = [ diff --git a/server/vbv_lernwelt/course/serializer_helpers.py b/server/vbv_lernwelt/course/serializer_helpers.py index f0cf9116..12cfd3db 100644 --- a/server/vbv_lernwelt/course/serializer_helpers.py +++ b/server/vbv_lernwelt/course/serializer_helpers.py @@ -1,8 +1,8 @@ from rest_framework.fields import SerializerMethodField from vbv_lernwelt.core.serializer_helpers import ( - get_it_serializer_class, ItWagtailBaseSerializer, + get_it_serializer_class, ) from vbv_lernwelt.core.utils import StringIDField diff --git a/server/vbv_lernwelt/course/tests/test_completion_api.py b/server/vbv_lernwelt/course/tests/test_completion_api.py index a1a40512..83e6d663 100644 --- a/server/vbv_lernwelt/course/tests/test_completion_api.py +++ b/server/vbv_lernwelt/course/tests/test_completion_api.py @@ -23,7 +23,7 @@ class CourseCompletionApiTestCase(APITestCase): course_id=COURSE_TEST_ID, title="Test Lehrgang Session", ) - csu = CourseSessionUser.objects.create( + CourseSessionUser.objects.create( course_session=self.cs, user=self.user, ) @@ -34,7 +34,7 @@ class CourseCompletionApiTestCase(APITestCase): title="Fachcheck Reisen" ) - mark_url = f"/api/course/completion/mark/" + mark_url = "/api/course/completion/mark/" response = self.client.post( mark_url, diff --git a/server/vbv_lernwelt/course/tests/test_course_session_api.py b/server/vbv_lernwelt/course/tests/test_course_session_api.py index 0737cc32..fb9da67a 100644 --- a/server/vbv_lernwelt/course/tests/test_course_session_api.py +++ b/server/vbv_lernwelt/course/tests/test_course_session_api.py @@ -24,7 +24,7 @@ class CourseCompletionApiTestCase(APITestCase): self.client.login(username="student", password="test") def test_api_noCourseSession_withoutCourseSessionUser(self): - response = self.client.get(f"/api/course/sessions/") + response = self.client.get("/api/course/sessions/") self.assertEqual(response.status_code, 200) self.assertEqual(len(response.json()), 0) @@ -34,7 +34,7 @@ class CourseCompletionApiTestCase(APITestCase): course_session=self.course_session, user=self.user, ) - response = self.client.get(f"/api/course/sessions/") + response = self.client.get("/api/course/sessions/") self.assertEqual(response.status_code, 200) self.assertEqual(len(response.json()), 1) @@ -44,7 +44,7 @@ class CourseCompletionApiTestCase(APITestCase): def test_api_superUser_canAccessEveryCourseSession(self): self.client.login(username="admin", password="test") - response = self.client.get(f"/api/course/sessions/") + response = self.client.get("/api/course/sessions/") self.assertEqual(response.status_code, 200) self.assertEqual(len(response.json()), 1) diff --git a/server/vbv_lernwelt/course/tests/test_document_uploads.py b/server/vbv_lernwelt/course/tests/test_document_uploads.py index 4d08b6cf..2ae0adea 100644 --- a/server/vbv_lernwelt/course/tests/test_document_uploads.py +++ b/server/vbv_lernwelt/course/tests/test_document_uploads.py @@ -56,7 +56,7 @@ class DocumentUploadApiTestCase(APITestCase): ) self.test_data["learning_sequence"] = ls.id - response = self.client.post(f"/api/core/document/start/", self.test_data) + response = self.client.post("/api/core/document/start/", self.test_data) self.assertEqual(response.status_code, 200) self.assertNotEqual(response.data["url"], "") @@ -81,7 +81,7 @@ class DocumentUploadApiTestCase(APITestCase): slug="test-lehrgang-lp-circle-reisen-ls-analyse" ) self.test_data["learning_sequence"] = ls.id - response = self.client.post(f"/api/core/document/start/", self.test_data) + response = self.client.post("/api/core/document/start/", self.test_data) self.assertEqual(response.status_code, 403) @@ -91,7 +91,7 @@ class DocumentUploadApiTestCase(APITestCase): slug="test-lehrgang-lp-circle-fahrzeug-ls-vorbereitung" ) self.test_data["learning_sequence"] = ls.id - response = self.client.post(f"/api/core/document/start/", self.test_data) + response = self.client.post("/api/core/document/start/", self.test_data) self.assertEqual(response.status_code, 403) @@ -100,13 +100,13 @@ class DocumentUploadApiTestCase(APITestCase): slug="test-lehrgang-lp-circle-fahrzeug-ls-vorbereitung" ) self.test_data["learning_sequence"] = ls.id - response = self.client.post(f"/api/core/document/start/", self.test_data) + response = self.client.post("/api/core/document/start/", self.test_data) self.assertEqual(response.status_code, 200) file_id = response.data["file_id"] response = self.client.post( - f"/api/core/file/finish/", + "/api/core/file/finish/", { "file_id": file_id, }, @@ -129,7 +129,7 @@ class DocumentUploadApiTestCase(APITestCase): file.full_clean() file.save() - response = self.client.post(f"/api/core/file/finish/", {"file_id": file.id}) + response = self.client.post("/api/core/file/finish/", {"file_id": file.id}) self.assertEqual(response.status_code, 403) diff --git a/server/vbv_lernwelt/course_session/admin.py b/server/vbv_lernwelt/course_session/admin.py index 744590f6..64f9692d 100644 --- a/server/vbv_lernwelt/course_session/admin.py +++ b/server/vbv_lernwelt/course_session/admin.py @@ -120,9 +120,7 @@ class CourseSessionAssignmentAdmin(admin.ModelAdmin): # Make circle display-only in the form def get_readonly_fields(self, request, obj=None): - readonly_fields = super(CourseSessionAssignmentAdmin, self).get_readonly_fields( - request, obj - ) + super(CourseSessionAssignmentAdmin, self).get_readonly_fields(request, obj) return ["circle_display"] # Override get_form to include circle_display diff --git a/server/vbv_lernwelt/course_session/factories.py b/server/vbv_lernwelt/course_session/factories.py index 25b119ce..5211bb1a 100644 --- a/server/vbv_lernwelt/course_session/factories.py +++ b/server/vbv_lernwelt/course_session/factories.py @@ -1,4 +1,3 @@ -import factory from factory.django import DjangoModelFactory from vbv_lernwelt.course.factories import CourseFactory diff --git a/server/vbv_lernwelt/course_session/graphql/queries.py b/server/vbv_lernwelt/course_session/graphql/queries.py index 33c544e4..e51aee1f 100644 --- a/server/vbv_lernwelt/course_session/graphql/queries.py +++ b/server/vbv_lernwelt/course_session/graphql/queries.py @@ -20,7 +20,7 @@ class CourseSessionQuery(object): root, info, id=None, - user_id=graphene.ID(required=False), + user_id=graphene.ID(required=False), # noqa: B008 ): if user_id is None: user_id = info.context.user.id diff --git a/server/vbv_lernwelt/course_session_group/admin.py b/server/vbv_lernwelt/course_session_group/admin.py index 5bda3780..f880cfa3 100644 --- a/server/vbv_lernwelt/course_session_group/admin.py +++ b/server/vbv_lernwelt/course_session_group/admin.py @@ -4,5 +4,4 @@ from vbv_lernwelt.course_session_group.models import CourseSessionGroup @admin.register(CourseSessionGroup) -class CourseSessionAssignmentAdmin(admin.ModelAdmin): - ... +class CourseSessionAssignmentAdmin(admin.ModelAdmin): ... diff --git a/server/vbv_lernwelt/course_session_group/tests.py b/server/vbv_lernwelt/course_session_group/tests.py index 7ce503c2..a39b155a 100644 --- a/server/vbv_lernwelt/course_session_group/tests.py +++ b/server/vbv_lernwelt/course_session_group/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/server/vbv_lernwelt/dashboard/graphql/queries.py b/server/vbv_lernwelt/dashboard/graphql/queries.py index 36f3188f..b0a92e93 100644 --- a/server/vbv_lernwelt/dashboard/graphql/queries.py +++ b/server/vbv_lernwelt/dashboard/graphql/queries.py @@ -107,7 +107,7 @@ class DashboardQuery(graphene.ObjectType): coursesessionuser__user=user, coursesessionuser__role=CourseSessionUser.Role.EXPERT, ).values_list("id", flat=True) - setattr(info.context, "circle_ids", list(circle_ids)) + setattr(info.context, "circle_ids", list(circle_ids)) # noqa: B010 # todo: if course_session_ids and circles are empty return none or 404 or 401 @@ -119,9 +119,7 @@ class DashboardQuery(graphene.ObjectType): course_session_selection_ids=list(course_session_ids), # noqa ) - def resolve_mentor_course_statistics( - root, info, course_id: str, agent_role: str - ): # noqa + def resolve_mentor_course_statistics(root, info, course_id: str, agent_role: str): # noqa user = info.context.user return _agent_course_statistics(user, course_id, role=agent_role) @@ -173,7 +171,7 @@ class DashboardQuery(graphene.ObjectType): user = info.context.user course = Course.objects.get(id=course_id) - setattr(info.context, "course", course) + setattr(info.context, "course", course) # noqa: B010 newest: CourseSession | None = None course_session_for_user: List[str] = [] diff --git a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py index 74f5aa15..e410ba91 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/assignment.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/assignment.py @@ -120,7 +120,7 @@ def get_assignment_completion_metrics( ) key = f"CourseSessionUsers_{course_session.id}" - if not key in context: + if key not in context: if user_selection_ids: csu_qs = csu_qs.filter(user_id__in=user_selection_ids) @@ -192,7 +192,7 @@ def create_record( key = f"{assignment_type}_{course_session_assignment.learning_content.id}" - if not key in context: + if key not in context: context[key] = course_session_assignment.learning_content.get_circle().id circle_id = context[key] diff --git a/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py b/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py index 1981b156..69a1917a 100644 --- a/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py +++ b/server/vbv_lernwelt/dashboard/graphql/types/dashboard.py @@ -4,21 +4,21 @@ from graphene import Enum from vbv_lernwelt.course.graphql.types import CourseConfigurationObjectType from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.dashboard.graphql.types.assignment import ( - assignments, AssignmentsStatisticsType, + assignments, ) from vbv_lernwelt.dashboard.graphql.types.attendance import ( - attendance_day_presences, AttendanceDayPresencesStatisticsType, + attendance_day_presences, ) from vbv_lernwelt.dashboard.graphql.types.competence import ( CompetencePerformanceStatisticsSummaryType, - competences, CompetencesStatisticsType, + competences, ) from vbv_lernwelt.dashboard.graphql.types.feedback import ( - feedback_responses, FeedbackStatisticsResponsesType, + feedback_responses, ) from vbv_lernwelt.learnpath.models import Circle @@ -201,7 +201,8 @@ class CourseStatisticsType(BaseStatisticsType): records, success_total, fail_total = competences( course_slug=str(root.course_slug), course_session_selection_ids=[ - str(cs) for cs in root.course_session_selection_ids # noqa + str(cs) + for cs in root.course_session_selection_ids # noqa ], user_selection_ids=user_selection_ids, # noqa circle_ids=root.get_circle_ids(info), # noqa diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py index a3c53ae2..d63e9467 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_assignment.py @@ -29,14 +29,14 @@ from vbv_lernwelt.learnpath.models import Circle class AssignmentTestCase(GraphQLTestCase): GRAPHQL_URL = "/server/graphql/" - GRAPHQL_QUERY = f"""query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - assignments{{ - summary{{ + GRAPHQL_QUERY = """query($course_id: ID!) { + course_statistics(course_id: $course_id) { + assignments{ + summary{ completed_count average_passed - }} - records{{ + } + records{ course_session_id course_session_assignment_id circle_id @@ -45,17 +45,17 @@ class AssignmentTestCase(GraphQLTestCase): assignment_type_translation_key details_url deadline - metrics {{ + metrics { passed_count failed_count unranked_count ranking_completed average_passed - }} - }} - }} - }} - }}""" + } + } + } + } + }""" def setUp(self): self.course, self.course_page = create_course("Test Course") diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_attendance.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_attendance.py index 20464b41..565454ac 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_attendance.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_attendance.py @@ -75,15 +75,15 @@ class DashboardAttendanceTestCase(GraphQLTestCase): self.client.force_login(supervisor) - query = f""" - query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - attendance_day_presences{{ - summary{{ + query = """ + query($course_id: ID!) { + course_statistics(course_id: $course_id) { + attendance_day_presences{ + summary{ days_completed participants_present - }} - records{{ + } + records{ course_session_id generation circle_id @@ -91,10 +91,10 @@ class DashboardAttendanceTestCase(GraphQLTestCase): participants_present participants_total details_url - }} - }} - }} - }} + } + } + } + } """ # WHEN @@ -215,15 +215,15 @@ class DashboardExpertAttendanceTestCase(GraphQLTestCase): self.client.force_login(e1) - query = f""" - query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - attendance_day_presences{{ - summary{{ + query = """ + query($course_id: ID!) { + course_statistics(course_id: $course_id) { + attendance_day_presences{ + summary{ days_completed participants_present - }} - records{{ + } + records{ course_session_id generation circle_id @@ -231,10 +231,10 @@ class DashboardExpertAttendanceTestCase(GraphQLTestCase): participants_present participants_total details_url - }} - }} - }} - }} + } + } + } + } """ # WHEN diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_competence.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_competence.py index 51d9384f..b7906659 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_competence.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_competence.py @@ -62,10 +62,10 @@ class DashboardCompetenceTestCase(GraphQLTestCase): self.client.force_login(supervisor) - query = f"""query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - competences {{ - records {{ + query = """query($course_id: ID!) { + course_statistics(course_id: $course_id) { + competences { + records { title course_session_id generation @@ -73,14 +73,14 @@ class DashboardCompetenceTestCase(GraphQLTestCase): success_count fail_count details_url - }} - summary {{ + } + summary { success_total fail_total - }} - }} - }} - }} + } + } + } + } """ variables = {"course_id": str(course.id)} @@ -189,10 +189,10 @@ class DashboardExpertCompetenceTestCase(GraphQLTestCase): self.client.force_login(e1) - query = f"""query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - competences {{ - records {{ + query = """query($course_id: ID!) { + course_statistics(course_id: $course_id) { + competences { + records { title course_session_id generation @@ -200,14 +200,14 @@ class DashboardExpertCompetenceTestCase(GraphQLTestCase): success_count fail_count details_url - }} - summary {{ + } + summary { success_total fail_total - }} - }} - }} - }} + } + } + } + } """ variables = {"course_id": str(course.id)} diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_feedback.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_feedback.py index aa03624c..13376904 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_feedback.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_feedback.py @@ -77,10 +77,10 @@ class DashboardFeedbackTestCase(GraphQLTestCase): self.client.force_login(supervisor) - query = f"""query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - feedback_responses {{ - records {{ + query = """query($course_id: ID!) { + course_statistics(course_id: $course_id) { + feedback_responses { + records { course_session_id generation circle_id @@ -88,15 +88,15 @@ class DashboardFeedbackTestCase(GraphQLTestCase): satisfaction_max details_url experts - }} - summary {{ + } + summary { satisfaction_average satisfaction_max total_responses - }} - }} - }} - }} + } + } + } + } """ variables = {"course_id": str(course.id)} @@ -210,10 +210,10 @@ class DashboardExpertFeedbackTestCase(GraphQLTestCase): self.client.force_login(expert1.user) - query = f"""query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - feedback_responses {{ - records {{ + query = """query($course_id: ID!) { + course_statistics(course_id: $course_id) { + feedback_responses { + records { course_session_id generation circle_id @@ -221,15 +221,15 @@ class DashboardExpertFeedbackTestCase(GraphQLTestCase): satisfaction_max details_url experts - }} - summary {{ + } + summary { satisfaction_average satisfaction_max total_responses - }} - }} - }} - }} + } + } + } + } """ variables = {"course_id": str(course.id)} diff --git a/server/vbv_lernwelt/dashboard/tests/graphql/test_selection_metrics.py b/server/vbv_lernwelt/dashboard/tests/graphql/test_selection_metrics.py index 55213cd9..3a8a89a0 100644 --- a/server/vbv_lernwelt/dashboard/tests/graphql/test_selection_metrics.py +++ b/server/vbv_lernwelt/dashboard/tests/graphql/test_selection_metrics.py @@ -77,15 +77,15 @@ class DashboardTestCase(GraphQLTestCase): self.client.force_login(cs_1_ab_supervisor) # WHEN - query = f"""query($course_id: ID!) {{ - course_statistics(course_id: $course_id) {{ - course_session_selection_metrics {{ + query = """query($course_id: ID!) { + course_statistics(course_id: $course_id) { + course_session_selection_metrics { expert_count participant_count session_count - }} - }} - }}""" + } + } + }""" variables = {"course_id": str(course_1.id)} response = self.query(query, variables=variables) diff --git a/server/vbv_lernwelt/dashboard/utils.py b/server/vbv_lernwelt/dashboard/utils.py index 799b8ee5..57250135 100644 --- a/server/vbv_lernwelt/dashboard/utils.py +++ b/server/vbv_lernwelt/dashboard/utils.py @@ -141,7 +141,7 @@ def create_person_list_with_roles( # add persons where request.user is mentor for cs in course_sessions: - def _add_agent_relation(my_role, user_role): + def _add_agent_relation(cs, relation, my_role, user_role): course_session_entry = create_course_session_dict(cs, my_role, user_role) participant_user = relation.participant.user @@ -161,7 +161,7 @@ def create_person_list_with_roles( participant__course_session_id=cs.id, role="LEARNING_MENTOR", ): - _add_agent_relation("LEARNING_MENTOR", "PARTICIPANT") + _add_agent_relation(cs, relation, "LEARNING_MENTOR", "PARTICIPANT") if "BERUFSBILDNER" in cs.roles: for relation in AgentParticipantRelation.objects.filter( @@ -169,7 +169,7 @@ def create_person_list_with_roles( participant__course_session_id=cs.id, role="BERUFSBILDNER", ): - _add_agent_relation("BERUFSBILDNER", "PARTICIPANT") + _add_agent_relation(cs, relation, "BERUFSBILDNER", "PARTICIPANT") # add persons where request.user is lerning mentee mentor_relation_qs = AgentParticipantRelation.objects.filter( diff --git a/server/vbv_lernwelt/dashboard/views.py b/server/vbv_lernwelt/dashboard/views.py index 31f1cf75..3c605fd6 100644 --- a/server/vbv_lernwelt/dashboard/views.py +++ b/server/vbv_lernwelt/dashboard/views.py @@ -31,7 +31,7 @@ from vbv_lernwelt.course_session.services.export_attendance import ( export_attendance, make_export_filename, ) -from vbv_lernwelt.dashboard.person_export import export_persons, PERSONS_EXPORT_FILENAME +from vbv_lernwelt.dashboard.person_export import PERSONS_EXPORT_FILENAME, export_persons from vbv_lernwelt.dashboard.utils import ( CourseSessionWithRoles, create_course_session_dict, @@ -42,8 +42,8 @@ from vbv_lernwelt.dashboard.utils import ( from vbv_lernwelt.duedate.models import DueDate from vbv_lernwelt.duedate.serializers import DueDateSerializer from vbv_lernwelt.feedback.export import ( - export_feedback_with_circle_restriction, FEEDBACK_EXPORT_FILE_NAME, + export_feedback_with_circle_restriction, ) from vbv_lernwelt.learning_mentor.models import ( AgentParticipantRelation, @@ -346,9 +346,7 @@ def get_mentor_open_tasks_count(request, course_id: str): return Response( status=200, data={ - "open_task_count": _get_mentor_open_tasks_count( - course_id, request.user - ) # noqa + "open_task_count": _get_mentor_open_tasks_count(course_id, request.user) # noqa }, ) except PermissionDenied as e: diff --git a/server/vbv_lernwelt/duedate/views.py b/server/vbv_lernwelt/duedate/views.py index 91ea44a2..60f00ef0 100644 --- a/server/vbv_lernwelt/duedate/views.py +++ b/server/vbv_lernwelt/duedate/views.py @@ -1,3 +1 @@ -from django.shortcuts import render - # Create your views here. diff --git a/server/vbv_lernwelt/edoniq_test/result_import/edoniq_sftp_connection.py b/server/vbv_lernwelt/edoniq_test/result_import/edoniq_sftp_connection.py index 164b75dc..aa21deec 100644 --- a/server/vbv_lernwelt/edoniq_test/result_import/edoniq_sftp_connection.py +++ b/server/vbv_lernwelt/edoniq_test/result_import/edoniq_sftp_connection.py @@ -58,7 +58,7 @@ def load_edoniq_test_results_csv_data(): if __name__ == "__main__": csv_data = load_edoniq_test_results_csv_data() csv_reader = csv.reader(StringIO(csv_data), delimiter=";") - for i, row in enumerate(csv_reader): + for _, row in enumerate(csv_reader): # if len(row) > 4 and row[4] == "AG 2023 A" and row[5] == "de_üK1_KO_Testlauf": # print(row) if len(row) > 4 and row[6] == "1691151920116": diff --git a/server/vbv_lernwelt/edoniq_test/tests/test_result_import.py b/server/vbv_lernwelt/edoniq_test/tests/test_result_import.py index 5dcd6e1f..5926fd54 100644 --- a/server/vbv_lernwelt/edoniq_test/tests/test_result_import.py +++ b/server/vbv_lernwelt/edoniq_test/tests/test_result_import.py @@ -11,8 +11,8 @@ from vbv_lernwelt.core.constants import ( from vbv_lernwelt.core.create_default_users import create_default_users from vbv_lernwelt.course.creators.test_course import create_test_course from vbv_lernwelt.edoniq_test.result_import.services import ( - create_edoniq_csv_test_result, EdoniqCsvTestResult, + create_edoniq_csv_test_result, filter_relevant_rows, get_distinct_course_release_ids, upsert_edoniq_test_result, diff --git a/server/vbv_lernwelt/edoniq_test/views.py b/server/vbv_lernwelt/edoniq_test/views.py index 00d8ff7b..79458426 100644 --- a/server/vbv_lernwelt/edoniq_test/views.py +++ b/server/vbv_lernwelt/edoniq_test/views.py @@ -100,14 +100,6 @@ def export_students_and_trainers(request): return generate_export_response(course_session_users) -def fetch_course_session_users(courses: List[int]): - # if a user is in multiple courses, he should be exported multiple times - # todo: check if this is the case otherwise use .distinct("user") - return CourseSessionUser.objects.filter( - course_session__course__id__in=courses, role=CourseSessionUser.Role.MEMBER - ).order_by("user__email") - - def fetch_course_session_users( courses: List[int], role=CourseSessionUser.Role.MEMBER, excluded_domains=None ): @@ -153,9 +145,9 @@ def fetch_course_session_all_users(courses: List[int], excluded_domains=None): def generate_export_response(cs_users: List[User]) -> HttpResponse: response = HttpResponse(content_type="text/csv; charset=utf-8") - response[ - "Content-Disposition" - ] = f"attachment; filename=edoniq_user_export_{date.today().strftime('%Y%m%d')}.csv" + response["Content-Disposition"] = ( + f"attachment; filename=edoniq_user_export_{date.today().strftime('%Y%m%d')}.csv" + ) response.write("\ufeff".encode("utf8")) # UTF-8 BOM diff --git a/server/vbv_lernwelt/feedback/services.py b/server/vbv_lernwelt/feedback/services.py index d0fefe20..9e561746 100644 --- a/server/vbv_lernwelt/feedback/services.py +++ b/server/vbv_lernwelt/feedback/services.py @@ -77,7 +77,7 @@ def update_feedback_response( def initial_data_for_feedback_page( learning_content_feedback_page: Union[ LearningContentFeedbackUK, LearningContentFeedbackVV - ] + ], ): if hasattr(learning_content_feedback_page, "learningcontentfeedbackuk"): return { @@ -125,9 +125,9 @@ def _handle_feedback_export_action(course_seesions, file_name): response = HttpResponse( content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) - response[ - "Content-Disposition" - ] = f"attachment; filename={make_export_filename(file_name)}" + response["Content-Disposition"] = ( + f"attachment; filename={make_export_filename(file_name)}" + ) response.write(excel_bytes) return response diff --git a/server/vbv_lernwelt/files/integrations.py b/server/vbv_lernwelt/files/integrations.py index a47899f2..b99801d8 100644 --- a/server/vbv_lernwelt/files/integrations.py +++ b/server/vbv_lernwelt/files/integrations.py @@ -92,7 +92,7 @@ def s3_generate_presigned_post( Fields={ "acl": acl, "Content-Type": file_type, - f"Content-Disposition": f"attachment; filename={file_name}", + "Content-Disposition": f"attachment; filename={file_name}", }, Conditions=[ {"acl": acl}, diff --git a/server/vbv_lernwelt/files/mixins.py b/server/vbv_lernwelt/files/mixins.py index b63ced13..0ea3b034 100644 --- a/server/vbv_lernwelt/files/mixins.py +++ b/server/vbv_lernwelt/files/mixins.py @@ -1,5 +1,5 @@ from importlib import import_module -from typing import Sequence, Type, TYPE_CHECKING +from typing import TYPE_CHECKING, Sequence, Type from django.conf import settings from django.contrib import auth diff --git a/server/vbv_lernwelt/files/models.py b/server/vbv_lernwelt/files/models.py index 32cec66c..9b0e8041 100644 --- a/server/vbv_lernwelt/files/models.py +++ b/server/vbv_lernwelt/files/models.py @@ -8,7 +8,6 @@ from vbv_lernwelt.files.enums import FileUploadStorage from vbv_lernwelt.files.integrations import s3_delete_file, s3_generate_presigned_url from vbv_lernwelt.files.utils import file_generate_upload_path - # Inspired by https://www.hacksoft.io/blog/direct-to-s3-file-upload-with-django # Code https://github.com/HackSoftware/Django-Styleguide-Example/tree/bdadf52b849bb5fa47854a3094f4da6fe9d54d02/styleguide_example/files diff --git a/server/vbv_lernwelt/files/tests/test_files_integrations.py b/server/vbv_lernwelt/files/tests/test_files_integrations.py index dc652e09..e9d133b4 100644 --- a/server/vbv_lernwelt/files/tests/test_files_integrations.py +++ b/server/vbv_lernwelt/files/tests/test_files_integrations.py @@ -1,5 +1,3 @@ -import os - import boto3 import requests from django.conf import settings @@ -48,8 +46,6 @@ class TestIntegrationsIntegrationTest(TestCase): def test_s3_generate_presigned_url(self): # First, manually upload a file to S3 for testing - self.s3_client.upload_fileobj - self.s3_client.upload_fileobj( self.dummy_file, settings.AWS_STORAGE_BUCKET_NAME, "testfile.txt" ) diff --git a/server/vbv_lernwelt/importer/admin.py b/server/vbv_lernwelt/importer/admin.py index 8c38f3f3..846f6b40 100644 --- a/server/vbv_lernwelt/importer/admin.py +++ b/server/vbv_lernwelt/importer/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index 20de544f..2e5894d5 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -994,7 +994,7 @@ def _get_date_of_birth(data: Dict[str, Any]) -> str: return "" elif date_of_birth is date or date_of_birth is datetime: return date_of_birth.strftime("%d.%m.%Y") - elif type(date_of_birth) is str: + elif isinstance(date_of_birth, str): return date_of_birth diff --git a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py index 9b6f1fda..e8353751 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -17,9 +17,9 @@ from vbv_lernwelt.course_session.models import ( ) from vbv_lernwelt.duedate.models import DueDate from vbv_lernwelt.importer.services import ( + DataImportError, create_or_update_course_session, create_or_update_course_session_edoniq_test, - DataImportError, validate_row_data, ) from vbv_lernwelt.importer.utils import ( diff --git a/server/vbv_lernwelt/importer/tests/test_t2l_sync.py b/server/vbv_lernwelt/importer/tests/test_t2l_sync.py index 3392e022..3f3a0d60 100644 --- a/server/vbv_lernwelt/importer/tests/test_t2l_sync.py +++ b/server/vbv_lernwelt/importer/tests/test_t2l_sync.py @@ -142,9 +142,7 @@ class SyncT2lTestCase(TestCase): try: sync_students_from_t2l(user_dict) - updated_user = CourseSessionUser.objects.get( - user__email=self.user_dict["Email"] - ) + CourseSessionUser.objects.get(user__email=self.user_dict["Email"]) except Exception as e: self.fail( f"SyncT2lTestCase.test_ignors_wrong_contract_number: An exception was unexpectedly raised: {str(e)}" diff --git a/server/vbv_lernwelt/importer/utils.py b/server/vbv_lernwelt/importer/utils.py index d04209a3..d3a63287 100644 --- a/server/vbv_lernwelt/importer/utils.py +++ b/server/vbv_lernwelt/importer/utils.py @@ -27,7 +27,7 @@ def try_parse_int(x: Any, default: Optional[Any] = None) -> Tuple[bool, Any]: def try_parse_date( - value: Union[str, datetime.date] + value: Union[str, datetime.date], ) -> Tuple[bool, Union[str, datetime.date]]: if isinstance(value, datetime.date): return True, value @@ -59,7 +59,7 @@ def try_parse_date( def try_parse_datetime( - value: Union[str, datetime.datetime] + value: Union[str, datetime.datetime], ) -> Tuple[bool, Union[str, datetime.datetime]]: if isinstance(value, datetime.datetime): return True, value diff --git a/server/vbv_lernwelt/importer/views.py b/server/vbv_lernwelt/importer/views.py index 0aca7c52..9574c83a 100644 --- a/server/vbv_lernwelt/importer/views.py +++ b/server/vbv_lernwelt/importer/views.py @@ -67,7 +67,7 @@ def handle_import(request, success_msg: str, importer: Callable[[str], None]): excel_file = request.FILES["excel_file"] try: importer(excel_file) - except Exception as e: + except Exception: return render( # it is a "power" feature, so we will output the traceback on error request, diff --git a/server/vbv_lernwelt/learnpath/create_vv_new_learning_path.py b/server/vbv_lernwelt/learnpath/create_vv_new_learning_path.py index d011f87c..c4c3a068 100644 --- a/server/vbv_lernwelt/learnpath/create_vv_new_learning_path.py +++ b/server/vbv_lernwelt/learnpath/create_vv_new_learning_path.py @@ -32,7 +32,7 @@ from vbv_lernwelt.learnpath.tests.learning_path_factories import ( LearningUnitFactory, TopicFactory, ) -from vbv_lernwelt.learnpath.vv_circle_goals import GoalsType, VV_CIRCLE_GOALS +from vbv_lernwelt.learnpath.vv_circle_goals import VV_CIRCLE_GOALS, GoalsType # todo: remove when all Handlungsfelder are ready READY_HF = ["Fahrzeug", "Reisen"] @@ -271,14 +271,16 @@ def create_circle_basis(lp, title="Basis", course_page=None): LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Reflexion, Feedback", parent=circle) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"versicherungsvermittler-in-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith="versicherungsvermittler-in-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -334,13 +336,15 @@ def create_circle_gewinnen(lp, title="Gewinnen"): title="Vom Lead zum Termin/Telefon auf Empfehlung/Neukundengewinnung", parent=circle, ) - LearningContentAssignmentFactory( - title="Mein Kundenstamm", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-mein-kundenstamm" + ( + LearningContentAssignmentFactory( + title="Mein Kundenstamm", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-mein-kundenstamm" + ), ), - ), + ) LearningContentPlaceholderFactory( title="Selbsteinschätzung", parent=circle, @@ -348,14 +352,16 @@ def create_circle_gewinnen(lp, title="Gewinnen"): LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Reflexion, Feedback", parent=circle) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -653,21 +659,23 @@ def create_circle_reisen(lp, title="Reisen"): LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Transfer", title_hidden=True, parent=circle) LearningContentPlaceholderFactory( - title=f"Auswandern", + title="Auswandern", parent=circle, ) LearningContentPlaceholderFactory( - title=f"Fachcheck Reisen", + title="Fachcheck Reisen", parent=circle, ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -738,29 +746,33 @@ def create_circle_einkommenssicherung(lp, title="Einkommenssicherung"): ) LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Transfer", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Heirat: Was ändert sich", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-heirat-was-ändert-sich" + ( + LearningContentAssignmentFactory( + title="Heirat: Was ändert sich", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-heirat-was-ändert-sich" + ), ), - ), + ) LearningContentPlaceholderFactory( - title=f"Familienmanagerin", + title="Familienmanagerin", parent=circle, ) LearningContentPlaceholderFactory( title="Fachcheck Einkommenssicherung", parent=circle, ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -806,14 +818,16 @@ def create_circle_wohneigentum(lp, title="Wohneigentum"): title="Fachcheck Wohneigentum", parent=circle, ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -885,17 +899,19 @@ def create_circle_pensionierung(lp, title="Pensionierung"): LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Transfer", title_hidden=True, parent=circle) LearningContentPlaceholderFactory( - title=f"Fachcheck Pensionierung", + title="Fachcheck Pensionierung", parent=circle, ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -927,32 +943,34 @@ def create_circle_erben(lp, title="Erben/Vererben"): parent=circle, ) LearningContentPlaceholderFactory( - title=f"Guilia und Davide machen sich Gedanken", + title="Guilia und Davide machen sich Gedanken", parent=circle, ) LearningContentPlaceholderFactory( - title=f"Selbsteinschätzung", + title="Selbsteinschätzung", parent=circle, ) LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Transfer", title_hidden=True, parent=circle) LearningContentPlaceholderFactory( - title=f"Hausverkauf mit Erbvorbezug", + title="Hausverkauf mit Erbvorbezug", parent=circle, ) LearningContentPlaceholderFactory( - title=f"Fachcheck Erben/Vererben", + title="Fachcheck Erben/Vererben", parent=circle, ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -1024,25 +1042,29 @@ def create_circle_gesundheit(lp, title="Gesundheit"): ) LearningSequenceFactory(title="Transfer", parent=circle, icon="it-icon-ls-end") LearningUnitFactory(title="Transfer", title_hidden=True, parent=circle) - LearningContentAssignmentFactory( - title="Krankenversicherung: Passt die Lösung noch?", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{course_slug}-assignment-krankenversicherung-passt-die-lösung-noch" + ( + LearningContentAssignmentFactory( + title="Krankenversicherung: Passt die Lösung noch?", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{course_slug}-assignment-krankenversicherung-passt-die-lösung-noch" + ), ), - ), + ) LearningContentPlaceholderFactory( - title=f"Fachcheck Gesundheit", + title="Fachcheck Gesundheit", parent=circle, ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=circle, - content_assignment=Assignment.objects.get( - slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=circle, + content_assignment=Assignment.objects.get( + slug__startswith=f"{circle.get_course().slug}-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=circle, ) @@ -1458,14 +1480,16 @@ def create_learning_sequence_transfer(parent, title, lc_praxis_title=None): title=f"Fachcheck {title}", parent=parent, ) - LearningContentAssignmentFactory( - title="Reflexion", - assignment_type="REFLECTION", - parent=parent, - content_assignment=Assignment.objects.get( - slug__startswith=f"versicherungsvermittler-in-assignment-reflexion" + ( + LearningContentAssignmentFactory( + title="Reflexion", + assignment_type="REFLECTION", + parent=parent, + content_assignment=Assignment.objects.get( + slug__startswith="versicherungsvermittler-in-assignment-reflexion" + ), ), - ), + ) LearningContentFeedbackVVFactory( parent=parent, ) diff --git a/server/vbv_lernwelt/learnpath/graphql/types.py b/server/vbv_lernwelt/learnpath/graphql/types.py index 7d29e5fd..ccc79e9f 100644 --- a/server/vbv_lernwelt/learnpath/graphql/types.py +++ b/server/vbv_lernwelt/learnpath/graphql/types.py @@ -1,5 +1,3 @@ -import random - import graphene import structlog from graphene_django import DjangoObjectType @@ -8,7 +6,6 @@ from vbv_lernwelt.core.utils import find_first_index from vbv_lernwelt.course.graphql.interfaces import CoursePageInterface from vbv_lernwelt.learnpath.models import ( Circle, - CourseProfile, LearningContentAssignment, LearningContentAttendanceCourse, LearningContentDocumentList, diff --git a/server/vbv_lernwelt/learnpath/migrations/0015_set_feedback_user_mentor_for_vv.py b/server/vbv_lernwelt/learnpath/migrations/0015_set_feedback_user_mentor_for_vv.py index 58bb55ec..250bb519 100644 --- a/server/vbv_lernwelt/learnpath/migrations/0015_set_feedback_user_mentor_for_vv.py +++ b/server/vbv_lernwelt/learnpath/migrations/0015_set_feedback_user_mentor_for_vv.py @@ -2,7 +2,6 @@ from django.db import migrations - VV_COURSE_IDS_WITH_MENTOR_FEEDBACK = [ -4, # vv-de -10, # vv-fr diff --git a/server/vbv_lernwelt/learnpath/models.py b/server/vbv_lernwelt/learnpath/models.py index a0a76f03..587c4485 100644 --- a/server/vbv_lernwelt/learnpath/models.py +++ b/server/vbv_lernwelt/learnpath/models.py @@ -172,9 +172,6 @@ class LearningSequence(CourseBasePage): def __str__(self): return f"{self.title}" - def get_admin_display_title(self): - return f"{self.icon} {self.draft_title}" - def get_admin_display_title_html(self): return f""" diff --git a/server/vbv_lernwelt/media_files/models.py b/server/vbv_lernwelt/media_files/models.py index 05cc9f65..12f5692a 100644 --- a/server/vbv_lernwelt/media_files/models.py +++ b/server/vbv_lernwelt/media_files/models.py @@ -4,9 +4,9 @@ from wagtail.documents.models import AbstractDocument, Document from wagtail.images.models import ( AbstractImage, AbstractRendition, - get_upload_to, Image, WagtailImageField, + get_upload_to, ) from vbv_lernwelt.core.admin import User @@ -67,9 +67,12 @@ class ContentImage(AbstractImage): height_field="height", storage=ContentImagesStorage, ) - admin_form_fields = Image.admin_form_fields + ( - # Then add the field names here to make them appear in the form: - # 'caption', + admin_form_fields = ( + Image.admin_form_fields + + ( + # Then add the field names here to make them appear in the form: + # 'caption', + ) ) diff --git a/server/vbv_lernwelt/media_files/storage_backends.py b/server/vbv_lernwelt/media_files/storage_backends.py index 9bee1f3a..195f3308 100644 --- a/server/vbv_lernwelt/media_files/storage_backends.py +++ b/server/vbv_lernwelt/media_files/storage_backends.py @@ -1,6 +1,5 @@ from storages.backends.s3boto3 import S3Boto3Storage - # inspired by https://theyashshahs.medium.com/aws-s3-signed-urls-in-django-d9e66853a42f diff --git a/server/vbv_lernwelt/media_files/tests/test_content_document_storage.py b/server/vbv_lernwelt/media_files/tests/test_content_document_storage.py index c1bd849a..6ebb7b7a 100644 --- a/server/vbv_lernwelt/media_files/tests/test_content_document_storage.py +++ b/server/vbv_lernwelt/media_files/tests/test_content_document_storage.py @@ -4,7 +4,7 @@ from unittest import skipIf from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile -from django.test import override_settings, TestCase +from django.test import TestCase, override_settings from wagtail.models import Collection from vbv_lernwelt.media_files.models import ContentDocument diff --git a/server/vbv_lernwelt/media_library/admin.py b/server/vbv_lernwelt/media_library/admin.py index 8c38f3f3..846f6b40 100644 --- a/server/vbv_lernwelt/media_library/admin.py +++ b/server/vbv_lernwelt/media_library/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/server/vbv_lernwelt/media_library/create_default_media_library.py b/server/vbv_lernwelt/media_library/create_default_media_library.py index 9b0f8d7c..421fb305 100644 --- a/server/vbv_lernwelt/media_library/create_default_media_library.py +++ b/server/vbv_lernwelt/media_library/create_default_media_library.py @@ -1,6 +1,6 @@ from wagtail.rich_text import RichText -from vbv_lernwelt.course.models import Course, CoursePage +from vbv_lernwelt.course.models import CoursePage from vbv_lernwelt.media_library.tests.media_library_factories import ( MediaLibraryCategoryPageFactory, MediaLibraryContentPageFactory, @@ -10,7 +10,6 @@ from vbv_lernwelt.media_library.tests.media_library_factories import ( def create_default_media_library(course_id): - course = Course.objects.get(id=course_id) course_page = CoursePage.objects.get(course_id=course_id) media_lib_page = MediaLibraryPageFactory( @@ -59,9 +58,9 @@ def create_default_media_library(course_id): die der Fahrzeugbesitzer und die Fahrzeugbesitzerin in einem grösseren Schadenfall oft nur schwer selbst aufbringen kann. """.strip(), body=RichText( - f"