renamed fbf app to bird
This commit is contained in:
parent
7724148dfc
commit
2d75a02c6e
19 changed files with 12 additions and 13 deletions
0
bird/__init__.py
Normal file
0
bird/__init__.py
Normal file
20
bird/admin.py
Normal file
20
bird/admin.py
Normal 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
6
bird/apps.py
Normal 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
36
bird/forms.py
Normal 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"),
|
||||
}
|
72
bird/migrations/0001_initial.py
Normal file
72
bird/migrations/0001_initial.py
Normal 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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
0
bird/migrations/__init__.py
Normal file
0
bird/migrations/__init__.py
Normal file
30
bird/models.py
Normal file
30
bird/models.py
Normal 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
|
71
bird/templates/bird/bird_all.html
Normal file
71
bird/templates/bird/bird_all.html
Normal 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 %}
|
45
bird/templates/bird/bird_create.html
Normal file
45
bird/templates/bird/bird_create.html
Normal 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 %}
|
26
bird/templates/bird/bird_delete.html
Normal file
26
bird/templates/bird/bird_delete.html
Normal 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 %}
|
18
bird/templates/bird/bird_single.html
Normal file
18
bird/templates/bird/bird_single.html
Normal 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
3
bird/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
19
bird/urls.py
Normal file
19
bird/urls.py
Normal 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
81
bird/views.py
Normal 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}")
|
Loading…
Add table
Add a link
Reference in a new issue