Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pull from easy thumbnail #1

Merged
merged 33 commits into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
09174c9
Keep ICC profile when saving image, if present
siovene Oct 1, 2020
92d7f58
Merge branch 'master' into keep-icc-master
siovene Dec 4, 2022
6fe0611
Adjust regex to fix failing test
EdwardBetts Aug 6, 2023
86d869e
anigif WIP
benzkji Feb 5, 2024
6801c75
WIP tests
benzkji Feb 10, 2024
fdb100b
wip, trying things
benzkji Feb 19, 2024
53ab064
added tests
benzkji Feb 19, 2024
dbd8fd3
trigger actions
benzkji Feb 19, 2024
5525890
add demoproject
PetrDlouhy Jul 27, 2024
dd61ea3
update .gitignore
PetrDlouhy Jul 27, 2024
9a7adcc
Fix SmileyChris#622 address ZeroDivisionError in scale_and_crop.
gonzalodelgado Aug 2, 2024
cdd8e7d
Merge pull request #636 from PetrDlouhy/demoproject
jrief Sep 9, 2024
c53bce1
revert code style changes
benzkji Sep 9, 2024
3a38f7e
revert code style changes
benzkji Sep 9, 2024
0af745e
some words
benzkji Sep 9, 2024
e5243bd
remove commented code
benzkji Sep 9, 2024
6e6f1e8
Merge branch 'master' into feature/animated-images-support
jrief Sep 9, 2024
0e25a02
tests pass, but
benzkji Sep 9, 2024
7bdbd7c
prepare for version 2.10
jrief Sep 11, 2024
acb666f
Merge pull request #628 from benzkji/feature/animated-images-support
jrief Sep 11, 2024
409457b
Merge branch 'master' into version-2.10
jrief Sep 11, 2024
4bdef07
Merge pull request #623 from gonzalodelgado/master
jrief Sep 11, 2024
b6d7134
Merge branch 'master' into version-2.10
jrief Sep 11, 2024
1bc0334
Merge pull request #620 from EdwardBetts/test-regex-fix
jrief Sep 11, 2024
a2c271f
Merge branch 'pr/554' into version-2.10
jrief Sep 12, 2024
d4e8d0c
Merge branch 'version-2.10'
jrief Sep 12, 2024
46d0743
Ensure FIPS compliance by marking MD5 and SHA-1 as non-security-related
buugaj Sep 26, 2024
79b7bd3
Remove unused hashlib import
buugaj Oct 14, 2024
065b74e
Add support for Python 3.13
benkonrath Oct 20, 2024
4bc94ef
Update minimum Django version in README
Scotchester Nov 3, 2024
ecec162
Merge pull request #646 from buugaj/achieve_fips_compliance
jrief Nov 9, 2024
7020a8d
Merge pull request #651 from Scotchester/patch-1
jrief Nov 9, 2024
9d6fe66
Merge pull request #650 from benkonrath/python-3.13
jrief Nov 9, 2024
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
2 changes: 1 addition & 1 deletion .github/workflows/python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
strategy:
max-parallel: 4
matrix:
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12']
python-version: ['3.9', '3.10', '3.11', '3.12']

steps:
- uses: actions/checkout@v2
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@ docs/_build
*.egg-info
*.egg
*.pyc
*.swp
*.orig
reports/*
.python-version
10 changes: 10 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
Changes
=======

2.10 (2024-09-11)
-----------------
* Drop support for Python-3.8.
* Drop support for Django-4.1 and earlier.
* Add support for Django-5.1.
* Experimental support for animated image formats. See documentation for more infos.
* Fix #642: Do not scale images (SVG) without size information.
* Fix #366: Keep ICC profile when saving image, if present.


2.9 (2024-07-25)
----------------
* Add support for Django 4.2 storages (mandatory in Django 5.1).
Expand Down
11 changes: 9 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Easy Thumbnails
:target: https://github.com/SmileyChris/easy-thumbnails/actions/workflows/python.yml


A powerful, yet easy to implement thumbnailing application for Django 2.2+
A powerful, yet easy to implement thumbnailing application for Django 4.2+

Below is a quick summary of usage. For more comprehensive information, view the
`full documentation`__ online or the peruse the project's ``docs`` directory.
Expand Down Expand Up @@ -176,7 +176,14 @@ during scaling.
Changes the quality of the output JPEG thumbnail. Defaults to ``85``.

In Python code, this is given as a separate option to the ``get_thumbnail``
method rather than just alter the other
method rather than just alter the other.

``keep_icc_profile``
--------------------

If `True`, when saving a thumbnail with the alias that defines this option, the
ICC profile of the image will be preserved in the thumbnail, if present in the first place.


Other options
-------------
Expand Down
Empty file.
16 changes: 16 additions & 0 deletions demoproject/demoproject/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for demoproject project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demoproject.settings")

application = get_asgi_application()
141 changes: 141 additions & 0 deletions demoproject/demoproject/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
"""
Django settings for demoproject project.

Generated by 'django-admin startproject' using Django 4.2.14.

For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "django-insecure-vk9u^p7&l*!p6h5q#ham8@@db-3bi4i6%kqllaux8=^_(1^(nc"

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"mainapp",
"easy_thumbnails",
]

MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"
THUMBNAIL_DEFAULT_STORAGE_ALIAS = "easy_thumbnails"
STORAGES = {
"default": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
},
"staticfiles": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
},
"easy_thumbnails": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
# "BACKEND": "easy_thumbnails.tests.TemporaryStorage",
},
}

MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]

ROOT_URLCONF = "demoproject.urls"

TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]

WSGI_APPLICATION = "demoproject.wsgi.application"


# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}


# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]


# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/

LANGUAGE_CODE = "en-us"

TIME_ZONE = "UTC"

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = "static/"

# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
26 changes: 26 additions & 0 deletions demoproject/demoproject/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""
URL configuration for demoproject project.

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""

from django.contrib import admin
from django.urls import include, path
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
path("admin/", admin.site.urls),
path("", include("mainapp.urls")),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
16 changes: 16 additions & 0 deletions demoproject/demoproject/wsgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
WSGI config for demoproject project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demoproject.settings")

application = get_wsgi_application()
Empty file added demoproject/mainapp/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions demoproject/mainapp/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions demoproject/mainapp/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class MainappConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "mainapp"
13 changes: 13 additions & 0 deletions demoproject/mainapp/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from django import forms
from easy_thumbnails.widgets import ImageClearableFileInput

from .models import TestImage


class TestImageForm(forms.ModelForm):
class Meta:
model = TestImage
fields = ["title", "image"]
widgets = {
"image": ImageClearableFileInput,
}
33 changes: 33 additions & 0 deletions demoproject/mainapp/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.2.14 on 2024-07-27 08:17

import easy_thumbnails.fields
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = []

operations = [
migrations.CreateModel(
name="TestImage",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("title", models.CharField(max_length=100)),
(
"image",
easy_thumbnails.fields.ThumbnailerImageField(upload_to="images"),
),
],
),
]
Empty file.
10 changes: 10 additions & 0 deletions demoproject/mainapp/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django.db import models
from easy_thumbnails.fields import ThumbnailerImageField


class TestImage(models.Model):
title = models.CharField(max_length=100)
image = ThumbnailerImageField(upload_to="images")

def __str__(self):
return self.title
15 changes: 15 additions & 0 deletions demoproject/mainapp/templates/mainapp/edit_image.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Edit Image</title>
</head>
<body>
<h1>Edit Image</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>
<a href="{% url 'index' %}">Back to list</a>
</body>
</html>
25 changes: 25 additions & 0 deletions demoproject/mainapp/templates/mainapp/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<title>Easy Thumbnails Demo</title>
</head>
<body>
<h1>Upload an Image</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>

<h2>Uploaded Images</h2>
<ul>
{% for image in images %}
<li>
<img src="{{ image.image.url }}" alt="{{ image.title }}" style="max-height: 200px;">
<p>{{ image.title }}</p>
<a href="{% url 'edit_image' image.pk %}">Edit</a>
</li>
{% endfor %}
</ul>
</body>
</html>
3 changes: 3 additions & 0 deletions demoproject/mainapp/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
8 changes: 8 additions & 0 deletions demoproject/mainapp/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.urls import path

from .views import edit_image, index

urlpatterns = [
path("", index, name="index"),
path("edit/<int:pk>/", edit_image, name="edit_image"),
]
Loading