random all commit

This commit is contained in:
moanos [he/him] 2024-05-10 13:54:16 +02:00
parent ba7e229ab2
commit e2e3a77fd9
6 changed files with 220 additions and 42 deletions

View File

@ -13,7 +13,7 @@ authors = [
maintainers = [
{name = "moanos", email = "julian-samuel@gebuehr.net"},
]
keywords = ["matrix", "registration", "bot", "user", "registration", "API" ]
keywords = ["animal", "adoption", "django", "rescue", ]
license = {text = "AGPL-3.0-or-later"}
classifiers = [
"Environment :: Web",

View File

@ -1,9 +1,13 @@
import datetime
from django import forms
from .models import AdoptionNotice, Animal, Image, Report, ModerationAction, User
from .models import AdoptionNotice, Animal, Image, Report, ModerationAction, User, Species
from django_registration.forms import RegistrationForm
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
from crispy_forms.layout import Submit, Layout, Fieldset, HTML, Row, Column, Field
from django.utils.translation import gettext_lazy as _
from notfellchen.settings import MEDIA_URL
class DateInput(forms.DateInput):
input_type = 'date'
@ -38,7 +42,116 @@ class AdoptionNoticeForm(forms.ModelForm):
}
class AnimalForm(forms.ModelForm):
class AnimalForm(forms.Form):
def __init__(self, animal_id, *args, **kwargs):
photo_rows = []
super().__init__(*args, **kwargs)
# Get the animal instance
animal = Animal.objects.get(pk=animal_id)
# Define Django form fields for later use
self.fields["name"] = forms.CharField(initial=animal.name)
self.fields["species"] = forms.ChoiceField(
label=_("Tierart"),
choices=[(x.id, x.name) for x in Species.objects.all()],
initial=animal.species.pk
)
photos = animal.get_photos()
for photo in photos:
alt_field_name = f"image_alt_{photo.pk}"
self.fields[alt_field_name] = forms.CharField()
self.fields[alt_field_name].initial = photo.alt_text
title_field_name = f"image_title_{photo.pk}"
self.fields[title_field_name] = forms.CharField(max_length=200)
self.fields[title_field_name].initial = photo.title
delete_btn = f"delete_photo_{photo.pk}"
save_btn = f"save_photo_{photo.pk}"
current_row = Row(
Column(title_field_name, css_class="form-group col-md-2 mb-0"),
Column(
HTML(photo.as_html),
css_class="form-group col-md-4 mb-0"),
Column(alt_field_name, css_class="form-group col-md-2 mb-0"),
Column(
Submit(delete_btn, _("Löschen")),
css_class="form-group col-md-auto mb-0 needs_manual",
),
Column(
Submit(save_btn, _("Bearbeiten")),
css_class="form-group col-md-auto mb-0 needs_manual",
),
css_class="form-row",
)
photo_rows.append(current_row)
self.helper = FormHelper()
self.helper.form_class = 'card'
submit_form_btn = f"submit_form_{animal.pk}"
self.helper.layout = Layout(
Fieldset(
animal.name,
Row(
Field("name", selected="", css_class="form-group col-md-6 mb-0"),
Field("species", css_class="form-group col-md-6 mb-0"),
Submit(submit_form_btn, _("Submit"),
css_class="form-group col-md-2 mb-0 needs_manual",
),
css_class="form-row",
)
)
)
self.helper.layout.append(Fieldset(_("Fotos"), css_class="fieldsets"))
for photo_row in photo_rows:
self.helper.layout[-1].append(photo_row)
current_row = Row(
HTML(
"<hr style='border: 0; clear:both; display:block; width: 96%; background-color:black; height: 1px;'>"
)
)
self.helper.layout.append(current_row)
# self.helper.layout.append('i_want_to_add_a_new_column')
self.fields["add_image"] = forms.ImageField()
self.fields["add_image_alt"] = forms.CharField()
self.fields["add_image_title"] = forms.CharField(max_length=200, )
current_row = Row(
Column("add_image", css_class="form-group col-md-6 mb-0"),
Column("add_image_alt", css_class="form-group col-md-2 mb-0"),
Column("add_image_title", css_class="form-group col-md-2 mb-0"),
css_class="form-row",
)
#self.helper.layout.append(current_row)
#add_photo_btn = f"add_photo_btn_{animal.pk}"
#self.helper.layout.append(Submit(add_photo_btn, _("Bild hinzufügen")))
class AnimalForm2(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'form-animal'
self.helper.form_class = 'card'
self.helper.form_method = 'post'
self.helper.add_input(Submit('submit', _('Submit')))
class Meta:
model = Animal
picture = forms.ImageField(label='Image', required=False)
@ -49,6 +162,13 @@ class AnimalForm(forms.ModelForm):
class ImageForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'form-animal-photo'
self.helper.form_class = 'card'
self.helper.form_method = 'post'
class Meta:
model = Image
fields = ('title', 'image', 'alt_text')

View File

@ -10,6 +10,7 @@ from django.contrib.auth.models import Group
from django.contrib.auth.models import AbstractUser
from fellchensammlung.tools import misc
from notfellchen.settings import MEDIA_URL
class Language(models.Model):
@ -41,6 +42,10 @@ class Image(models.Model):
def __str__(self):
return self.title
@property
def as_html(self):
return f'<img src="{ MEDIA_URL }/{ self.image }" alt="{ self.alt_text }">'
class Species(models.Model):
"""Model representing a species of animal."""

View File

@ -1,5 +1,6 @@
{% extends "fellchensammlung/base_generic.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block content %}
<h1>{% translate "Vermitteln" %}</h1>
@ -8,17 +9,5 @@
kannst
du im nächsten Schritt hochladen.
{% endblocktranslate %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-animal">
{{ form.as_p }}
</div>
<div class="form-image">
<h2>{% translate "Bild hinzufügen" %}</h2>
{{ image_form.as_p }}
</div>
<button name="button_add_another_animal"
type="submit">{% translate "Speichern und nächstes Tier hinzufügen" %}</button>
<button name="button_save_and_continue" type="submit">{% translate "Speichern und weiter" %}</button>
</form>
{% crispy form %}
{% endblock %}

View File

@ -11,19 +11,18 @@ urlpatterns = [
path("rss/", LatestAdoptionNoticesFeed(), name="rss"),
# ex: /animal/5/
path("<int:animal_id>/", views.animal_detail, name="animal-detail"),
# ex: /animal/5/edit
path("<int:animal_id>/edit", views.change_animal, name="animal-edit"),
# ex: /adoption_notice/7/
path("vermittlung/<int:adoption_notice_id>/", views.adoption_notice_detail, name="adoption-notice-detail"),
# ex: /adoption_notice/7/edit
path("vermittlung/<int:adoption_notice_id>/edit", views.change_animal, name="adoption-notice-edit"),
# ex: /search/
path("suchen/", views.search, name="search"),
# ex: /vermitteln/
path("vermitteln/", views.add_adoption, name="add-adoption"),
# ex: vermitteln-tiere-hinzufügen/5
path("vermitteln-tiere-hinzufügen/<int:adoption_notice_id>",
views.add_animal_to_adoption,
name="add-animal-to-adoption"),
path("ueber-uns/", views.about, name="about"),
#############

View File

@ -63,39 +63,104 @@ def add_adoption(request):
if form.is_valid():
instance = form.save()
return redirect(reverse("add-animal-to-adoption", args=[instance.pk]))
return redirect(reverse("adoption-notice-edit", args=[instance.pk]))
else:
form = AdoptionNoticeForm()
return render(request, 'fellchensammlung/forms/form_add_adoption.html', {'form': form})
@login_required
def add_animal_to_adoption(request, adoption_notice_id):
def edit_adoption_notice(request, animal_id):
"""
View implements the following methods
* Updating an AdoptionNotice
* Adding animals to an AN
"""
def delete_photo():
print("Photo deleted")
def save_photo():
print("Photo save")
def add_photo():
print("Photo added")
def save_animal():
print("Animal saved")
if request.method == 'POST':
form = AnimalForm(request.POST)
image_form = ImageForm(request.POST, request.FILES)
form = AnimalForm(request.POST, animal_id=animal_id, )
for key in request.POST:
if key.startswith("delete_photo_"):
action = delete_photo
if key.startswith("save_photo_"):
action = save_photo
if key.startswith("add_photo"):
action = add_photo
if key.startswith("save_animal"):
action = save_animal
pk = key.split("_")[-1]
action(animal_id, pk, form_data=request.POST)
if form.is_valid():
form.cleaned_data["adoption_notice_id"] = adoption_notice_id
instance = form.save(commit=False)
instance.adoption_notice_id = adoption_notice_id
animal = form.save()
return render(request, 'fellchensammlung/forms/form_add_animal_to_adoption.html',
{'form': form})
instance.save()
if 'image_-image' in request.FILES:
image = Image(image=request.FILES['image_-image'])
image.save()
instance.photos.add(image)
if "button_add_another_animal" in request.POST:
return redirect(reverse("add-animal-to-adoption", args=[str(adoption_notice_id)]))
else:
return redirect(reverse("adoption-notice-detail", args=[str(adoption_notice_id)]))
else:
form = AnimalForm()
form = AnimalForm(animal_id)
image_form = ImageForm(request.POST, request.FILES, prefix="image_")
return render(request, 'fellchensammlung/forms/form_add_animal_to_adoption.html',
{'form': form, "image_form": image_form})
{'form': form})
@login_required
def change_animal(request, animal_id):
"""
View implements the following methods
* Updating an Animal
* Adding photos to an animal
"""
def delete_photo():
print("Photo deleted")
def save_photo():
print("Photo save")
def add_photo():
print("Photo added")
def save_animal():
print("Animal saved")
if request.method == 'POST':
form = AnimalForm(request.POST, animal_id=animal_id, )
for key in request.POST:
if key.startswith("delete_photo_"):
action = delete_photo
if key.startswith("save_photo_"):
action = save_photo
if key.startswith("add_photo"):
action = add_photo
if key.startswith("save_animal"):
action = save_animal
pk = key.split("_")[-1]
action(animal_id, pk, form_data=request.POST)
return render(request, 'fellchensammlung/forms/form_add_animal_to_adoption.html',
{'form': form})
else:
form = AnimalForm(animal_id)
image_form = ImageForm(request.POST, request.FILES, prefix="image_")
return render(request, 'fellchensammlung/forms/form_add_animal_to_adoption.html',
{'form': form})
def about(request):