Compare commits
3 Commits
6e57c28d4b
...
9cc1068e63
| Author | SHA1 | Date | |
|---|---|---|---|
| 9cc1068e63 | |||
| 9eaf3ecdd8 | |||
| 0bb313bbed |
42
.gitignore
vendored
42
.gitignore
vendored
@@ -1,21 +1,21 @@
|
||||
.env/*
|
||||
*.pyc
|
||||
*_design1
|
||||
fet2020/.env/*
|
||||
*.sqlite3
|
||||
.theia/*
|
||||
.flake8
|
||||
migrate
|
||||
run
|
||||
*.pid
|
||||
*~
|
||||
APIKEY.txt
|
||||
tmp
|
||||
.ruff_cache
|
||||
.venv
|
||||
etherpad
|
||||
files
|
||||
flowbite
|
||||
gallery
|
||||
tailwind
|
||||
whoosh_index
|
||||
.env/*
|
||||
*.pyc
|
||||
*_design1
|
||||
fet2020/.env/*
|
||||
*.sqlite3
|
||||
.theia/*
|
||||
.flake8
|
||||
migrate
|
||||
run
|
||||
*.pid
|
||||
*~
|
||||
APIKEY.txt
|
||||
tmp
|
||||
.ruff_cache
|
||||
.venv
|
||||
etherpad
|
||||
files
|
||||
flowbite
|
||||
gallery/*
|
||||
tailwind
|
||||
whoosh_index
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 5.2.7 on 2025-10-27 19:17
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('gallery', '0002_album_event_place'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='album',
|
||||
name='description',
|
||||
field=models.TextField(blank=True, default=''),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='album',
|
||||
name='photographer',
|
||||
field=models.CharField(blank=True, default='', max_length=200, verbose_name='Fotograph(en)'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='album',
|
||||
name='thumbnail',
|
||||
field=models.CharField(blank=True, default='', max_length=200, verbose_name='Thumbnail'),
|
||||
),
|
||||
]
|
||||
@@ -1,58 +1,60 @@
|
||||
import logging
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.validators import get_available_image_extensions
|
||||
from PIL import Image, ImageOps
|
||||
|
||||
gallery_path = Path(settings.MEDIA_ROOT) / settings.GALLERY["path"]
|
||||
gallery_path_url = Path(settings.MEDIA_URL) / settings.GALLERY["path"]
|
||||
gallery_thumb_path = Path(settings.MEDIA_ROOT) / settings.GALLERY["thumb_path"]
|
||||
gallery_thumb_path_url = Path(settings.MEDIA_URL) / settings.GALLERY["thumb_path"]
|
||||
logger = logging.getLogger(__name__)
|
||||
size = (320, 320)
|
||||
|
||||
Image.logger.setLevel(level=logging.INFO)
|
||||
|
||||
|
||||
def get_image_list(folder_name: str) -> list:
|
||||
image_path = Path(gallery_path) / folder_name
|
||||
thumb_path = Path(gallery_thumb_path) / folder_name
|
||||
img_list = []
|
||||
|
||||
if not Path(image_path).exists():
|
||||
logger.info("Image path '%s' not found.", image_path)
|
||||
return img_list
|
||||
|
||||
Path(thumb_path).mkdir(exist_ok=True)
|
||||
|
||||
for _file in os.listdir(image_path):
|
||||
if Path(_file).suffix.lower()[1:] not in get_available_image_extensions():
|
||||
continue
|
||||
|
||||
thumb_file_path = Path(thumb_path) / f"thumb_{_file}"
|
||||
if not Path(thumb_file_path).exists():
|
||||
with Image.open(Path(image_path) / _file, "r") as im:
|
||||
if im._getexif() is not None:
|
||||
im = ImageOps.exif_transpose(im)
|
||||
|
||||
thumb = ImageOps.fit(im, size, Image.Resampling.LANCZOS)
|
||||
thumb.save(thumb_file_path)
|
||||
logger.info("Save thumb 'thumb_%s'.", _file)
|
||||
|
||||
img_dict = {
|
||||
"title": _file,
|
||||
"image_url": Path(gallery_path_url) / folder_name / _file,
|
||||
"thumb_url": Path(gallery_thumb_path_url) / folder_name / f"thumb_{_file}",
|
||||
}
|
||||
img_list.append(img_dict)
|
||||
|
||||
return img_list
|
||||
|
||||
|
||||
def get_folder_list():
|
||||
if Path(gallery_path).exists():
|
||||
return next(os.walk(gallery_path))[1]
|
||||
|
||||
return None
|
||||
import logging
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.validators import get_available_image_extensions
|
||||
from PIL import Image, ImageOps
|
||||
|
||||
gallery_path = Path(settings.MEDIA_ROOT) / settings.GALLERY["path"]
|
||||
gallery_path_url = Path(settings.MEDIA_URL) / settings.GALLERY["path"]
|
||||
gallery_thumb_path = Path(settings.MEDIA_ROOT) / settings.GALLERY["thumb_path"]
|
||||
gallery_thumb_path_url = Path(settings.MEDIA_URL) / settings.GALLERY["thumb_path"]
|
||||
logger = logging.getLogger(__name__)
|
||||
size = (320, 320)
|
||||
|
||||
Image.logger.setLevel(level=logging.INFO)
|
||||
|
||||
|
||||
def get_image_list(folder_name: str) -> list:
|
||||
image_path = Path(gallery_path) / folder_name
|
||||
thumb_path = Path(gallery_thumb_path) / folder_name
|
||||
img_list = []
|
||||
|
||||
if not Path(image_path).exists():
|
||||
logger.info("Image path '%s' not found.", image_path)
|
||||
return img_list
|
||||
|
||||
Path(thumb_path).mkdir(exist_ok=True)
|
||||
|
||||
for _file in os.listdir(image_path):
|
||||
if Path(_file).suffix.lower()[1:] not in get_available_image_extensions():
|
||||
continue
|
||||
|
||||
thumb_file_path = Path(thumb_path) / f"thumb_{_file}"
|
||||
if not Path(thumb_file_path).exists():
|
||||
with Image.open(Path(image_path) / _file, "r") as im:
|
||||
if im._getexif() is not None:
|
||||
im = ImageOps.exif_transpose(im)
|
||||
|
||||
thumb = ImageOps.fit(im, size, Image.Resampling.LANCZOS)
|
||||
thumb.save(thumb_file_path)
|
||||
logger.info("Save thumb 'thumb_%s'.", _file)
|
||||
|
||||
img_dict = {
|
||||
"title": _file,
|
||||
"image_url": Path(gallery_path_url) / folder_name / _file,
|
||||
"thumb_url": Path(gallery_thumb_path_url) / folder_name / f"thumb_{_file}",
|
||||
}
|
||||
img_list.append(img_dict)
|
||||
|
||||
# Sort images alphabetically by filename (case-insensitive) to ensure consistent ordering.
|
||||
# Directory listings may return files in different orders.
|
||||
return sorted(img_list, key=lambda x: x["title"].lower())
|
||||
|
||||
|
||||
def get_folder_list():
|
||||
if Path(gallery_path).exists():
|
||||
return next(os.walk(gallery_path))[1]
|
||||
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user