renamed fbf app to bird

This commit is contained in:
gw3000 2023-06-22 17:28:44 +02:00
parent 7724148dfc
commit 2d75a02c6e
19 changed files with 12 additions and 13 deletions

0
bird/__init__.py Normal file
View file

20
bird/admin.py Normal file
View file

@ -0,0 +1,20 @@
from django.contrib import admin
from .models import Bird, FallenBird
@admin.register(FallenBird)
class ContractAdmin(admin.ModelAdmin):
list_display = [
"bird",
"date_found",
"place",
"created",
"updated",
"user"]
list_filter = ("bird", "created", "user")
@admin.register(Bird)
class ContractAdmin(admin.ModelAdmin):
list_display = ["name"]

6
bird/apps.py Normal file
View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class BirdConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'bird'

36
bird/forms.py Normal file
View file

@ -0,0 +1,36 @@
from django import forms
from django.utils.translation import gettext_lazy as _
from .models import FallenBird
class DateInput(forms.DateInput):
input_type = "date"
class BirdAddForm(forms.ModelForm):
class Meta:
widgets = {
"date_found": DateInput()}
model = FallenBird
fields = ["bird", "date_found", "place", ]
labels = {"bird": _("Vogel"), "date_found": _(
"Datum des Fundes"), "place": _("Fundort")}
class BirdEditForm(forms.ModelForm):
class Meta:
widgets = {"date_found": DateInput(format="%Y-%m-%d")}
model = FallenBird
fields = [
"bird",
"date_found",
"place",
"rescuer",
]
labels = {
"bird": _("Vogel"),
"date_found": _("Datum des Fundes"),
"place": _("Fundort"),
"rescuer": _("Retter"),
}

View file

@ -0,0 +1,72 @@
# Generated by Django 4.2.2 on 2023-06-22 15:25
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 = [
("rescuer", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Bird",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("name", models.CharField(max_length=256)),
],
),
migrations.CreateModel(
name="FallenBird",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("date_found", models.DateField()),
("place", models.CharField(max_length=256)),
("created", models.DateTimeField(auto_now_add=True)),
("updated", models.DateTimeField(auto_now=True)),
(
"bird",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="bird.bird"
),
),
(
"rescuer",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="rescuer.rescuer",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]

View file

30
bird/models.py Normal file
View file

@ -0,0 +1,30 @@
from uuid import uuid4
from django.conf import settings
from django.db import models
from rescuer.models import Rescuer
class FallenBird(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
bird = models.ForeignKey("Bird", on_delete=models.CASCADE)
date_found = models.DateField()
place = models.CharField(max_length=256)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
rescuer = models.ForeignKey(Rescuer, on_delete=models.CASCADE)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
def __str__(self):
return self.place
class Bird(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
name = models.CharField(max_length=256)
def __str__(self):
return self.name

View file

@ -0,0 +1,71 @@
{% extends "base.html" %}
{% load static %}
{% block content %}
<h3>Übersicht aller Patienten in Behandlung</h3>
<p>
Die Übersicht aller in Behandlung befindlichen Vögel umfasst <strong>nicht</strong> die entlassenen Patienten.
</p>
<p>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addPatientModal">einen Patienten
anlegen
</button>
</p>
<table class="table table-striped table-hover" id="t__bids_all">
<thead>
<tr>
<th>Vogel</th>
<th>Retter</th>
<th>Fundort</th>
<th>gefunden am</th>
</tr>
</thead>
<tbody>
{% for bird in birds %}
<tr>
<td>
<a href="{% url 'bird_single' bird.id %}">{{ bird.bird }}</a>
</td>
<td>
<a href="{% url 'rescuer_single' bird.rescuer_id %}">{{ bird.rescuer }}</a>
</td>
<td>{{ bird.place }}</td>
<td>{{ bird.date_found }}</td>
</tr>
{% endfor %}
</tbody>
</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) Retter 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>
Retter aus oder legen Sie einen <strong>neuen</strong> Retter an:</label>
<select id="rescuer" class="form-select" name="rescuer_id">
{% for rescuer in rescuer_modal %}
<option value={{rescuer.id}}>
{{rescuer.first_name}} {{rescuer.last_name}},
{{rescuer.street}} {{rescuer.street_number}},
{{rescuer.city}}
</option>
{% endfor %}
<option value="new_rescuer"><strong>neuen
Retter anlegen</strong></option>
</select>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-bs-dismiss="modal">Abbruch</button>
<button class="btn btn-primary" type="submit">Übernehmen und weiter</button>
</div>
</div>
</div>
</div>
</form>
{% endblock content %}

View file

@ -0,0 +1,45 @@
{% extends "base.html" %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<h3>Patient anlegen</h3>
<p>(Retter: {{rescuer.first_name}} {{rescuer.last_name}})</p>
<div class="row">
<div class="col-lg-8 mb-3">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<a href="{% url 'bird_all' %}" class="btn btn-danger">Abbruch</a>
<button class="btn btn-primary" type="submit">Patient anlegen</button>
<div class="mt-3"><small>* Pflichtfeld</small></div>
</form>
</div>
<div class="col-lg-4">
<h4>eins</h4>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Facilis illum
quos eveniet obcaecati, adipisci voluptate alias iste ipsa blanditiis
earum veritatis provident modi repellendus ut maxime iusto enim distinctio
voluptatum.
</p>
<h4>zwei</h4>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Facilis illum
quos eveniet obcaecati, adipisci voluptate alias iste ipsa blanditiis
earum veritatis provident modi repellendus ut maxime iusto enim distinctio
voluptatum.
</p>
<h4>drei</h4>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Facilis illum
quos eveniet obcaecati, adipisci voluptate alias iste ipsa blanditiis
earum veritatis provident modi repellendus ut maxime iusto enim distinctio
voluptatum.
</p>
</div>
</div>
{% endblock content %}

View file

@ -0,0 +1,26 @@
{% extends 'base.html' %}
{% block content %}
<h3>Patient löschen</h3>
<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 Vogel <strong>{{bird.bird}}</strong>
Reg-Num.: <strong>{{bird.id}}</strong> löschen?</p>
</div>
</p>
<a href="{% url 'bird_all'%}" class="btn btn-secondary">Abbruch</a>
<button class="btn btn-danger" type="submit">Löschen</button>
</form>
</div>
<div class="col-lg-5">
<h5>Vogel löschen</h5>
<p>
Hinweis zum Löschen eines Vogels!
</p>
</div>
</div>
{% endblock content %}

View file

@ -0,0 +1,18 @@
{% extends "base.html" %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<h3>Patient {{ bird.bird }} bearbeiten</h3>
<div class="row">
<div class="col-lg-6 mb-3">
<form method="post" enctype="multipart/form-data">
<fieldset>
{% csrf_token %}
{{form|crispy}}
<button class="btn btn-success" type="abbort">Abbrechen</button>
<a href="{% url 'bird_delete' bird.id %}" class="btn btn-danger">Löschen</a>
<button class="btn btn-primary" type="submit">Speichern und zur Übersicht</button>
</fieldset>
</form>
</div>
{% endblock content %}

3
bird/tests.py Normal file
View file

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

19
bird/urls.py Normal file
View file

@ -0,0 +1,19 @@
from django.urls import path
from .views import (
bird_all,
bird_create,
bird_delete,
bird_recover,
bird_recover_all,
bird_single,
)
urlpatterns = [
path("all/", bird_all, name="bird_all"),
path("create/", bird_create, name="bird_create"),
path("delete/<id>", bird_delete, name="bird_delete"),
path("recover/<id>", bird_recover, name="bird_recover"),
path("recover/all", bird_recover_all, name="bird_recover_all"),
path("<id>/", bird_single, name="bird_single"),
]

81
bird/views.py Normal file
View file

@ -0,0 +1,81 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import HttpResponse, redirect, render
from .forms import BirdAddForm, BirdEditForm
from .models import FallenBird
from rescuer.models import Rescuer
@login_required(login_url="account_login")
def bird_create(request):
# Rescuer for modal usage
form = BirdAddForm()
rescuer_id = request.session.get("rescuer_id")
rescuer = Rescuer.objects.get(id=rescuer_id, user=request.user)
# just show only related rescuers in select field of the form
if request.method == "POST":
form = BirdAddForm(request.POST or None, request.FILES or None)
rescuer_id = request.session.get('rescuer_id')
rescuer = Rescuer.objects.get(id=rescuer_id, user=request.user)
if form.is_valid():
fs = form.save(commit=False)
fs.user = request.user
fs.rescuer_id = rescuer_id
fs.save()
request.session["rescuer_id"] = None
return redirect("bird_all")
context = {"form": form, "rescuer": rescuer}
return render(request, "bird/bird_create.html", context)
@login_required(login_url="account_login")
def bird_all(request):
birds = FallenBird.objects.all()
rescuer_modal = Rescuer.objects.all()
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)
@login_required(login_url="account_login")
def bird_recover_all(request):
return HttpResponse("Show all recovered Birds")
@login_required(login_url="account_login")
def bird_single(request, id):
bird = FallenBird.objects.get(id=id)
form = BirdEditForm(
request.POST or None,
request.FILES or None,
instance=bird)
if request.method == "POST":
if form.is_valid():
form.save()
return redirect("bird_all")
context = {"form": form, "bird": bird}
return render(request, "bird/bird_single.html", context)
@login_required(login_url="account_login")
def bird_delete(request, id):
bird = FallenBird.objects.get(id=id)
if request.method == "POST":
bird.delete()
return redirect("bird_all")
context = {"bird": bird}
return render(request, "bird/bird_delete.html", context)
@login_required(login_url="account_login")
def bird_recover(request, id):
return HttpResponse(f"Show recover with ID {id}")