diff --git a/locale/fi/LC_MESSAGES/django.po b/locale/fi/LC_MESSAGES/django.po index 5f325f77d..4351c02db 100644 --- a/locale/fi/LC_MESSAGES/django.po +++ b/locale/fi/LC_MESSAGES/django.po @@ -2205,3 +2205,18 @@ msgstr "SAP:n vaatimia tietoja puuttuu: {}" msgid "Reservation reminder" msgstr "Muistutus varauksesta" + +msgid "Inactive purposes are not shown in the Respa admin." +msgstr "Jos käyttötarkoitus ei ole aktiivinen, sitä ei näytetä Respan adminissa." + +msgid "Inactive terms are not shown in the Respa admin." +msgstr "Jos ehto ei ole aktiivinen, sitä ei näytetä Respan adminissa." + +msgid "Inactive resource types are not shown in the Respa admin." +msgstr "Jos resurssityyppi ei ole aktiivinen, sitä ei näytetä Respan adminissa." + +msgid "Inactive metadata sets are not shown in the resource form in Respa admin." +msgstr "Jos metatietojoukko ei ole aktiivinen, sitä ei näytetä resurssin lomakkeessa Respan adminissa." + +msgid "Inactive equipment is not shown in the Respa admin." +msgstr "Jos varuste ei ole aktiivinen, sitä ei näytetä Respan adminissa." diff --git a/locale/sv/LC_MESSAGES/django.po b/locale/sv/LC_MESSAGES/django.po index 9ffd906f5..19ef60a43 100644 --- a/locale/sv/LC_MESSAGES/django.po +++ b/locale/sv/LC_MESSAGES/django.po @@ -1792,3 +1792,18 @@ msgstr "" msgid "Reservation reminder" msgstr "Bokningspåminnelse" + +msgid "Inactive purposes are not shown in the Respa admin." +msgstr "Inaktiva syften visas inte i Respa administratören." + +msgid "Inactive terms are not shown in the Respa admin." +msgstr "Inaktiva villkor visas inte i Respa administratören." + +msgid "Inactive resource types are not shown in the Respa admin." +msgstr "Inaktiva resurstyper visas inte i Respa administratören." + +msgid "Inactive metadata sets are not shown in the resource form in Respa admin." +msgstr "Inaktiva metadatauppsättningar visas inte i resursformuläret i Respa administratören." + +msgid "Inactive equipment is not shown in the Respa admin." +msgstr "Inaktiva utrustningar visas inte i Respa administratören." diff --git a/resources/migrations/0124_purpose_active.py b/resources/migrations/0124_purpose_active.py new file mode 100644 index 000000000..93de82ace --- /dev/null +++ b/resources/migrations/0124_purpose_active.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.11 on 2025-01-07 13:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('resources', '0123_reservation_reminder_sent'), + ] + + operations = [ + migrations.AddField( + model_name='purpose', + name='active', + field=models.BooleanField(default=True, help_text='Inactive purposes are not shown in the Respa admin.', verbose_name='Active'), + ), + ] diff --git a/resources/migrations/0125_termsofuse_active.py b/resources/migrations/0125_termsofuse_active.py new file mode 100644 index 000000000..40546f1f1 --- /dev/null +++ b/resources/migrations/0125_termsofuse_active.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.11 on 2025-01-08 07:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('resources', '0124_purpose_active'), + ] + + operations = [ + migrations.AddField( + model_name='termsofuse', + name='active', + field=models.BooleanField(default=True, help_text='Inactive terms are not shown in the Respa admin.', verbose_name='Active'), + ), + ] diff --git a/resources/migrations/0126_resourcetype_active.py b/resources/migrations/0126_resourcetype_active.py new file mode 100644 index 000000000..72dfb67e1 --- /dev/null +++ b/resources/migrations/0126_resourcetype_active.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.11 on 2025-01-08 08:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('resources', '0125_termsofuse_active'), + ] + + operations = [ + migrations.AddField( + model_name='resourcetype', + name='active', + field=models.BooleanField(default=True, help_text='Inactive resource types are not shown in the Respa admin.', verbose_name='Active'), + ), + ] diff --git a/resources/migrations/0127_reservationmetadataset_active.py b/resources/migrations/0127_reservationmetadataset_active.py new file mode 100644 index 000000000..218ab2517 --- /dev/null +++ b/resources/migrations/0127_reservationmetadataset_active.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.11 on 2025-01-08 08:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('resources', '0126_resourcetype_active'), + ] + + operations = [ + migrations.AddField( + model_name='reservationmetadataset', + name='active', + field=models.BooleanField(default=True, help_text='Inactive metadata sets are not shown in the resource form in Respa admin.', verbose_name='Active'), + ), + ] diff --git a/resources/migrations/0128_equipment_active.py b/resources/migrations/0128_equipment_active.py new file mode 100644 index 000000000..c2af0bec9 --- /dev/null +++ b/resources/migrations/0128_equipment_active.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.11 on 2025-01-08 11:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('resources', '0127_reservationmetadataset_active'), + ] + + operations = [ + migrations.AddField( + model_name='equipment', + name='active', + field=models.BooleanField(default=True, help_text='Inactive equipment is not shown in the Respa admin.', verbose_name='Active'), + ), + ] diff --git a/resources/models/equipment.py b/resources/models/equipment.py index 659622560..87f04fbfc 100644 --- a/resources/models/equipment.py +++ b/resources/models/equipment.py @@ -24,6 +24,11 @@ class Equipment(ModifiableModel, AutoIdentifiedModel): name = models.CharField(verbose_name=_('Name'), max_length=200) category = models.ForeignKey(EquipmentCategory, verbose_name=_('Category'), related_name='equipment', on_delete=models.CASCADE) + active = models.BooleanField( + default=True, + verbose_name=_('Active'), + help_text=_('Inactive equipment is not shown in the Respa admin.') + ) class Meta: verbose_name = pgettext_lazy('singular', 'equipment') diff --git a/resources/models/reservation.py b/resources/models/reservation.py index 468ab8572..3b4e42a54 100644 --- a/resources/models/reservation.py +++ b/resources/models/reservation.py @@ -1027,6 +1027,11 @@ class ReservationMetadataSet(ModifiableModel): related_name="metadata_sets_required", blank=True, ) + active = models.BooleanField( + default=True, + verbose_name=_("Active"), + help_text=_("Inactive metadata sets are not shown in the resource form in Respa admin."), + ) class Meta: verbose_name = _("Reservation metadata set") diff --git a/resources/models/resource.py b/resources/models/resource.py index 7d15a83e2..f81c50480 100644 --- a/resources/models/resource.py +++ b/resources/models/resource.py @@ -93,6 +93,11 @@ class ResourceType(ModifiableModel, AutoIdentifiedModel): verbose_name=_("Main type"), max_length=20, choices=MAIN_TYPES ) name = models.CharField(verbose_name=_("Name"), max_length=200) + active = models.BooleanField( + default=True, + verbose_name=_("Active"), + help_text=_("Inactive resource types are not shown in the Respa admin.") + ) class Meta: verbose_name = _("resource type") @@ -115,6 +120,10 @@ class Purpose(ModifiableModel, NameIdentifiedModel): ) name = models.CharField(verbose_name=_("Name"), max_length=200) public = models.BooleanField(default=True, verbose_name=_("Public")) + active = models.BooleanField( + default=True, + verbose_name=_("Active"), + help_text=_("Inactive purposes are not shown in the Respa admin.")) class Meta: verbose_name = _("purpose") @@ -144,6 +153,11 @@ class TermsOfUse(ModifiableModel, AutoIdentifiedModel): choices=TERMS_TYPES, default=TERMS_TYPE_GENERIC, ) + active = models.BooleanField( + default=True, + verbose_name=_("Active"), + help_text=_("Inactive terms are not shown in the Respa admin.") + ) class Meta: verbose_name = pgettext_lazy("singular", "terms of use") diff --git a/respa_admin/forms.py b/respa_admin/forms.py index 06ef9fc21..572e41185 100644 --- a/respa_admin/forms.py +++ b/respa_admin/forms.py @@ -10,10 +10,12 @@ Equipment, Period, Purpose, + ReservationMetadataSet, Resource, ResourceAccess, ResourceAccessibility, ResourceImage, + ResourceType, TermsOfUse, Unit, UnitAuthorization, @@ -173,14 +175,14 @@ class Meta: class ResourceForm(forms.ModelForm): purposes = forms.ModelMultipleChoiceField( widget=RespaCheckboxSelect, - queryset=Purpose.objects.all(), + queryset=Purpose.objects.filter(active=True), required=True, ) equipment = forms.ModelMultipleChoiceField( required=False, widget=RespaCheckboxSelect, - queryset=Equipment.objects.all(), + queryset=Equipment.objects.filter(active=True), ) name_fi = forms.CharField( @@ -296,11 +298,14 @@ class Meta: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + self.fields["type"].queryset = ResourceType.objects.filter(active=True) self.fields["generic_terms"].queryset = TermsOfUse.objects.filter( - terms_type=TermsOfUse.TERMS_TYPE_GENERIC + terms_type=TermsOfUse.TERMS_TYPE_GENERIC, + active=True, ) self.fields["payment_terms"].queryset = TermsOfUse.objects.filter( - terms_type=TermsOfUse.TERMS_TYPE_PAYMENT + terms_type=TermsOfUse.TERMS_TYPE_PAYMENT, + active=True, ) self.fields["authentication"].choices = [ choice @@ -308,6 +313,9 @@ def __init__(self, *args, **kwargs): if choice[0] not in ["", "none"] ] self.fields["authentication"].initial = ["weak"] + self.fields["reservation_metadata_set"].queryset = ( + ReservationMetadataSet.objects.filter(active=True) + ) def clean_notification_email_addresses(self): notification_email_addresses = self.cleaned_data["notification_email_addresses"] diff --git a/respa_admin/tests/test_resource_forms.py b/respa_admin/tests/test_resource_forms.py index 253963ff6..574b14468 100644 --- a/respa_admin/tests/test_resource_forms.py +++ b/respa_admin/tests/test_resource_forms.py @@ -6,9 +6,11 @@ from django.utils import translation from freezegun import freeze_time -from resources.models import Resource +from resources.models import ( + Equipment, EquipmentCategory, Purpose, ReservationMetadataSet, Resource, ResourceType, TermsOfUse +) -from ..forms import get_period_formset +from ..forms import ResourceForm, get_period_formset NEW_RESOURCE_URL = reverse_lazy("respa_admin:new-resource") @@ -236,3 +238,101 @@ def test_editing_resource_via_form_view(admin_client, valid_resource_form_data): edited_resource = Resource.objects.first() assert edited_resource.name_fi == "Edited name" assert resource.name_fi != edited_resource.name + + +@pytest.mark.django_db +def test_only_active_purposes_are_visible(): + active_purpose = Purpose.objects.create(name="Active Purpose", active=True) + inactive_purpose = Purpose.objects.create(name="Inactive Purpose", active=False) + + form = ResourceForm() + purposes_field = form.fields['purposes'] + + assert list(purposes_field.queryset) == [active_purpose] + assert inactive_purpose not in purposes_field.queryset + + +@pytest.mark.django_db +def test_only_active_terms_of_use_are_visible(): + active_generic_terms = TermsOfUse.objects.create( + name="Active Generic Terms", + terms_type=TermsOfUse.TERMS_TYPE_GENERIC, + active=True) + active_payment_terms = TermsOfUse.objects.create( + name="Active Payment Terms", + terms_type=TermsOfUse.TERMS_TYPE_PAYMENT, + active=True) + inactive_generic_terms = TermsOfUse.objects.create( + name="Inactive Generic Terms", + terms_type=TermsOfUse.TERMS_TYPE_GENERIC, + active=False) + inactive_payment_terms = TermsOfUse.objects.create( + name="Inactive Payment Terms", + terms_type=TermsOfUse.TERMS_TYPE_PAYMENT, + active=False) + + form = ResourceForm() + generic_terms_field = form.fields['generic_terms'] + payment_terms_field = form.fields['payment_terms'] + + assert list(generic_terms_field.queryset) == [active_generic_terms] + assert inactive_generic_terms not in generic_terms_field.queryset + + assert list(payment_terms_field.queryset) == [active_payment_terms] + assert inactive_payment_terms not in payment_terms_field.queryset + + +@pytest.mark.django_db +def test_only_active_resource_types_are_visible(): + active_resource_type = ResourceType.objects.create( + name="Active space", + main_type="space", + active=True) + inactive_resource_type = ResourceType.objects.create( + name="Inactive space", + main_type="space", + active=False) + + form = ResourceForm() + resource_type_field = form.fields['type'] + + assert list(resource_type_field.queryset) == [active_resource_type] + assert inactive_resource_type not in resource_type_field.queryset + + +@pytest.mark.django_db +def test_only_reservation_metadata_sets_are_visible(): + active_metadata_set = ReservationMetadataSet.objects.create( + name="Active metadata set", + active=True) + inactive_metadata_set = ReservationMetadataSet.objects.create( + name="Inactive metadata set", + active=False) + + form = ResourceForm() + metadata_set_field = form.fields['reservation_metadata_set'] + + assert list(metadata_set_field.queryset) == [active_metadata_set] + assert inactive_metadata_set not in metadata_set_field.queryset + + +@pytest.mark.django_db +def test_only_active_equipments_are_visible(): + category = EquipmentCategory.objects.create( + id="category", + name="Category" + ) + active_equipment = Equipment.objects.create( + name="Active equipment", + category=category, + active=True) + inactive_equipment = Equipment.objects.create( + name="Inactive equipment", + category=category, + active=False) + + form = ResourceForm() + equipment_field = form.fields['equipment'] + + assert list(equipment_field.queryset) == [active_equipment] + assert inactive_equipment not in equipment_field.queryset