jazzmin as a more beauty admin panel
This commit is contained in:
parent
8ea5c87c9c
commit
aca1c3c3fa
117 changed files with 4 additions and 0 deletions
0
app/rescuer/__init__.py
Normal file
0
app/rescuer/__init__.py
Normal file
17
app/rescuer/admin.py
Normal file
17
app/rescuer/admin.py
Normal 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
10
app/rescuer/apps.py
Normal 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
31
app/rescuer/forms.py
Normal 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"),
|
||||
}
|
46
app/rescuer/migrations/0001_initial.py
Normal file
46
app/rescuer/migrations/0001_initial.py
Normal 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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
0
app/rescuer/migrations/__init__.py
Normal file
0
app/rescuer/migrations/__init__.py
Normal file
20
app/rescuer/models.py
Normal file
20
app/rescuer/models.py
Normal 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
|
70
app/rescuer/templates/rescuer/rescuer_all.html
Normal file
70
app/rescuer/templates/rescuer/rescuer_all.html
Normal 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 %}
|
52
app/rescuer/templates/rescuer/rescuer_create.html
Normal file
52
app/rescuer/templates/rescuer/rescuer_create.html
Normal 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 %}
|
28
app/rescuer/templates/rescuer/rescuer_delete.html
Normal file
28
app/rescuer/templates/rescuer/rescuer_delete.html
Normal 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 %}
|
40
app/rescuer/templates/rescuer/rescuer_edit.html
Normal file
40
app/rescuer/templates/rescuer/rescuer_edit.html
Normal 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 %}
|
38
app/rescuer/templates/rescuer/rescuer_single.html
Normal file
38
app/rescuer/templates/rescuer/rescuer_single.html
Normal 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
3
app/rescuer/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
17
app/rescuer/urls.py
Normal file
17
app/rescuer/urls.py
Normal 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
61
app/rescuer/views.py
Normal 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)
|
Loading…
Add table
Add a link
Reference in a new issue