feat: Add reason why rescue org was excluded from check
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				ci/woodpecker/push/woodpecker Pipeline was successful
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	ci/woodpecker/push/woodpecker Pipeline was successful
				
			This commit is contained in:
		| @@ -57,6 +57,14 @@ class AnimalForm(forms.ModelForm): | ||||
|         } | ||||
|  | ||||
|  | ||||
| class UpdateRescueOrgRegularCheckStatus(forms.ModelForm): | ||||
|     template_name = "fellchensammlung/forms/form_snippets.html" | ||||
|  | ||||
|     class Meta: | ||||
|         model = RescueOrganization | ||||
|         fields = ["regular_check_status"] | ||||
|  | ||||
|  | ||||
| class ImageForm(forms.ModelForm): | ||||
|     def __init__(self, *args, **kwargs): | ||||
|         if 'in_flow' in kwargs: | ||||
|   | ||||
| @@ -0,0 +1,18 @@ | ||||
| # Generated by Django 5.2.1 on 2025-10-20 08:43 | ||||
|  | ||||
| from django.db import migrations, models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|  | ||||
|     dependencies = [ | ||||
|         ('fellchensammlung', '0068_alter_adoptionnotice_adoption_notice_status_and_more'), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.AddField( | ||||
|             model_name='rescueorganization', | ||||
|             name='regular_check_status', | ||||
|             field=models.CharField(choices=[('regular_check', 'Wird regelmäßig geprüft'), ('excluded_no_online_listing', 'Exkludiert: Tiere werden nicht online gelistet'), ('excluded_other_org', 'Exkludiert: Andere Organisation wird geprüft'), ('excluded_scope', 'Exkludiert: Organisation hat nie Notfellchen-relevanten Vermittlungen'), ('excluded_other', 'Exkludiert: Anderer Grund')], default='regular_check', help_text='Organisationen können, durch ändern dieser Einstellung, von der regelmäßigen Prüfung ausgeschlossen werden.', max_length=30, verbose_name='Status der regelmäßigen Prüfung'), | ||||
|         ), | ||||
|     ] | ||||
| @@ -13,7 +13,7 @@ from notfellchen.settings import MEDIA_URL, base_url | ||||
| from .tools.geo import LocationProxy, Position | ||||
| from .tools.misc import time_since_as_hr_string | ||||
| from .tools.model_helpers import NotificationTypeChoices, AdoptionNoticeStatusChoices, AdoptionProcess, \ | ||||
|     AdoptionNoticeStatusChoicesDescriptions | ||||
|     AdoptionNoticeStatusChoicesDescriptions, RegularCheckStatusChoices | ||||
| from .tools.model_helpers import ndm as NotificationDisplayMapping | ||||
|  | ||||
|  | ||||
| @@ -172,6 +172,12 @@ class RescueOrganization(models.Model): | ||||
|     exclude_from_check = models.BooleanField(default=False, verbose_name=_('Von Prüfung ausschließen'), | ||||
|                                              help_text=_("Organisation von der manuellen Überprüfung ausschließen, " | ||||
|                                                          "z.B. weil Tiere nicht online geführt werden")) | ||||
|     regular_check_status = models.CharField(max_length=30, choices=RegularCheckStatusChoices.choices, | ||||
|                                             default=RegularCheckStatusChoices.REGULAR_CHECK, | ||||
|                                             verbose_name=_('Status der regelmäßigen Prüfung'), | ||||
|                                             help_text=_( | ||||
|                                                 "Organisationen können, durch ändern dieser Einstellung, von der " | ||||
|                                                 "regelmäßigen Prüfung ausgeschlossen werden.")) | ||||
|     ongoing_communication = models.BooleanField(default=False, verbose_name=_('In aktiver Kommunikation'), | ||||
|                                                 help_text=_( | ||||
|                                                     "Es findet gerade Kommunikation zwischen Notfellchen und der Organisation statt.")) | ||||
|   | ||||
| @@ -0,0 +1,18 @@ | ||||
| {% extends "fellchensammlung/base.html" %} | ||||
| {% load i18n %} | ||||
| {% load widget_tweaks %} | ||||
|  | ||||
| {% block title %} | ||||
|     <title>Organisation {{ rescue_org }} von regelmäßiger Prüfung ausschließen</title> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block content %} | ||||
|     <h1 class="title is-1">Organisation {{ rescue_org }} von regelmäßiger Prüfung ausschließen</h1> | ||||
|     <form method="post"> | ||||
|         {% csrf_token %} | ||||
|         {{ form }} | ||||
|  | ||||
|         <a class="button" href="{% url 'organization-check' %}">{% translate "Zurück (nicht exkludieren)" %}</a> | ||||
|         <input class="button is-danger" type="submit" name="delete" value="{% translate "Von regelmäßiger Prüfung ausschließen" %}"> | ||||
|     </form> | ||||
| {% endblock %} | ||||
| @@ -75,15 +75,7 @@ | ||||
|             </form> | ||||
|         </div> | ||||
|         <div class="card-footer-item is-danger"> | ||||
|             <form method="post"> | ||||
|                 {% csrf_token %} | ||||
|                 <input type="hidden" | ||||
|                        name="rescue_organization_id" | ||||
|                        value="{{ rescue_org.pk }}"> | ||||
|                 <input type="hidden" name="action" value="exclude"> | ||||
|                 <button class="" type="submit">{% translate "Von Check exkludieren" %}</button> | ||||
|  | ||||
|             </form> | ||||
|             <a href="{% url 'rescue-organization-exclude' rescue_organization_id=rescue_org.pk %}">{% translate "Von Check exkludieren" %}</a> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| @@ -110,7 +110,8 @@ class AdoptionNoticeStatusChoicesDescriptions: | ||||
|                _ansc.AwaitingAction.WAITING_FOR_REVIEW: _( | ||||
|                    "Deaktiviert bis Moderator*innen die Vermittlung prüfen können."), | ||||
|                _ansc.AwaitingAction.NEEDS_ADDITIONAL_INFO: _("Deaktiviert bis Informationen nachgetragen werden."), | ||||
|                _ansc.AwaitingAction.UNCHECKED: _("Vermittlung deaktiviert bis sie vom Team auf Aktualität geprüft wurde."), | ||||
|                _ansc.AwaitingAction.UNCHECKED: _( | ||||
|                    "Vermittlung deaktiviert bis sie vom Team auf Aktualität geprüft wurde."), | ||||
|  | ||||
|                _ansc.Disabled.AGAINST_RULES: _("Vermittlung deaktiviert da sie gegen die Regeln verstößt."), | ||||
|                _ansc.Disabled.OTHER: _("Vermittlung deaktiviert.") | ||||
| @@ -125,3 +126,11 @@ class AdoptionNoticeProcessTemplates: | ||||
|     _bp = "fellchensammlung/partials/adoption_process/"  # Base path for ease | ||||
|     mapping = {AdoptionProcess.CONTACT_PERSON_IN_AN: f"{_bp}contact_person_in_an.html", | ||||
|                } | ||||
|  | ||||
|  | ||||
| class RegularCheckStatusChoices(models.TextChoices): | ||||
|     REGULAR_CHECK = "regular_check", _("Wird regelmäßig geprüft") | ||||
|     EXCLUDED_NO_ONLINE_LISTING = "excluded_no_online_listing", _("Exkludiert: Tiere werden nicht online gelistet") | ||||
|     EXCLUDED_OTHER_ORG = "excluded_other_org", _("Exkludiert: Andere Organisation wird geprüft") | ||||
|     EXCLUDED_SCOPE = "excluded_scope", _("Exkludiert: Organisation hat nie Notfellchen-relevanten Vermittlungen") | ||||
|     EXCLUDED_OTHER = "excluded_other", _("Exkludiert: Anderer Grund") | ||||
|   | ||||
| @@ -47,6 +47,8 @@ urlpatterns = [ | ||||
|     path("tierschutzorganisationen/", views.list_rescue_organizations, name="rescue-organizations"), | ||||
|     path("tierschutzorganisationen/<int:rescue_organization_id>/", views.detail_view_rescue_organization, | ||||
|          name="rescue-organization-detail"), | ||||
|     path("tierschutzorganisationen/<int:rescue_organization_id>/exkludieren", views.exclude_from_regular_check, | ||||
|          name="rescue-organization-exclude"), | ||||
|     path("tierschutzorganisationen/spezialisierung/<slug:species_slug>", views.specialized_rescues, | ||||
|          name="specialized-rescue-organizations"), | ||||
|  | ||||
|   | ||||
| @@ -25,7 +25,8 @@ from .models import AdoptionNotice, Text, Animal, Rule, Image, Report, Moderatio | ||||
|     Species, Log, Timestamp, TrustLevel, SexChoicesWithAll, SearchSubscription, \ | ||||
|     ImportantLocation, SpeciesSpecificURL, NotificationTypeChoices, SocialMediaPost | ||||
| from .forms import AdoptionNoticeForm, ImageForm, ReportAdoptionNoticeForm, \ | ||||
|     CommentForm, ReportCommentForm, AnimalForm, AdoptionNoticeFormAutoAnimal, SpeciesURLForm, RescueOrgInternalComment | ||||
|     CommentForm, ReportCommentForm, AnimalForm, AdoptionNoticeFormAutoAnimal, SpeciesURLForm, RescueOrgInternalComment, \ | ||||
|     UpdateRescueOrgRegularCheckStatus | ||||
| from .models import Language, Announcement | ||||
| from .tools import i18n, img | ||||
| from .tools.fedi import post_an_to_fedi | ||||
| @@ -36,7 +37,7 @@ from .tools.admin import clean_locations, get_unchecked_adoption_notices, deacti | ||||
| from .tasks import post_adoption_notice_save | ||||
| from rest_framework.authtoken.models import Token | ||||
|  | ||||
| from .tools.model_helpers import AdoptionNoticeStatusChoices, AdoptionNoticeProcessTemplates | ||||
| from .tools.model_helpers import AdoptionNoticeStatusChoices, AdoptionNoticeProcessTemplates, RegularCheckStatusChoices | ||||
| from .tools.search import AdoptionNoticeSearch, RescueOrgSearch | ||||
|  | ||||
|  | ||||
| @@ -896,6 +897,23 @@ def rescue_organization_check_dq(request): | ||||
|     return rescue_organization_check(request, context) | ||||
|  | ||||
|  | ||||
| @user_passes_test(user_is_trust_level_or_above) | ||||
| def exclude_from_regular_check(request, rescue_organization_id): | ||||
|     rescue_org = get_object_or_404(RescueOrganization, pk=rescue_organization_id) | ||||
|     if request.method == "POST": | ||||
|         form = UpdateRescueOrgRegularCheckStatus(request.POST, instance=rescue_org) | ||||
|         if form.is_valid(): | ||||
|             form.save() | ||||
|             if form.cleaned_data["regular_check_status"] != RegularCheckStatusChoices.REGULAR_CHECK: | ||||
|                 rescue_org.exclude_from_check = True | ||||
|                 rescue_org.save() | ||||
|             return redirect(reverse("organization-check")) | ||||
|     else: | ||||
|         form = UpdateRescueOrgRegularCheckStatus(instance=rescue_org) | ||||
|     context = {"form": form, rescue_org: rescue_org} | ||||
|     return render(request, 'fellchensammlung/forms/form-exclude-org-from-check.html', context=context) | ||||
|  | ||||
|  | ||||
| @user_passes_test(user_is_trust_level_or_above) | ||||
| def moderation_tools_overview(request): | ||||
|     context = None | ||||
|   | ||||
		Reference in New Issue
	
	Block a user