diff --git a/aleksis/apps/paweljong/forms.py b/aleksis/apps/paweljong/forms.py
index a8af08bfb30a673596611ecf5624477a87ae04ba..0467098aa66c6b4e4373535543e4831c54fd38d6 100644
--- a/aleksis/apps/paweljong/forms.py
+++ b/aleksis/apps/paweljong/forms.py
@@ -507,11 +507,13 @@ class PersonGroupFormPerson(forms.Form):
 
 class EventCheckpointForm(forms.Form):
     class Media:
-        js = ("https://unpkg.com/html5-qrcode", "js/paweljong/qrscanner.js", "js/paweljong/checkpoint.js")
+        js = (
+            "https://unpkg.com/html5-qrcode",
+            "js/paweljong/qrscanner.js",
+            "js/paweljong/checkpoint.js",
+        )
 
-    layout = Layout(
-        "comment", "use_latlon", "username"
-    )
+    layout = Layout("comment", "use_latlon", "username")
 
     comment = forms.CharField(
         required=True,
diff --git a/aleksis/apps/paweljong/models.py b/aleksis/apps/paweljong/models.py
index c8c5104fe991ef83dde45eed5fa03d469b3ac877..8769288981d9b66d619c972d285d9fff92c0097f 100644
--- a/aleksis/apps/paweljong/models.py
+++ b/aleksis/apps/paweljong/models.py
@@ -51,9 +51,12 @@ class InfoMailing(ExtensibleModel):
     sender = models.EmailField(verbose_name=_("Sender"), blank=True)
     send_to_person = models.BooleanField(verbose_name=_("Send to registered person"), default=True)
     send_to_guardians = models.BooleanField(verbose_name=_("Send to guardians"), default=False)
-    send_to_retracted = models.BooleanField(verbose_name=_("Send to participants who retracted"), default=False)
-    send_to_not_checked_in = models.BooleanField(verbose_name=_("Send to participants who did not check in"), default=True)
-
+    send_to_retracted = models.BooleanField(
+        verbose_name=_("Send to participants who retracted"), default=False
+    )
+    send_to_not_checked_in = models.BooleanField(
+        verbose_name=_("Send to participants who did not check in"), default=True
+    )
 
     def __str__(self) -> str:
         return self.subject
@@ -418,13 +421,28 @@ class EventRegistration(ExtensibleModel):
 
 
 class Checkpoint(ExtensibleModel):
-    event = models.ForeignKey(Event, verbose_name=_("Related event"), related_name="checkpoints", on_delete=models.CASCADE)
-    person = models.ForeignKey(Person, verbose_name=_("Checked person"), related_name="event_checkpoints", on_delete=models.CASCADE)
-    checked_by = models.ForeignKey(Person, verbose_name=_("Checked by person"), related_name="event_checkpoints_created", on_delete=models.CASCADE)
-
+    event = models.ForeignKey(
+        Event, verbose_name=_("Related event"), related_name="checkpoints", on_delete=models.CASCADE
+    )
+    person = models.ForeignKey(
+        Person,
+        verbose_name=_("Checked person"),
+        related_name="event_checkpoints",
+        on_delete=models.CASCADE,
+    )
+    checked_by = models.ForeignKey(
+        Person,
+        verbose_name=_("Checked by person"),
+        related_name="event_checkpoints_created",
+        on_delete=models.CASCADE,
+    )
 
     comment = models.CharField(max_length=60, verbose_name=_("Comment"))
 
     timestamp = models.DateTimeField(verbose_name=_("Date and time of check"), auto_now_add=True)
-    lat = models.DecimalField(max_digits=10, decimal_places=8, verbose_name=_("Latitude of check"), blank=True, null=True)
-    lon = models.DecimalField(max_digits=11, decimal_places=8, verbose_name=_("Longitude of check"), blank=True, null=True)
+    lat = models.DecimalField(
+        max_digits=10, decimal_places=8, verbose_name=_("Latitude of check"), blank=True, null=True
+    )
+    lon = models.DecimalField(
+        max_digits=11, decimal_places=8, verbose_name=_("Longitude of check"), blank=True, null=True
+    )
diff --git a/aleksis/apps/paweljong/urls.py b/aleksis/apps/paweljong/urls.py
index 41a35aed54c83d50575f98273421f351c9b75b5b..1a2fa410042fe76654bb22e9a140d73adc585b57 100644
--- a/aleksis/apps/paweljong/urls.py
+++ b/aleksis/apps/paweljong/urls.py
@@ -50,7 +50,11 @@ urlpatterns = [
     ),
     path("event/<slug:slug>", views.EventFullView.as_view(), name="event_by_name"),
     path("event/<slug:slug>/detail", views.EventDetailView.as_view(), name="event_detail_by_name"),
-    path("event/<slug:slug>/checkpoint", views.EventCheckpointView.as_view(), name="event_by_name_checkpoint"),
+    path(
+        "event/<slug:slug>/checkpoint",
+        views.EventCheckpointView.as_view(),
+        name="event_by_name_checkpoint",
+    ),
     path(
         "event/<slug:slug>/start",
         views.RegisterEventStart.as_view(),
diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py
index d30369ffcce96b4e3246a1e49dda963a4e09590b..41fe4f1cc8dd65bdf78e7c3691f9f1e00e485f35 100644
--- a/aleksis/apps/paweljong/views.py
+++ b/aleksis/apps/paweljong/views.py
@@ -44,7 +44,15 @@ from .forms import (
     RegistrationNotificationForm,
     RegistrationStatesForm,
 )
-from .models import Checkpoint, Event, EventRegistration, InfoMailing, RegistrationState, Terms, Voucher
+from .models import (
+    Checkpoint,
+    Event,
+    EventRegistration,
+    InfoMailing,
+    RegistrationState,
+    Terms,
+    Voucher,
+)
 from .tables import (
     AdditionalFieldsTable,
     ChildGroupsTable,
@@ -1004,12 +1012,21 @@ class EventCheckpointView(PermissionRequiredMixin, FormView):
             checkpoint.lon = form.cleaned_data["lon"]
 
         checkpoint.save()
-        messages.success(self.request, _("{} successfully checked for {}.").format(str(checkpoint.person), str(checkpoint.comment)))
+        messages.success(
+            self.request,
+            _("{} successfully checked for {}.").format(
+                str(checkpoint.person), str(checkpoint.comment)
+            ),
+        )
         self._comment = checkpoint.comment
         return super().form_valid(self)
 
     def get_success_url(self):
-        return reverse("event_by_name_checkpoint", kwargs={"slug": self.kwargs["slug"]}) + "?" + urlencode({"comment": self._comment})
+        return (
+            reverse("event_by_name_checkpoint", kwargs={"slug": self.kwargs["slug"]})
+            + "?"
+            + urlencode({"comment": self._comment})
+        )
 
 
 class ViewTerms(PermissionRequiredMixin, DetailView):
diff --git a/tox.ini b/tox.ini
index eecc4e8fca5729d64baa60516a45186d9dfe6858..78e09567e193b72a299dfb3f776499420ecc04ec 100644
--- a/tox.ini
+++ b/tox.ini
@@ -10,7 +10,7 @@ skip_install = true
 envdir = {toxworkdir}/globalenv
 commands_pre =
      poetry install
-     poetry run aleksis-admin yarn install
+     poetry run aleksis-admin webpack_bundle
      poetry run aleksis-admin collectstatic --no-input
 commands =
     poetry run pytest --cov=. {posargs} aleksis/
@@ -49,13 +49,13 @@ commands =
 
 [testenv:makemessages]
 commands =
-    poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la
-    poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la
+    poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru
+    poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru
 
 [flake8]
 max_line_length = 100
 exclude = migrations,tests
-ignore = BLK100,E203,E231,E266,W503,D100,D101,D102,D103,D104,D105,D106,D107,RST215,RST214,F821,F841,S106,T100,T101,DJ05
+ignore = BLK100,E203,E231,W503,D100,D101,D102,D103,D104,D105,D106,D107,RST215,RST214,F821,F841,S106,T100,T101,DJ05
 
 [isort]
 profile = black