Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 5.2.11 on 2026-03-02 21:12

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("evaluation", "0163_migrate_cms_links"),
]

operations = [
migrations.RemoveConstraint(
model_name="questionnaire",
name="Questionnaire_visibility_choices",
),
migrations.AlterField(
model_name="questionnaire",
name="visibility",
field=models.IntegerField(
choices=[(0, "Don't show"), (1, "Managers only"), (2, "Managers and editors"), (3, "Archived")],
default=1,
verbose_name="visibility",
),
),
migrations.AddConstraint(
model_name="questionnaire",
constraint=models.CheckConstraint(
condition=models.Q(("visibility__in", [0, 1, 2, 3])), name="Questionnaire_visibility_choices"
),
),
]
1 change: 1 addition & 0 deletions evap/evaluation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ class Visibility(models.IntegerChoices):
HIDDEN = 0, _("Don't show")
MANAGERS = 1, _("Managers only")
EDITORS = 2, _("Managers and editors")
ARCHIVED = 3, _("Archived")

visibility = models.IntegerField(
choices=Visibility.choices, verbose_name=_("visibility"), default=Visibility.MANAGERS
Expand Down
10 changes: 9 additions & 1 deletion evap/evaluation/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,11 +175,19 @@ def get_parameter_from_url_or_session(request: HttpRequest, parameter: str, defa
if result_str is None: # if no parameter is given take session value
result = request.session.get(parameter, default)
else:
result = {"true": True, "false": False}.get(result_str.lower()) # convert parameter to boolean
result = {"true": True, "false": False}.get(result_str.lower(), default) # convert parameter to boolean
Comment thread
ZoqkMaze marked this conversation as resolved.
request.session[parameter] = result # store value for session
return result


def get_string_from_url_or_session(request: HttpRequest, parameter: str, default: str | None = None) -> str | None:
result = request.GET.get(parameter, None)
if result is None:
result = request.session.get(parameter, default)
request.session[parameter] = result
return result
Comment on lines +183 to +188
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The two helpers here are now basically the same thing, and they are named a bit weirdly.

We can do it as a follow-up issue to get this merged quickly, but I guess it would be nice to think about proper names here and how to make one of these use the other one.



def translate(**kwargs):
# pylint is really buggy with this method.
# pylint: disable=unused-variable, useless-suppression
Expand Down
2 changes: 1 addition & 1 deletion evap/staff/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ def __init__(self, *args, requires_decided_main_language=False, **kwargs):
super().__init__(*args, **kwargs)
self.fields["course"].queryset = Course.objects.filter(semester=semester)

visible_questionnaires = ~Q(visibility=Questionnaire.Visibility.HIDDEN)
visible_questionnaires = Q(visibility__in=[Questionnaire.Visibility.EDITORS, Questionnaire.Visibility.MANAGERS])
if self.instance.pk is not None:
visible_questionnaires |= Q(contributions__evaluation=self.instance)

Expand Down
81 changes: 68 additions & 13 deletions evap/staff/templates/staff_questionnaire_index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@
</div>
<div class="col-auto">
<div class="btn-switch btn-switch-light">
<div class="btn-switch-label">{% translate 'Hidden questionnaires' %}</div>
<div class="btn-switch-label">{% translate 'Show questionnaires' %}</div>
<div class="btn-switch btn-group">
<a href="{% url 'staff:questionnaire_index' %}?filter_questionnaires=false" role="button" class="btn btn-sm btn-light{% if not filter_questionnaires %} active{% endif %}">
{% translate 'Show' %}
<a href="{% url 'staff:questionnaire_index' %}?filter_questionnaires=all" role="button" class="btn btn-sm btn-light{% if filter_questionnaires == 'all' %} active{% endif %}">
{% translate 'All' %}
</a>
<a href="{% url 'staff:questionnaire_index' %}?filter_questionnaires=true" role="button" class="btn btn-sm btn-light{% if filter_questionnaires %} active{% endif %}">
{% translate 'Hide' %}
<a href="{% url 'staff:questionnaire_index' %}?filter_questionnaires=visible" role="button" class="btn btn-sm btn-light{% if filter_questionnaires == 'visible' %} active{% endif %}">
{% translate 'Visible' %}
</a>
<a href="{% url 'staff:questionnaire_index' %}?filter_questionnaires=archived" role="button" class="btn btn-sm btn-light{% if filter_questionnaires == 'archived' %} active{% endif %}">
{% translate 'Archived' %}
</a>
</div>
</div>
Expand Down Expand Up @@ -56,14 +59,47 @@
});
</script>

{% translate 'Top general questionnaires' as headline %}
{% include 'staff_questionnaire_index_list.html' with questionnaires=general_questionnaires_top headline=headline extra_classes='mb-3' type='top' %}
{% translate 'Contributor questionnaires' as headline %}
{% include 'staff_questionnaire_index_list.html' with questionnaires=contributor_questionnaires headline=headline extra_classes='mb-3' type='contributor' %}
{% translate 'Bottom general questionnaires' as headline %}
{% include 'staff_questionnaire_index_list.html' with questionnaires=general_questionnaires_bottom headline=headline extra_classes='mb-3' type='bottom' %}
{% translate 'Dropout questionnaires' as headline %}
{% include 'staff_questionnaire_index_list.html' with questionnaires=dropout_questionnaires headline=headline extra_classes='' type='dropout' %}
<div class="card">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs" >
<li class="nav-item">
<a class="nav-link" id="topTab" href="#" data-bs-target="#topTabContent" data-bs-toggle="tab" role="tab">
{% translate 'Top general questionnaires' %}
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="contributorTab" href="#" data-bs-target="#contributorTabContent" data-bs-toggle="tab" role="tab">
{% translate 'Contributor questionnaires' %}
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="bottomTab" href="#" data-bs-target="#bottomTabContent" data-bs-toggle="tab" role="tab">
{% translate 'Bottom general questionnaires' %}
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="dropoutTab" href="#" data-bs-target="#dropoutTabContent" data-bs-toggle="tab" role="tab">
{% translate 'Dropout questionnaires' %}
</a>
</li>
</ul>
</div>
<div class="tab-content">
<div class="tab-pane show" id="topTabContent" role="tabpanel">
{% include 'staff_questionnaire_index_list.html' with questionnaires=general_questionnaires_top type='top' %}
</div>
<div class="tab-pane" id="contributorTabContent" role="tabpanel">
{% include 'staff_questionnaire_index_list.html' with questionnaires=contributor_questionnaires type='contributor' %}
</div>
<div class="tab-pane" id="bottomTabContent" role="tabpanel">
{% include 'staff_questionnaire_index_list.html' with questionnaires=general_questionnaires_bottom type='bottom' %}
</div>
<div class="tab-pane" id="dropoutTabContent" role="tabpanel">
{% include 'staff_questionnaire_index_list.html' with questionnaires=dropout_questionnaires type='dropout' %}
</div>
</div>
</div>

{% else %}
<p>
{% translate 'There are no questionnaires yet.' %}
Expand Down Expand Up @@ -125,4 +161,23 @@
button.addEventListener("click", () => changeLocked(button));
}
</script>

<script type="module">
const tabIds = ["topTab", "contributorTab", "bottomTab", "dropoutTab"];
const tabName = localStorage.getItem('staff_questionnaure_index_tab') || tabIds[0];

if (tabIds.includes(tabName)) {
const tab = document.getElementById(tabName);
const tabTrigger = new bootstrap.Tab(tab);
tabTrigger.show();
Comment thread
ZoqkMaze marked this conversation as resolved.
}
Comment thread
ZoqkMaze marked this conversation as resolved.

function saveSelectedTab(tab) {
localStorage['staff_questionnaure_index_tab'] = tab;
}

for (const id of tabIds) {
document.getElementById(id).addEventListener("click", () => saveSelectedTab(id))
}
</script>
{% endblock %}
Loading