Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion demo/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@
'galleryfield',
'sorl.thumbnail',
'demo',
'demo_custom'
'demo_custom',
'demo_multiple_fields_1_model'
]

MIDDLEWARE = [
Expand Down
5 changes: 4 additions & 1 deletion demo/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
path('admin/', admin.site.urls),
]

urlpatterns += [path(r"custom/", include("demo_custom.urls"))]
urlpatterns += [
path(r"custom/", include("demo_custom.urls")),
path(r"multifields/", include("demo_multiple_fields_1_model.urls")),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Empty file.
19 changes: 19 additions & 0 deletions demo_multiple_fields_1_model/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from demo_multiple_fields_1_model.models import MyGallery
from django import forms
from django.contrib import admin

from galleryfield.mixins import GalleryFormMediaMixin


class MyGalleryAdminForm(GalleryFormMediaMixin, forms.ModelForm):
class Meta:
model = MyGallery
exclude = ()


class MyGalleryAdmin(admin.ModelAdmin):
form = MyGalleryAdminForm


admin.site.register(MyGallery, MyGalleryAdmin)

9 changes: 9 additions & 0 deletions demo_multiple_fields_1_model/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.apps import AppConfig


class DemoMultipleConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'demo_multiple_fields_1_model'

def ready(self):
import demo_multiple_fields_1_model.receivers # noqa
Empty file.
78 changes: 78 additions & 0 deletions demo_multiple_fields_1_model/image_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
from django.core.exceptions import PermissionDenied

from galleryfield.image_views import (ImageCreateView, ImageCropView,
ImageListView)


class MyImage1CreateView(ImageCreateView):
target_model = "demo_multiple_fields_1_model.MyImage1"
disable_server_side_crop = False

def create_instance_from_form(self, form):
self.object = form.save(commit=False)
self.object.creator = self.request.user
self.object.save()


class MyImage1ListView(ImageListView):
target_model = "demo_multiple_fields_1_model.MyImage1"
disable_server_side_crop = False

def get_queryset(self):
queryset = super().get_queryset()
if not self.request.user.is_superuser:
queryset = queryset.filter(creator=self.request.user)
return queryset


class MyImage1CropView(ImageCropView):
target_model = "demo_multiple_fields_1_model.MyImage1"
disable_server_side_crop = False

def get_object(self, queryset=None):
obj = super().get_object(queryset=None)
if not self.request.user.is_superuser and obj.creator != self.request.user:
raise PermissionDenied("May not crop other user's image")
return obj

def create_cropped_instance_from_form(self, form):
# we don't need to set self.object.creator here because
# it's copied from the original instance.
self.object = form.save()


class MyImage2CreateView(ImageCreateView):
target_model = "demo_multiple_fields_1_model.MyImage2"
disable_server_side_crop = False

def create_instance_from_form(self, form):
self.object = form.save(commit=False)
self.object.creator = self.request.user
self.object.save()


class MyImage2ListView(ImageListView):
target_model = "demo_multiple_fields_1_model.MyImage2"
disable_server_side_crop = False

def get_queryset(self):
queryset = super().get_queryset()
if not self.request.user.is_superuser:
queryset = queryset.filter(creator=self.request.user)
return queryset


class MyImage2CropView(ImageCropView):
target_model = "demo_multiple_fields_1_model.MyImage2"
disable_server_side_crop = False

def get_object(self, queryset=None):
obj = super().get_object(queryset=None)
if not self.request.user.is_superuser and obj.creator != self.request.user:
raise PermissionDenied("May not crop other user's image")
return obj

def create_cropped_instance_from_form(self, form):
# we don't need to set self.object.creator here because
# it's copied from the original instance.
self.object = form.save()
43 changes: 43 additions & 0 deletions demo_multiple_fields_1_model/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Generated by Django 4.0.6 on 2024-04-22 03:51

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models

import galleryfield.fields


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='MyImage2',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('photo2', models.ImageField(upload_to='my_images2', verbose_name='Image2')),
],
),
migrations.CreateModel(
name='MyImage1',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('photo1', models.ImageField(upload_to='my_images1', verbose_name='Image1')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Creator')),
],
),
migrations.CreateModel(
name='MyGallery',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('album1', galleryfield.fields.GalleryField(target_model='demo_multiple_fields_1_model.MyImage1', verbose_name='My photos')),
('album2', galleryfield.fields.GalleryField(target_model='demo_multiple_fields_1_model.MyImage2', verbose_name='My photos2')),
('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Owner')),
],
),
]
Empty file.
58 changes: 58 additions & 0 deletions demo_multiple_fields_1_model/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from django.conf import settings
from django.core.files.storage import default_storage
from django.db import models
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from PIL import Image

from galleryfield.fields import GalleryField


def fileName(image):
file_url = list(image.url.split("/"))
file_url.reverse()
file_name = file_url[0].split(".")[0]
return file_name


class MyImage1(models.Model):
photo1 = models.ImageField(
upload_to="my_images1", storage=default_storage, verbose_name=_("Image1")
)
creator = models.ForeignKey(
settings.AUTH_USER_MODEL,
null=False,
blank=False,
verbose_name=_("Creator"),
on_delete=models.CASCADE,
)

@classmethod
def get_image_field(cls):
return cls._meta.get_field("photo1")


class MyImage2(models.Model):
photo2 = models.ImageField(
upload_to="my_images2", storage=default_storage, verbose_name=_("Image2")
)

@classmethod
def get_image_field(cls):
return cls._meta.get_field("photo2")


class MyGallery(models.Model):
album1 = GalleryField(
target_model="demo_multiple_fields_1_model.MyImage1",
verbose_name=_("My photos"))
album2 = GalleryField(
target_model="demo_multiple_fields_1_model.MyImage2",
verbose_name=_("My photos2"))
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
null=False,
blank=False,
verbose_name=_("Owner"),
on_delete=models.CASCADE,
)
Empty file.
35 changes: 35 additions & 0 deletions demo_multiple_fields_1_model/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from demo_multiple_fields_1_model import image_views
from django.urls import path

urlpatterns = [
path(
"upload1/",
image_views.MyImage1CreateView.as_view(),
name="demo_multiple_fields_1_model-myimage1-upload",
),
path(
"fetch1/",
(image_views.MyImage1ListView.as_view()),
name="demo_multiple_fields_1_model-myimage1-fetch",
),
path(
"crop1/<int:pk>",
image_views.MyImage1CropView.as_view(),
name="demo_multiple_fields_1_model-myimage1-crop",
),
path(
"upload2/",
image_views.MyImage2CreateView.as_view(),
name="demo_multiple_fields_1_model-myimage2-upload",
),
path(
"fetch2/",
(image_views.MyImage2ListView.as_view()),
name="demo_multiple_fields_1_model-myimage2-fetch",
),
path(
"crop2/<int:pk>",
image_views.MyImage2CropView.as_view(),
name="demo_multiple_fields_1_model-myimage2-crop",
),
]
Empty file.
8 changes: 4 additions & 4 deletions galleryfield/templates/galleryfield/widget.html
Original file line number Diff line number Diff line change
Expand Up @@ -293,9 +293,8 @@ <h4 class="modal-title" id="modalLabel">{% trans "Edit image" %}</h4>

{% endif %}

$('.gallery-widget').each(function () {
const that = $(this),
$fileupload = that,
$(function () {
const $fileupload = $("#id-{{ name }}-gallery-widget"),
fileInput = $('#{{ name }}-files'),
uploadURL = fileInput.data('action'),
sortableOptions = {
Expand All @@ -306,6 +305,7 @@ <h4 class="modal-title" id="modalLabel">{% trans "Edit image" %}</h4>
singleFileUploads: true,
url: uploadURL,
type: 'POST',
hiddenFileInput: 'input#id_{{ name }}',
messages: {
maxFileSize: '{% trans "File is too big" %}',
minFileSize: '{% trans "File is too small" %}',
Expand Down Expand Up @@ -354,7 +354,7 @@ <h4 class="modal-title" id="modalLabel">{% trans "Edit image" %}</h4>

// disable change alert when submit form.
if (typeof before_submit !== 'undefined') {
that.closest("form").on("submit", before_submit);
$fileupload.closest("form").on("submit", before_submit);
}
});

Expand Down
5 changes: 1 addition & 4 deletions galleryfield/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,10 +345,7 @@ def get_stringfied_jquery_file_upload_ui_options(self):
_width, _height = self.thumbnail_size.split("x")
ui_options.update(
{"previewMaxWidth": int(_width),
"previewMaxHeight": int(_height),

# This is used as a CSS selector to fine the input field
"hiddenFileInput": f".{conf.FILES_FIELD_CLASS_NAME}",
"previewMaxHeight": int(_height)
})

# Compatibility with Bootstrap 4 and 5
Expand Down