Finder als eigene Abfrage entfernen

Fixes #62
This commit is contained in:
gw3000 2023-10-10 08:12:40 +02:00
parent cb0696b0bd
commit 3a3bcea588
32 changed files with 32 additions and 615 deletions

View file

@ -1,4 +1,4 @@
# Generated by Django 4.2.3 on 2023-07-28 14:09 # Generated by Django 4.2.6 on 2023-10-09 21:31
from django.db import migrations, models from django.db import migrations, models
import uuid import uuid
@ -8,53 +8,22 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [] dependencies = [
]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name="Aviary", name='Aviary',
fields=[ fields=[
( ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
"id", ('description', models.CharField(max_length=256, unique=True, verbose_name='Beschreibung')),
models.UUIDField( ('condition', models.CharField(choices=[('Offen', 'Offen'), ('Geschlossen', 'Geschlossen'), ('Gesperrt', 'Gesperrt')], max_length=256, verbose_name='Zustand')),
default=uuid.uuid4, ('last_ward_round', models.DateField(verbose_name='letzte Visite')),
editable=False, ('comment', models.CharField(blank=True, max_length=512, null=True, verbose_name='Bemerkungen')),
primary_key=True,
serialize=False,
),
),
(
"description",
models.CharField(
max_length=256, unique=True, verbose_name="Beschreibung"
),
),
(
"condition",
models.CharField(
choices=[
("Offen", "Offen"),
("Geschlossen", "Geschlossen"),
("Gesperrt", "Gesperrt"),
],
max_length=256,
verbose_name="Zustand",
),
),
("last_ward_round", models.DateField(verbose_name="letzte Visite")),
(
"comment",
models.CharField(
blank=True,
max_length=512,
null=True,
verbose_name="Bemerkungen",
),
),
], ],
options={ options={
"verbose_name": "Voliere", 'verbose_name': 'Voliere',
"verbose_name_plural": "Volieren", 'verbose_name_plural': 'Volieren',
}, },
), ),
] ]

View file

@ -26,6 +26,7 @@ class BirdAddForm(forms.ModelForm):
"find_circumstances", "find_circumstances",
"diagnostic_finding", "diagnostic_finding",
"comment", "comment",
"finder",
] ]
labels = { labels = {
"bird_identifier": _("Kennung"), "bird_identifier": _("Kennung"),
@ -37,6 +38,7 @@ class BirdAddForm(forms.ModelForm):
"find_circumstances": _("Fundumstände"), "find_circumstances": _("Fundumstände"),
"diagnostic_finding": _("Diagnose bei Fund"), "diagnostic_finding": _("Diagnose bei Fund"),
"comment": _("Bermerkung"), "comment": _("Bermerkung"),
"finder": _("Finder"),
} }

View file

@ -1,5 +1,6 @@
# Generated by Django 4.2.5 on 2023-09-17 21:04 # Generated by Django 4.2.6 on 2023-10-09 21:31
import ckeditor.fields
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
@ -11,7 +12,6 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('rescuer', '0002_alter_rescuer_options'),
('aviary', '0001_initial'), ('aviary', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
] ]
@ -22,7 +22,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)), ('id', models.BigAutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=256, unique=True, verbose_name='Bezeichnung')), ('name', models.CharField(max_length=256, unique=True, verbose_name='Bezeichnung')),
('description', models.CharField(blank=True, max_length=256, null=True, verbose_name='Beschreibung')), ('description', ckeditor.fields.RichTextField(verbose_name='Erläuterungen')),
], ],
options={ options={
'verbose_name': 'Vogel', 'verbose_name': 'Vogel',
@ -65,11 +65,11 @@ class Migration(migrations.Migration):
('updated', models.DateTimeField(auto_now=True, verbose_name='geändert am')), ('updated', models.DateTimeField(auto_now=True, verbose_name='geändert am')),
('diagnostic_finding', models.CharField(max_length=256, verbose_name='Diagnose bei Fund')), ('diagnostic_finding', models.CharField(max_length=256, verbose_name='Diagnose bei Fund')),
('sent_to', models.CharField(blank=True, max_length=256, null=True, verbose_name='Übersandt nach')), ('sent_to', models.CharField(blank=True, max_length=256, null=True, verbose_name='Übersandt nach')),
('comment', models.TextField(blank=True, null=True, verbose_name='Bemerkung')), ('comment', models.TextField(blank=True, null=True, verbose_name='Bemerkungen')),
('finder', models.TextField(blank=True, null=True, verbose_name='Finder')),
('aviary', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='aviary.aviary', verbose_name='Voliere')), ('aviary', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='aviary.aviary', verbose_name='Voliere')),
('bird', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bird.bird', verbose_name='Vogel')), ('bird', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bird.bird', verbose_name='Vogel')),
('find_circumstances', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bird.circumstance', verbose_name='Fundumstände')), ('find_circumstances', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bird.circumstance', verbose_name='Fundumstände')),
('rescuer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rescuer.rescuer', verbose_name='Finder')),
('status', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='bird.birdstatus')), ('status', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='bird.birdstatus')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Benutzer')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Benutzer')),
], ],

View file

@ -1,19 +0,0 @@
# Generated by Django 4.2.6 on 2023-10-08 09:07
import ckeditor.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('bird', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='birdstatus',
name='description',
field=ckeditor.fields.RichTextField(verbose_name='Erläuterungen'),
),
]

View file

@ -8,7 +8,6 @@ from django.utils.translation import gettext_lazy as _
from ckeditor.fields import RichTextField from ckeditor.fields import RichTextField
from aviary.models import Aviary from aviary.models import Aviary
from rescuer.models import Rescuer
CHOICE_AGE = [ CHOICE_AGE = [
@ -51,13 +50,6 @@ class FallenBird(models.Model):
diagnostic_finding = models.CharField( diagnostic_finding = models.CharField(
max_length=256, verbose_name=_("Diagnose bei Fund") max_length=256, verbose_name=_("Diagnose bei Fund")
) )
rescuer = models.ForeignKey(
Rescuer,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name=_("Finder"),
)
user = models.ForeignKey( user = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_("Benutzer") settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_("Benutzer")
) )
@ -73,6 +65,7 @@ class FallenBird(models.Model):
max_length=256, null=True, blank=True, verbose_name=_("Übersandt nach") max_length=256, null=True, blank=True, verbose_name=_("Übersandt nach")
) )
comment = models.TextField(blank=True, null=True, verbose_name=_("Bemerkung")) comment = models.TextField(blank=True, null=True, verbose_name=_("Bemerkung"))
finder = models.TextField(blank=True, null=True, verbose_name=_("Finder"))
class Meta: class Meta:
verbose_name = _("Patient") verbose_name = _("Patient")

View file

@ -48,9 +48,7 @@
mehr in Behandlung befindlichen Patienten finden Sie <a href="{% url 'bird_inactive' %}">hier</a>. mehr in Behandlung befindlichen Patienten finden Sie <a href="{% url 'bird_inactive' %}">hier</a>.
</p> </p>
<p> <p>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addPatientModal">einen Patienten <p><a href="{% url 'bird_create' %}" class="btn btn-primary">einen Patienten anlegen</a></p>
anlegen
</button>
</p> </p>
<table class="table table-striped table-hover display responsive nowrap" id="t__bird_all"> <table class="table table-striped table-hover display responsive nowrap" id="t__bird_all">
<thead> <thead>
@ -58,7 +56,6 @@
<th>Patienten Alias</th> <th>Patienten Alias</th>
<th>Vogel</th> <th>Vogel</th>
<th>gefunden am</th> <th>gefunden am</th>
<th>Finder</th>
<th>Fundort</th> <th>Fundort</th>
<th>Status</th> <th>Status</th>
<th>Voliere</th> <th>Voliere</th>
@ -73,7 +70,6 @@
<td><a href="{% url 'bird_single' bird.id %}">{{ bird.bird_identifier }}</a></td> <td><a href="{% url 'bird_single' bird.id %}">{{ bird.bird_identifier }}</a></td>
<td>{{ bird.bird }}</td> <td>{{ bird.bird }}</td>
<td data-order="{{ forloop.counter }}">{{ bird.date_found }}</td> <td data-order="{{ forloop.counter }}">{{ bird.date_found }}</td>
<td><a href="{% url 'rescuer_single' bird.rescuer_id %}">{{ bird.rescuer|default_if_none:"" }}</a></td>
<td>{{ bird.place }}</td> <td>{{ bird.place }}</td>
<td>{{ bird.status }}</td> <td>{{ bird.status }}</td>
<td>{{ bird.aviary|default_if_none:"" }}</td> <td>{{ bird.aviary|default_if_none:"" }}</td>
@ -84,37 +80,5 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<div class="modal fade" id="addPatientModal" tabindex="-1" data-bs-backdrop="static"
aria-labelledby="addRescuerModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-primary">
<h5 class="modal-title text-white" id="addRescuerModalLabel">(neuen) Finder zuweisen</h5>
</div>
<form method="post">
{% csrf_token %}
<div class="modal-body">
<label for="rescuer" class="form-label mt-3">Wählen Sie einen <strong>bereits angelegten</strong>
Finder aus oder legen Sie einen <strong>neuen</strong> Finder an:</label>
<select id="rescuer" class="form-select" name="rescuer_id">
<option value="new_rescuer"><strong>neuen
Finder anlegen</strong></option>
{% for rescuer in rescuer_modal %}
<option value={{rescuer.id}}>
{{rescuer.last_name}}, {{rescuer.first_name}},
{{rescuer.street}} {{rescuer.street_number}},
{{rescuer.city}}
</option>
{% endfor %}
</select>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-bs-dismiss="modal">Abbrechen</button>
<button class="btn btn-primary" type="submit">Übernehmen und weiter</button>
</div>
</div>
</div>
</div>
</form> </form>
{% endblock content %} {% endblock content %}

View file

@ -3,15 +3,14 @@
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% block content %} {% block content %}
<h3>Patient anlegen</h3> <h3>Einen Patienten anlegen</h3>
<p>(Retter: {{rescuer.first_name}} {{rescuer.last_name}})</p>
<div class="row"> <div class="row">
<div class="col-lg-8 mb-3"> <div class="col-lg-8 mb-3">
<form method="post" enctype="multipart/form-data"> <form method="post" enctype="multipart/form-data">
{% csrf_token %} {% csrf_token %}
{{ form|crispy }} {{ form|crispy }}
<a href="{% url 'bird_all' %}" class="btn btn-success">Abbrechen</a> <a href="{% url 'bird_all' %}" class="btn btn-success">Abbrechen</a>
<button class="btn btn-primary" type="submit">Patient anlegen</button> <button class="btn btn-primary" type="submit">Speichern</button>
<div class="mt-3"><small>* Pflichtfeld</small></div> <div class="mt-3"><small>* Pflichtfeld</small></div>
</form> </form>
</div> </div>

View file

@ -52,7 +52,6 @@
<th>Patienten Alias</th> <th>Patienten Alias</th>
<th>Vogel</th> <th>Vogel</th>
<th>gefunden am</th> <th>gefunden am</th>
<th>Finder</th>
<th>Fundort</th> <th>Fundort</th>
<th>Status</th> <th>Status</th>
<th>Kosten</th> <th>Kosten</th>
@ -66,9 +65,6 @@
<td><a href="{% url 'bird_single' bird.id %}">{{ bird.bird_identifier }}</a></td> <td><a href="{% url 'bird_single' bird.id %}">{{ bird.bird_identifier }}</a></td>
<td>{{ bird.bird }}</td> <td>{{ bird.bird }}</td>
<td data-order="{{ forloop.counter }}">{{ bird.date_found }}</td> <td data-order="{{ forloop.counter }}">{{ bird.date_found }}</td>
<td>
<a href="{% url 'rescuer_single' bird.rescuer_id %}">{{ bird.rescuer|default_if_none:"" }}</a>
</td>
<td>{{ bird.place }}</td> <td>{{ bird.place }}</td>
<td>{{ bird.status }}</td> <td>{{ bird.status }}</td>
<td>{{ bird.total_costs|default_if_none:"0,00" }} &euro;</td> <td>{{ bird.total_costs|default_if_none:"0,00" }} &euro;</td>

View file

@ -4,7 +4,6 @@
{% block content %} {% block content %}
<h3>Patient <strong>{{ bird.bird_identifier }}</strong> bearbeiten </h3> <h3>Patient <strong>{{ bird.bird_identifier }}</strong> bearbeiten </h3>
<p>Finder des Patienten: <strong> <a href="{% url 'rescuer_single' bird.rescuer_id %}">{{ bird.rescuer|default_if_none:"" }}</a></strong>.
Das Alter des Patienten bei Fund wurde mit <strong>{{ bird.age }}</strong> angegeben.</p> Das Alter des Patienten bei Fund wurde mit <strong>{{ bird.age }}</strong> angegeben.</p>
<div class="row"> <div class="row">
<div class="col-lg-6 mb-3"> <div class="col-lg-6 mb-3">

View file

@ -5,23 +5,17 @@ from django.shortcuts import HttpResponse, redirect, render
from .forms import BirdAddForm, BirdEditForm from .forms import BirdAddForm, BirdEditForm
from .models import Bird, FallenBird from .models import Bird, FallenBird
from rescuer.models import Rescuer
@login_required(login_url="account_login") @login_required(login_url="account_login")
def bird_create(request): def bird_create(request):
form = BirdAddForm(initial={"bird_identifier": names.get_first_name()}) form = BirdAddForm(initial={"bird_identifier": names.get_first_name()})
# Rescuer for modal usage rescuer_id = None
rescuer_id = request.session.get("rescuer_id")
rescuer = Rescuer.objects.get(id=rescuer_id)
# Just show only related rescuers in select field of the form. # Just show only related rescuers in select field of the form.
if request.method == "POST": if request.method == "POST":
form = BirdAddForm(request.POST or None, request.FILES or None) form = BirdAddForm(request.POST or None, request.FILES or None)
rescuer_id = None
# circumstances = Circumstance.objects.all()
rescuer_id = request.session.get("rescuer_id")
rescuer = Rescuer.objects.get(id=rescuer_id)
if form.is_valid(): if form.is_valid():
fs = form.save(commit=False) fs = form.save(commit=False)
@ -30,7 +24,7 @@ def bird_create(request):
fs.save() fs.save()
request.session["rescuer_id"] = None request.session["rescuer_id"] = None
return redirect("bird_all") return redirect("bird_all")
context = {"form": form, "rescuer": rescuer} context = {"form": form}
return render(request, "bird/bird_create.html", context) return render(request, "bird/bird_create.html", context)
@ -55,16 +49,7 @@ def bird_all(request):
.annotate(total_costs=Sum("costs__costs")) .annotate(total_costs=Sum("costs__costs"))
.order_by("date_found") .order_by("date_found")
) )
rescuer_modal = Rescuer.objects.all() context = {"birds": birds}
context = {"birds": birds, "rescuer_modal": rescuer_modal}
# Post came from the modal form.
if request.method == "POST":
rescuer_id = request._post["rescuer_id"]
if rescuer_id != "new_rescuer":
request.session["rescuer_id"] = rescuer_id
return redirect("bird_create")
else:
return redirect("rescuer_create")
return render(request, "bird/bird_all.html", context) return render(request, "bird/bird_all.html", context)

View file

@ -26,7 +26,6 @@ JAZZMIN_SETTINGS = {
"aviary.Aviary", "aviary.Aviary",
"bird.FallenBird", "bird.FallenBird",
"bird.User", "bird.User",
"rescuer.Rescuer",
], ],
# Field name on user model that contains avatar ImageField/URLField/Charfield or a callable that receives the user # Field name on user model that contains avatar ImageField/URLField/Charfield or a callable that receives the user
# "user_avatar": None, # "user_avatar": None,
@ -87,7 +86,7 @@ JAZZMIN_SETTINGS = {
"bird.Circumstance": "fas fa-solid fa-ring", "bird.Circumstance": "fas fa-solid fa-ring",
"bird.FallenBird": "fas fa-solid fa-bed", "bird.FallenBird": "fas fa-solid fa-bed",
"costs.Costs": "fas fa-solid fa-money-bill", "costs.Costs": "fas fa-solid fa-money-bill",
"rescuer.Rescuer": "fas fa-solid fa-user-shield", # "rescuer.Rescuer": "fas fa-solid fa-user-shield",
"socialaccount.socialaccount": "fas fa-solid fa-lock", "socialaccount.socialaccount": "fas fa-solid fa-lock",
"socialaccount.socialapp": "fas fa-solid fa-laptop", "socialaccount.socialapp": "fas fa-solid fa-laptop",
"socialaccount.socialtoken": "fas fa-solid fa-keyboard", "socialaccount.socialtoken": "fas fa-solid fa-keyboard",

View file

@ -74,7 +74,7 @@ INSTALLED_APPS = [
"bird", "bird",
"costs", "costs",
"export", "export",
"rescuer",
] ]
MIDDLEWARE = [ MIDDLEWARE = [

View file

@ -9,7 +9,6 @@ urlpatterns = [
path("bird/", include("bird.urls")), path("bird/", include("bird.urls")),
path("costs/", include("costs.urls")), path("costs/", include("costs.urls")),
path("export/", include("export.urls")), path("export/", include("export.urls")),
path("rescuer/", include("rescuer.urls")),
# Admin # Admin
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
# Allauth # Allauth

View file

@ -1,4 +1,4 @@
# Generated by Django 4.2.5 on 2023-09-17 21:04 # Generated by Django 4.2.6 on 2023-10-09 21:31
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models

View file

@ -48,7 +48,6 @@ def export_birds(request):
"updated", "updated",
"find_circumstances__description", "find_circumstances__description",
"diagnostic_finding", "diagnostic_finding",
"rescuer__last_name",
"user__username", "user__username",
"status__description", "status__description",
"aviary__description", "aviary__description",
@ -69,7 +68,6 @@ def export_birds(request):
"Pateient aktualisiert am", "Pateient aktualisiert am",
"Fundumstände", "Fundumstände",
"Diagnose bei Fund", "Diagnose bei Fund",
"Finder (Nachname)",
"Benutzer", "Benutzer",
"Status", "Status",
"Voliere", "Voliere",

View file

@ -1,15 +0,0 @@
from django.contrib import admin
from .models import Rescuer
@admin.register(Rescuer)
class CustomerAdmin(admin.ModelAdmin):
list_display = [
"last_name",
"first_name",
"street",
"street_number",
"city",
"phone",
"user",
]

View file

@ -1,8 +0,0 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class RescuerConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "rescuer"
verbose_name = _("Finder")

View file

@ -1,31 +0,0 @@
from django import forms
from django.utils.translation import gettext_lazy as _
from .models import Rescuer
class DateInput(forms.DateInput):
input_type = "date"
class RescuerForm(forms.ModelForm):
class Meta:
model = Rescuer
fields = [
"first_name",
"last_name",
"street",
"street_number",
"zip_code",
"city",
"phone",
]
labels = {
"first_name": _("Vorname"),
"last_name": _("Nachname"),
"street": _("Straße"),
"street_number": _("Hausnummer"),
"zip_code": _("Postleitzahl"),
"city": _("Stadt"),
"phone": _("Telefon"),
}

View file

@ -1,59 +0,0 @@
# Generated by Django 4.2.3 on 2023-07-28 14:09
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Rescuer",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
(
"first_name",
models.CharField(max_length=200, verbose_name="Vorname"),
),
(
"last_name",
models.CharField(max_length=200, verbose_name="Nachname"),
),
("street", models.CharField(max_length=200, verbose_name="Straße")),
(
"street_number",
models.CharField(max_length=20, verbose_name="Nummer"),
),
("city", models.CharField(max_length=200, verbose_name="Stadt")),
("zip_code", models.CharField(max_length=200, verbose_name="PLZ")),
("phone", models.CharField(max_length=200, verbose_name="Telefon")),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"verbose_name": "Finder",
"verbose_name_plural": "Finder",
},
),
]

View file

@ -1,17 +0,0 @@
# Generated by Django 4.2.4 on 2023-08-12 12:57
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('rescuer', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='rescuer',
options={'ordering': ['last_name'], 'verbose_name': 'Finder', 'verbose_name_plural': 'Finder'},
),
]

View file

@ -1,26 +0,0 @@
from datetime import date
from uuid import uuid4
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
class Rescuer(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
first_name = models.CharField(max_length=200, verbose_name=_("Vorname"))
last_name = models.CharField(max_length=200, verbose_name=_("Nachname"))
street = models.CharField(max_length=200, verbose_name=_("Straße"))
street_number = models.CharField(max_length=20, verbose_name=_("Nummer"))
city = models.CharField(max_length=200, verbose_name=_("Stadt"))
zip_code = models.CharField(max_length=200, verbose_name=_("PLZ"))
phone = models.CharField(max_length=200, verbose_name=_("Telefon"))
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Meta:
verbose_name = _("Finder")
verbose_name_plural = _("Finder")
ordering = ["last_name"]
def __str__(self) -> str:
return self.first_name + " " + self.last_name

View file

@ -1,79 +0,0 @@
{% extends "base.html" %}
{% load static %}
{% block header %}
<!-- Datatable CSS -->
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.4/css/dataTables.bootstrap5.min.css"/>
<link rel="stylesheet" href="https://cdn.datatables.net/responsive/2.2.9/css/responsive.bootstrap5.min.css">
<!-- jQuery -->
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<!-- Datatable jQuery -->
<script src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.11.3/js/dataTables.bootstrap5.min.js"></script>
<script src="https://cdn.datatables.net/responsive/2.2.9/js/dataTables.responsive.min.js"></script>
<script src="https://cdn.datatables.net/responsive/2.2.9/js/responsive.bootstrap5.min.js"></script>
<script nonce="{{request.csp_nonce}}">
$(document).ready(function () {
let table = $('#t__rescuer_all').DataTable({
language: {
url: 'https://cdn.datatables.net/plug-ins/1.11.3/i18n/de_de.json',
},
paging: true,
info: true,
"pagingType": "first_last_numbers",
responsive: true,
scrollX: true,
columnDefs: [
{ responsivePriority: 1, targets: 0 },
]
});
table.on( 'responsive-display', function ( e, datatable, row, showHide, update ) {
table.rows().every( function () {
if (showHide && row.index() !== this.index() && this.child.isShown()) {
$('td', this.node()).eq(0).click();
}
});
});
})
</script>
{% endblock header %}
{% block content %}
<h3>Übersicht aller Finder</h3>
<p>
Die Übersicht aller aktiven Finder.
</p>
<p>
<a href="{% url 'rescuer_create' %}" class="btn btn-primary">Einen neuen Finder anlegen</a>
</p>
<table class="table table-striped table-hover display responsive nowrap" width="100%" id="t__rescuer_all">
<thead>
<tr>
<th>Nachname</th>
<th>Vorname</th>
<th>Straße</th>
<th>PLZ</th>
<th>Ort</th>
<th>Phone</th>
</tr>
</thead>
<tbody>
{% for rescuer in rescuers %}
<tr>
<td>
<a href="{% url 'rescuer_single' rescuer.id %}">{{ rescuer.last_name }}</a>
</td>
<td>{{ rescuer.first_name }}</td>
<td>{{ rescuer.street }} {{ rescuer.street_number }}</td>
<td>{{ rescuer.zip_code }}</td>
<td>{{ rescuer.city }}</td>
<td>{{ rescuer.phone }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock content %}

View file

@ -1,40 +0,0 @@
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<h4>Einen neuen Finder anlegen</h4>
<div class="row">
<div class="col-lg-6">
<form method="post" class="form-horizontal">
{% csrf_token %}
<div class="row">
<div class="col-md-12 col-lg-6">{{ form.first_name|as_crispy_field }}</div>
<div class="col-md-12 col-lg-6">{{ form.last_name|as_crispy_field }}</div>
<div class="col-md-12 col-lg-8">{{ form.street|as_crispy_field }}</div>
<div class="col-md-12 col-lg-4">{{ form.street_number|as_crispy_field }}</div>
<div class="col-md-12 col-lg-8">{{ form.city|as_crispy_field }}</div>
<div class="col-md-12 col-lg-4">{{ form.zip_code|as_crispy_field }}</div>
<div class="col-md-12 col-lg-6">{{ form.phone|as_crispy_field }}</div>
</div>
<a href="{% url 'bird_all' %}" class="btn btn-danger">Abbrechen</a>
<button class="btn btn-primary" type="submit">Speichern</button>
</form>
<div class="mt-3"><small>* Pflichtfeld</small></div>
</div>
<div class="col-lg-4">
<br />
<h4>Finder</h4>
<p>
Bitte alle Kontaktinformationen zum Finder notieren. Sollte es
Nachfragen für die Auswilderung oder Nachweispflichten gegenüber
der Naturschutzbehörde geben, werden diese Informationen benötigt.
</p>
<h4>Speicherung</h4>
<p>
Alle personenbezogenen Daten werden fünf Jahre gespeichert und
danach automatisch gelöscht.
</p>
</div>
</div>
{% endblock content %}

View file

@ -1,25 +0,0 @@
{% extends 'base.html' %}
{% block content %}
<h1>Finder löschen</h1>
<div class="row mt-3">
<div class="col-lg-7">
<form method="post">
{% csrf_token %}
<div class="alert alert-dismissible alert-danger">
<h4 class="alert-heading">Warnung!</h4>
<p class="mb-0">Wollen Sie den Finder <strong>{{rescuer.first_name}} {{rescuer.last_name}}</strong> löschen?</p>
</div>
</p>
<a href="{% url 'rescuer_all'%}" class="btn btn-secondary">Abbrechen</a>
<button class="btn btn-danger" type="submit">Löschen</button>
</form>
</div>
<div class="col-lg-5">
<h5>Finder löschen</h5>
<p>
Finder dürfen nur in vorheriger Absprache mit dem Fachgruppenleiter und dem Admin gelöscht werden.
</p>
</div>
</div>
{% endblock content %}

View file

@ -1,32 +0,0 @@
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="row">
<div class="col-lg-7">
<h3>Adressänderung des Finders</h3>
<form method="post" class="form-horizontal">
<fieldset>
{% csrf_token %}
<div class="row">
<div class="col-6">{{ form.first_name|as_crispy_field }}</div>
<div class="col-6">{{ form.last_name|as_crispy_field }}</div>
<div class="col-8">{{ form.street|as_crispy_field }}</div>
<div class="col-4">{{ form.street_number|as_crispy_field }}</div>
<div class="col-8">{{ form.city|as_crispy_field }}</div>
<div class="col-4">{{ form.zip_code|as_crispy_field }}</div>
<div class="col-6">{{ form.phone|as_crispy_field }}</div>
</div>
<a href="{% url 'rescuer_all' %}" class="btn btn-secondary">Abbrechen</a>
<button class="btn btn-primary" type="submit">Speichern</button>
</fieldset>
</form>
</div>
<div class="col-lg-5">
<h4>Finder</h4>
<p>
Bitte alle Kontaktinformationen zum Finder notieren. Sollte es Nachfragen für die Auswilderung oder Nachweispflichten gegenüber der Naturschutzbehörde geben, werden diese Informationen benötigt.
</p>
</div>
</div>
{% endblock content %}

View file

@ -1,51 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<h3>Stammdaten des Finders</h3>
<div class="row">
<div class="col-lg-6 mt-3 mb-3">
<div class="card bg-light mb-3" style="max-width: 32rem;">
<div class="card-header">Adressdaten des Finders</div>
<div class="card-body">
<h4 class="card-title">{{rescuer.first_name}} {{rescuer.last_name}}</h4>
<p class="card-text">
<strong>Straße:</strong> {{rescuer.street}} {{rescuer.street_number}}<br>
<strong>Stadt:</strong> {{rescuer.city}}<br>
<strong>PLZ:</strong> {{rescuer.zip_code}}<br>
<strong>Phone:</strong> {{rescuer.phone}}<br>
</p>
</div>
</div>
<a href="{% url 'rescuer_all' %}" class="btn btn-success">Abbrechen</a>
<a href="{% url 'rescuer_delete' rescuer.id %}" class="btn btn-danger">Löschen</a>
<a href="{% url 'rescuer_edit' rescuer.id %}" class="btn btn-primary">Bearbeiten</a>
</div>
<div class="col-lg-4">
<h4>
Patienten des Finders
</h4>
<p>Hier finden Sie die Patienten, die der Finder zur Auffangstation gebracht hat.</p>
<p>
{% for bird in birds %}
<div class="card bg-light mb-3" style="max-width: 30rem;">
<div class="card-header"><h5 class="card-title">Patient: {{bird.bird_identifier}}</h5></div>
<div class="card-body">
<p class="card-text">
<strong>Vogel:</strong> {{bird.bird}}<br>
<strong>gefunden am:</strong> {{bird.created}}<br>
<strong>Statusänderung am:</strong> {{bird.updated}}<br>
<strong>Fundumstände:</strong> {{bird.find_circumstances}}<br>
<strong>Diagnose:</strong> {{bird.diagnostic_finding}}<br>
</p>
</div>
</div>
{% endfor %}
</p>
</div>
</div>
{% endblock content %}

View file

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View file

@ -1,17 +0,0 @@
from django.urls import path
from .views import (
rescuer_all,
rescuer_create,
rescuer_single,
rescuer_delete,
rescuer_edit,
)
urlpatterns = [
path("all", rescuer_all, name="rescuer_all"),
path("create", rescuer_create, name="rescuer_create"),
path("edit/<id>", rescuer_edit, name="rescuer_edit"),
path("delete/<id>", rescuer_delete, name="rescuer_delete"),
path("<id>", rescuer_single, name="rescuer_single"),
]

View file

@ -1,64 +0,0 @@
from bird.models import FallenBird
from django.contrib.auth.decorators import login_required
from django.db.models import Q
from django.shortcuts import redirect, render
from .forms import RescuerForm
from .models import Rescuer
@login_required(login_url="account_login")
def rescuer_all(request):
rescuers = Rescuer.objects.all()
context = {"rescuers": rescuers}
return render(request, "rescuer/rescuer_all.html", context)
@login_required(login_url="account_login")
def rescuer_single(request, id):
rescuer = Rescuer.objects.get(id=id)
birds = FallenBird.objects.filter(rescuer=id).filter(Q(status="1") | Q(status="2"))
context = {"rescuer": rescuer, "birds": birds}
return render(request, "rescuer/rescuer_single.html", context)
@login_required(login_url="account_login")
def rescuer_create(request):
form = RescuerForm()
if request.method == "POST":
form = RescuerForm(request.POST or None)
if form.is_valid():
fs = form.save(commit=False)
fs.user = request.user
fs.save()
# set customer id in session cookie
# (uuid has to be cast to a string)
rescuer_id = str(fs.pk)
request.session["rescuer_id"] = rescuer_id
return redirect("bird_create")
context = {"form": form}
return render(request, "rescuer/rescuer_create.html", context)
@login_required(login_url="account_login")
def rescuer_delete(request, id):
rescuer = Rescuer.objects.get(id=id)
if request.method == "POST":
rescuer.delete()
return redirect("rescuer_all")
context = {"rescuer": rescuer}
return render(request, "rescuer/rescuer_delete.html", context)
@login_required(login_url="account_login")
def rescuer_edit(request, id):
rescuer = Rescuer.objects.get(id=id)
form = RescuerForm(request.POST or None, instance=rescuer)
if request.method == "POST":
if form.is_valid():
form.save()
return redirect("rescuer_all")
context = {"form": form}
return render(request, "rescuer/rescuer_edit.html", context)

View file

@ -5,7 +5,7 @@
<nav class="navbar navbar-expand-lg navbar-dark bg-primary sticky-top"> <nav class="navbar navbar-expand-lg navbar-dark bg-primary sticky-top">
<div class="container-lg"> <div class="container-lg">
<a class="navbar-brand" href="{% url 'index' %}"> <a class="navbar-brand" href="{% url 'bird_all' %}">
<img src="{% static 'img/favicon/l.png' %}" alt="logo" width="35" height="35" /> <img src="{% static 'img/favicon/l.png' %}" alt="logo" width="35" height="35" />
</a> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor01" <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor01"
@ -21,8 +21,8 @@
href="{% url 'bird_all' %}">alle Patienten</a> href="{% url 'bird_all' %}">alle Patienten</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if '/rescuer/all' in request.path %} active {% endif %}" <a class="nav-link {% if '/bird/create/' in request.path %} active {% endif %}"
href="{% url 'rescuer_all' %}">alle Finder</a> href="{% url 'bird_create' %}">neuer Patient</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {% if '/aviary/all' in request.path %} active {% endif %}" <a class="nav-link {% if '/aviary/all' in request.path %} active {% endif %}"