jazzmin as a more beauty admin panel

This commit is contained in:
gw3000 2023-07-11 18:04:19 +02:00
parent 8ea5c87c9c
commit aca1c3c3fa
117 changed files with 4 additions and 0 deletions

0
app/rescuer/__init__.py Normal file
View file

17
app/rescuer/admin.py Normal file
View file

@ -0,0 +1,17 @@
from django.contrib import admin
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",
]

10
app/rescuer/apps.py Normal file
View file

@ -0,0 +1,10 @@
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")

31
app/rescuer/forms.py Normal file
View file

@ -0,0 +1,31 @@
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

@ -0,0 +1,46 @@
# Generated by Django 4.2.2 on 2023-07-08 20:30
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)),
("last_name", models.CharField(max_length=200)),
("street", models.CharField(max_length=200)),
("street_number", models.CharField(max_length=20)),
("city", models.CharField(max_length=200)),
("zip_code", models.CharField(max_length=200)),
("phone", models.CharField(max_length=200)),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]

View file

20
app/rescuer/models.py Normal file
View file

@ -0,0 +1,20 @@
from datetime import date
from uuid import uuid4
from django.conf import settings
from django.db import models
class Rescuer(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
street = models.CharField(max_length=200)
street_number = models.CharField(max_length=20)
city = models.CharField(max_length=200)
zip_code = models.CharField(max_length=200)
phone = models.CharField(max_length=200)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
def __str__(self) -> str:
return self.first_name + " " + self.last_name

View file

@ -0,0 +1,70 @@
{% 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>
$(document).ready(function () {
$('#t__rescuer_all').DataTable({
language: {
url: 'https://cdn.datatables.net/plug-ins/1.11.3/i18n/de_de.json',
},
paging: false,
info: false,
responsive: true,
columnDefs: [
{ responsivePriority: 1, targets: 0 },
]
})
})
</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>Name</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

@ -0,0 +1,52 @@
{% 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">Abbruch</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>eins</h4>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error nobis
necessitatibus distinctio pariatur vero sequi eum excepturi assumenda quam
maxime doloremque eligendi perspiciatis id aliquid, voluptate blanditiis
consequatur enim deleniti.
</p>
<h4>zwei</h4>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error nobis
necessitatibus distinctio pariatur vero sequi eum excepturi assumenda quam
maxime doloremque eligendi perspiciatis id aliquid, voluptate blanditiis
consequatur enim deleniti.
</p>
<h4>drei</h4>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error nobis
necessitatibus distinctio pariatur vero sequi eum excepturi assumenda quam
maxime doloremque eligendi perspiciatis id aliquid, voluptate blanditiis
consequatur enim deleniti.
</p>
</div>
</div>
{% endblock content %}

View file

@ -0,0 +1,28 @@
{% 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">Abbruch</a>
<button class="btn btn-danger" type="submit">Löschen</button>
</form>
</div>
<div class="col-lg-5">
<h5>Finder löschen</h5>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Voluptates
ducimus inventore quia, quae quam reiciendis eligendi explicabo non
deleniti aliquid, modi dignissimos ullam ipsa incidunt vel similique fuga?
Suscipit, dolores?
</p>
</div>
</div>
{% endblock content %}

View file

@ -0,0 +1,40 @@
{% 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-6">{{ form.phone|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>
<a href="{% url 'rescuer_all' %}" class="btn btn-secondary">Abbruch</a>
<button class="btn btn-primary" type="submit">Speichern</button>
</fieldset>
</form>
</div>
<div class="col-lg-5">
<h4>Eins</h4>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Provident rem voluptates, facere voluptatum laudantium
voluptate possimus porro. Ab veritatis impedit esse architecto sit dolores, tempore officia! Nemo magni voluptate
officiis?</p>
<h4>Zwei</h4>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Provident rem voluptates, facere voluptatum laudantium
voluptate possimus porro. Ab veritatis impedit esse architecto sit dolores, tempore officia! Nemo magni voluptate
officiis?</p>
<h4>Drei</h4>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Provident rem voluptates, facere voluptatum laudantium
voluptate possimus porro. Ab veritatis impedit esse architecto sit dolores, tempore officia! Nemo magni voluptate
officiis?</p>
</div>
</div>
{% endblock content %}

View file

@ -0,0 +1,38 @@
{% extends 'base.html' %}
{% block content %}
<div class="row">
<div class="col-lg-6">
<h3>Stammdaten des Finders</h3>
<div class="card bg-light mb-3" style="max-width: 30rem;">
<div class="card-header">Adressdaten</div>
<div class="card-body">
<h4 class="card-title">{{rescuer.first_name}} {{rescuer.last_name}}</h4>
<p class="card-text">
{{rescuer.city}} {{rescuer.street}}<br>
{{rescuer.zip_code}}<br>
{{rescuer.phone}}<br>
</p>
</div>
</div>
<a href="{% url 'rescuer_all' %}" class="btn btn-success">zurück zur Übersicht</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-6">
<h4>eins</h4>
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Officia tempore voluptatibus voluptatum possimus in
iusto exercitationem perspiciatis eaque harum, nihil, praesentium debitis nisi unde eligendi, qui sapiente
odit expedita aut.</p>
<h4>zwei</h4>
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Officia tempore voluptatibus voluptatum possimus in
iusto exercitationem perspiciatis eaque harum, nihil, praesentium debitis nisi unde eligendi, qui sapiente
odit expedita aut.</p>
</div>
</div>
{% endblock content %}

3
app/rescuer/tests.py Normal file
View file

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

17
app/rescuer/urls.py Normal file
View file

@ -0,0 +1,17 @@
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"),
]

61
app/rescuer/views.py Normal file
View file

@ -0,0 +1,61 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
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)
context = {"rescuer": rescuer}
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)