Allow staff to upload photos has another user.
All checks were successful
Docker / build (release) Successful in 9s

This commit is contained in:
krek0 2026-05-16 18:46:51 +02:00
parent b0027be96c
commit 15414d4d4d
3 changed files with 40 additions and 12 deletions

View file

@ -7,12 +7,15 @@ import datetime
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import Div, Layout, Submit from crispy_forms.layout import Div, Layout, Submit
from django import forms from django import forms
from django.contrib.auth import get_user_model
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_select2.forms import ModelSelect2MultipleWidget from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget
from .models import Gallery, Tag from .models import Gallery, Tag
User = get_user_model()
class MultipleFileInput(forms.ClearableFileInput): class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True allow_multiple_selected = True
@ -87,11 +90,27 @@ class UploadForm(forms.Form):
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
is_staff = kwargs.pop("is_staff", False)
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if is_staff:
self.fields["owner"] = forms.ModelChoiceField(
User.objects.all(),
label=_("Upload as"),
required=False,
empty_label=_("-- Myself --"),
widget=ModelSelect2Widget(
model=User,
search_fields=["username__icontains", "first_name__icontains", "last_name__icontains"],
attrs={
"data-minimum-input-length": 0,
"data-placeholder": "-- Myself --",
},
),
)
self.helper = FormHelper() self.helper = FormHelper()
self.helper.include_media = False self.helper.include_media = False
self.helper.use_custom_control = False self.helper.use_custom_control = False
self.helper.layout = Layout( layout_fields = [
"file_field", "file_field",
"gallery", "gallery",
"new_gallery_title", "new_gallery_title",
@ -102,8 +121,11 @@ class UploadForm(forms.Form):
), ),
"new_gallery_description", "new_gallery_description",
"new_gallery_tags", "new_gallery_tags",
Submit("submit", _("Upload"), css_class="btn btn-success mt-2"), ]
) if is_staff:
layout_fields.append("owner")
layout_fields.append(Submit("submit", _("Upload"), css_class="btn btn-success mt-2"))
self.helper.layout = Layout(*layout_fields)
def clean(self): def clean(self):
cleaned_data = super().clean() cleaned_data = super().clean()
@ -119,6 +141,9 @@ class UploadForm(forms.Form):
return cleaned_data return cleaned_data
def get_owner(self, fallback):
return self.cleaned_data.get("owner") or fallback
def get_or_create_gallery(self): def get_or_create_gallery(self):
""" """
Get or create gallery Get or create gallery

View file

@ -22,9 +22,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% trans "Drag and drop photos here" %} {% trans "Drag and drop photos here" %}
</div> </div>
{% crispy form %} {% crispy form %}
<p class="mt-3">
{% trans "Owner will be" %} <code>{{ request.user.get_full_name }} ({{ request.user.username}})</code>.
</p>
</form> </form>
</div> </div>
</div> </div>

View file

@ -299,15 +299,20 @@ class GalleryUpload(PermissionRequiredMixin, FormView):
success_url = reverse_lazy("photologue:pl-gallery-upload") success_url = reverse_lazy("photologue:pl-gallery-upload")
permission_required = "photologue.add_gallery" permission_required = "photologue.add_gallery"
def _upload_media(self, model, file_field, file_obj, gallery, gallery_dir, post_save=None): def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["is_staff"] = self.request.user.is_staff
return kwargs
def _upload_media(self, model, file_field, file_obj, gallery, gallery_dir, owner, post_save=None):
""" """
Create a media object, save it to the DB, schedule file save on commit. Create a media object, save it to the DB, schedule file save on commit.
Returns True if uploaded, False if already exists. Returns True if uploaded, False if already exists.
""" """
title = Path(file_obj.name).stem title = Path(file_obj.name).stem
if model.objects.filter(title=title, owner=self.request.user, galleries=gallery).exists(): if model.objects.filter(title=title, owner=owner, galleries=gallery).exists():
return False return False
obj = model(title=title, slug=unique_slug(model, title), owner=self.request.user) obj = model(title=title, slug=unique_slug(model, title), owner=owner)
file_path = str(gallery_dir / file_obj.name) file_path = str(gallery_dir / file_obj.name)
with transaction.atomic(): with transaction.atomic():
obj.save() obj.save()
@ -345,6 +350,7 @@ class GalleryUpload(PermissionRequiredMixin, FormView):
gallery_year = Path(str(gallery.date_start.year)) gallery_year = Path(str(gallery.date_start.year))
gallery_dir = gallery_year / gallery.slug gallery_dir = gallery_year / gallery.slug
owner = form.get_owner(self.request.user)
# Upload pictures and videos # Upload pictures and videos
uploaded_photo_name = [] uploaded_photo_name = []
@ -352,9 +358,9 @@ class GalleryUpload(PermissionRequiredMixin, FormView):
files = form.cleaned_data["file_field"] files = form.cleaned_data["file_field"]
for photo_file in files: for photo_file in files:
if is_photo(photo_file): if is_photo(photo_file):
uploaded = self._upload_media(Photo, "image", photo_file, gallery, gallery_dir) uploaded = self._upload_media(Photo, "image", photo_file, gallery, gallery_dir, owner)
elif is_video(photo_file): elif is_video(photo_file):
uploaded = self._upload_media(Video, "file", photo_file, gallery, gallery_dir, post_save=generate_video_thumbnail) uploaded = self._upload_media(Video, "file", photo_file, gallery, gallery_dir, owner, post_save=generate_video_thumbnail)
else: else:
messages.error(self.request, f"{photo_file.name} is not a recognized image or video") messages.error(self.request, f"{photo_file.name} is not a recognized image or video")
jsondata["code"] = 400 jsondata["code"] = 400