Skip to content
Snippets Groups Projects
Verified Commit 3cf81a21 authored by Tom Teichler's avatar Tom Teichler :beers:
Browse files

Add form to edit persons photo. Closes #269

parent da80a668
No related branches found
No related tags found
1 merge request!329WIP: Resolve "Photo cropping broken"
Pipeline #4089 failed
......@@ -7,6 +7,7 @@ from django.utils.translation import gettext_lazy as _
from django_select2.forms import ModelSelect2MultipleWidget, Select2Widget
from dynamic_preferences.forms import PreferenceForm
from image_cropping import ImageCropWidget
from material import Fieldset, Layout, Row
from .mixins import ExtensibleForm, SchoolTermRelatedExtensibleForm
......@@ -309,3 +310,13 @@ class SchoolTermForm(ExtensibleForm):
class Meta:
model = SchoolTerm
exclude = []
class EditPersonPhotoForm(ExtensibleForm):
"""Form to edit a persons photo."""
class Meta:
model = Person
fields = ["photo"]
widgets = {
'photo': ImageCropWidget,
}
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load i18n %}
{% block extra_head %}
{{ photo_form.media }}
{% endblock %}
{% block browser_title %}{% blocktrans %}Edit photo{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Edit photo{% endblocktrans %}{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ photo_form }}
{% include "core/partials/save_button.html" %}
</form>
{% endblock %}
......@@ -22,6 +22,10 @@
<i class="material-icons left">edit</i>
{% trans "Edit" %}
</a>
<a href="{% url 'edit_person_photo_by_id' person.id %}" class="btn waves-effect waves-light">
<i class="material-icons left">insert_photo</i>
{% trans "Edit photo" %}
</a>
{% endif %}
{% if can_delete_person %}
......
......@@ -32,6 +32,7 @@ urlpatterns = [
path("person/create", views.edit_person, name="create_person"),
path("person/<int:id_>", views.person, name="person_by_id"),
path("person/<int:id_>/edit", views.edit_person, name="edit_person_by_id"),
path("person/<int:id_>/photo/edit", views.edit_person_photo, name="edit_person_photo_by_id"),
path("person/<int:id_>/delete", views.delete_person, name="delete_person_by_id"),
path("groups", views.groups, name="groups"),
path("groups/additional_fields", views.additional_fields, name="additional_fields"),
......
......@@ -678,3 +678,25 @@ def delete_group_type(request: HttpRequest, id_: int) -> HttpResponse:
messages.success(request, _("The group type has been deleted."))
return redirect("group_types")
@permission_required("core.edit_person", fn=objectgetter_optional(Person))
def edit_person_photo(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
"""Edit view for a single person, defaulting to logged-in person."""
context = {}
person = get_object_or_404(Person, id_)
context["person"] = person
# Edit form for existing group
edit_person_photo_form = EditPersonPhotoForm(
request.POST or None, request.FILES or None, instance=person
)
if request.method == "POST":
if edit_person_photo_form.is_valid():
with reversion.create_revision():
edit_person_photo_form.save(commit=True)
messages.success(request, _("The person has been saved."))
context["edit_person_photo_form"] = edit_person_photo_form
return render(request, "core/person/edit_photo.html", context)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment