Skip to content
Open
Binary file modified oioioi/_locale/locale/en/LC_MESSAGES/djangojs.mo
Binary file not shown.
Binary file modified oioioi/_locale/locale/pl/LC_MESSAGES/django.mo
Binary file not shown.
27 changes: 25 additions & 2 deletions oioioi/_locale/locale/pl/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Translators:
# Accounts-Payable - Alkemics, 2015
# Alek Tudruj <aleksanderwt@gmail.com>, 2022
# Alicja Kluczek <alicja2602@gmail.com>, 2021-2022
Expand All @@ -29,6 +28,7 @@
# Jan Jakubowski, 2023
# Joanna Wojciechowska, 2021
# Kacper Lewandowski, 2022
# Kamila Godlewska, 2025
# Kamil Szymczak, 2024-2025
# konrad … <konrad.krulikowski@gmail.com>, 2016-2020
# Maciej Dębski <md319428@students.mimuw.edu.pl>, 2014
Expand Down Expand Up @@ -1039,6 +1039,11 @@ msgstr "Zapisz jako nowy"
msgid "Save and add another"
msgstr "Zapisz i dodaj do innego"

#: teachers/templates/teachers/change_form.py
msgctxt "teacher object"
msgid "Save and add another"
msgstr "Zapisz i dodaj kolejnego"

#: base/templates/admin/submit_line.html:14
#: base/templates/admin/submit_line.html:30
#| msgid "Saved for diffing"
Expand Down Expand Up @@ -4841,6 +4846,20 @@ msgstr "miasto"
msgid "school"
msgstr "szkoła"

#: teacher translation is needed in places when "dopełniacz" form is needed
msgid "teacher"
msgstr "nauczyciela"

msgid "teachers"
msgstr "nauczycieli"

msgid "join date"
msgstr "data dołączenia"

#: mp/models.py:29 oi/models.py:149 teachers/admin.py:26
msgid "Delete selected teachers"
msgstr "Usuń wybranych nauczycieli"

#: mp/models.py:34
#| msgid "team name"
msgid "teacher's name"
Expand Down Expand Up @@ -4993,7 +5012,11 @@ msgstr "-- szkoła usunięta --"
#: oi/admin.py:177 oi/templates/oi/sensitive_participant_info.html:15
#: teachers/forms.py:32 teachers/forms.py:76
msgid "School"
msgstr "Szkola"
msgstr "Szkoła"

msgctxt "teacher object"
msgid "Active"
msgstr "Aktywny"

#: oi/controllers.py:148
msgid "Polish Olympiad in Informatics - Online"
Expand Down
10 changes: 10 additions & 0 deletions oioioi/teachers/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ class TeacherAdmin(admin.ModelAdmin):
search_fields = ["school", "user__username", "user__first_name", "user__last_name", "user__email", "join_date"]

form = AdminTeacherForm
change_form_template = "teachers/change_form.html"

# Override parent's function to ensure proper translation
def get_actions(self, request):
actions = super().get_actions(request)
if 'delete_selected' in actions:
function, name, short_description = actions['delete_selected']
new_description = _("Delete selected teachers")
actions['delete_selected'] = (function, name, new_description)
return actions

def has_add_permission(self, request):
return request.user.is_superuser
Expand Down
4 changes: 4 additions & 0 deletions oioioi/teachers/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from django.utils.translation import pgettext_lazy as p_

from oioioi.base.utils.user_selection import UserSelectionField
from oioioi.contests.forms import SimpleContestForm
Expand Down Expand Up @@ -49,6 +50,9 @@ class AdminTeacherForm(forms.ModelForm):
class Meta:
model = Teacher
fields = ["user", "school", "is_active"]
labels = { # Needed for the ability of proper translation of 'is_active' to PL
"is_active": p_("teacher object", "Active"),
}

user = UserSelectionField(label=_("Username"))

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.2.9 on 2025-12-16 12:06

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('teachers', '0002_teacher_join_date'),
]

operations = [
migrations.AlterModelOptions(
name='teacher',
options={'permissions': (('teacher', 'Is a teacher'),), 'verbose_name': 'teacher', 'verbose_name_plural': 'teachers'},
),
migrations.AlterField(
model_name='teacher',
name='join_date',
field=models.DateField(auto_now_add=True, verbose_name='join date'),
),
]
4 changes: 3 additions & 1 deletion oioioi/teachers/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ class Teacher(models.Model):
user = models.OneToOneField(User, primary_key=True, verbose_name=_("user"), on_delete=models.CASCADE)
is_active = models.BooleanField(default=False, verbose_name=_("active"))
school = models.CharField(max_length=255, verbose_name=_("school"))
join_date = models.DateField(auto_now_add=True)
join_date = models.DateField(auto_now_add=True, verbose_name=_("join date"))

class Meta:
permissions = (("teacher", _("Is a teacher")),)
verbose_name = _("teacher")
verbose_name_plural = _("teachers")

def __str__(self):
return str(self.user)
Expand Down
69 changes: 69 additions & 0 deletions oioioi/teachers/templates/teachers/change_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}

{# Override buttons so they can be translated properly #}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is there any other way to inject context into the translations? right now this creates a code duplication and it is using unused buttons like archive / unarchive

{% block submit_buttons_bottom %}
<div class="submit-row d-none d-md-flex breadcrumb">
{% if show_delete_link and original %}
{% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
<a class="btn btn-danger deletelink" href="{% add_preserved_filters delete_url %}" class="deletelink">{% translate "Delete" %}</a>
{% endif %}

<div class="ml-auto">
{% if show_archive %}<a class="btn btn-warning" href="{% url 'confirm_archive_contest' %}">{% translate "Archive" %}</a>{% endif %}
{% if show_unarchive %}<a class="btn btn-warning" href="{% url 'unarchive_contest' %}">{% translate "Unarchive" %}</a>{% endif %}

{% if has_add_permission and change and save_as %}
<input class="btn btn-secondary" type="submit" value="{% translate 'Save as new' %}" name="_saveasnew">
{% endif %}

{% if has_add_permission %}
<input class="btn btn-secondary" type="submit" value="{% translate 'Save and add another' context 'teacher object' %}" name="_addanother">
{% endif %}

{% if has_change_permission or has_add_permission %}
<input class="btn btn-secondary" type="submit" value="{% if can_change %}{% translate 'Save and continue editing' %}{% else %}{% translate 'Save and view' %}{% endif %}" name="_continue">
{% endif %}

{% if has_change_permission or has_add_permission %}
<input type="submit" value="{% translate 'Save' %}" class="btn btn-primary" name="_save">
{% endif %}

{% if show_close %}
<a class="btn btn-warning" href="{% url opts|admin_urlname:'changelist' %}" class="closelink">{% translate 'Close' %}</a>
{% endif %}
</div>
</div>

<div class="submit-row d-md-none breadcrumb py-2 px-3">
<div class="nav nav-pills nav-fill flex-fill">
{% if show_delete_link and original %}
{% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
<a class="nav-item m-1 btn btn-danger deletelink" href="{% add_preserved_filters delete_url %}" class="deletelink">{% translate "Delete" %}</a>
{% endif %}

{% if show_archive %}<a class="nav-item m-1 btn btn-warning" href="{% url 'confirm_archive_contest' %}">{% translate "Archive" %}</a>{% endif %}
{% if show_unarchive %}<a class="nav-item m-1 btn btn-warning" href="{% url 'unarchive_contest' %}">{% translate "Unarchive" %}</a>{% endif %}

{% if has_add_permission and change and save_as %}
<input class="nav-item m-1 btn btn-secondary" type="submit" value="{% translate 'Save as new' %}" name="_saveasnew">
{% endif %}

{% if has_add_permission %}
<input class="nav-item m-1 btn btn-secondary" type="submit" value="{% translate 'Save and add another' context 'teacher object' %}" name="_addanother">
{% endif %}

{% if has_change_permission or has_add_permission %}
<input class="nav-item m-1 btn btn-secondary" type="submit" value="{% if can_change %}{% translate 'Save and continue editing' %}{% else %}{% translate 'Save and view' %}{% endif %}" name="_continue">
{% endif %}

{% if has_change_permission or has_add_permission %}
<input type="submit" value="{% translate 'Save' %}" class="nav-item m-1 btn btn-primary" name="_save">
{% endif %}

{% if show_close %}
<a class="nav-item m-1 btn btn-warning" href="{% url opts|admin_urlname:'changelist' %}" class="closelink">{% translate 'Close' %}</a>
{% endif %}
</div>
</div>
{% endblock %}