332 lines
12 KiB
Python
332 lines
12 KiB
Python
# This file is part of photo21
|
|
# Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import django.core.validators
|
|
import django.db.models.deletion
|
|
import django.utils.timezone
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
import photologue.models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
initial = True
|
|
|
|
dependencies = [
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="PhotoSize",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.AutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"name",
|
|
models.CharField(
|
|
help_text='Photo size name should contain only letters, numbers and underscores. Examples: "thumbnail", "display", "small", "main_page_widget".',
|
|
max_length=40,
|
|
unique=True,
|
|
validators=[
|
|
django.core.validators.RegexValidator(
|
|
message="Use only plain lowercase letters (ASCII), numbers and underscores.",
|
|
regex="^[a-z0-9_]+$",
|
|
)
|
|
],
|
|
verbose_name="name",
|
|
),
|
|
),
|
|
(
|
|
"width",
|
|
models.PositiveIntegerField(
|
|
default=0,
|
|
help_text='If width is set to "0" the image will be scaled to the supplied height.',
|
|
verbose_name="width",
|
|
),
|
|
),
|
|
(
|
|
"height",
|
|
models.PositiveIntegerField(
|
|
default=0,
|
|
help_text='If height is set to "0" the image will be scaled to the supplied width',
|
|
verbose_name="height",
|
|
),
|
|
),
|
|
(
|
|
"quality",
|
|
models.PositiveIntegerField(
|
|
choices=[
|
|
(30, "Very Low"),
|
|
(40, "Low"),
|
|
(50, "Medium-Low"),
|
|
(60, "Medium"),
|
|
(70, "Medium-High"),
|
|
(80, "High"),
|
|
(90, "Very High"),
|
|
],
|
|
default=70,
|
|
help_text="JPEG image quality.",
|
|
verbose_name="quality",
|
|
),
|
|
),
|
|
(
|
|
"upscale",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="If selected the image will be scaled up if necessary to fit the supplied dimensions. Cropped sizes will be upscaled regardless of this setting.",
|
|
verbose_name="upscale images?",
|
|
),
|
|
),
|
|
(
|
|
"crop",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="If selected the image will be scaled and cropped to fit the supplied dimensions.",
|
|
verbose_name="crop to fit?",
|
|
),
|
|
),
|
|
(
|
|
"pre_cache",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="If selected this photo size will be pre-cached as photos are added.",
|
|
verbose_name="pre-cache?",
|
|
),
|
|
),
|
|
(
|
|
"increment_count",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text='If selected the image\'s "view_count" will be incremented when this photo size is displayed.',
|
|
verbose_name="increment view count?",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "photo size",
|
|
"verbose_name_plural": "photo sizes",
|
|
"ordering": ["width", "height"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Tag",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.AutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"name",
|
|
models.CharField(max_length=250, unique=True, verbose_name="name"),
|
|
),
|
|
(
|
|
"slug",
|
|
models.SlugField(
|
|
help_text='A "slug" is a unique URL-friendly title for an object.',
|
|
max_length=250,
|
|
unique=True,
|
|
verbose_name="slug",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "tag",
|
|
"verbose_name_plural": "tags",
|
|
"ordering": ["name"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Photo",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.AutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"image",
|
|
models.ImageField(
|
|
upload_to=photologue.models.get_storage_path,
|
|
verbose_name="image",
|
|
),
|
|
),
|
|
(
|
|
"date_taken",
|
|
models.DateTimeField(
|
|
blank=True,
|
|
help_text="Date image was taken; is obtained from the image EXIF data.",
|
|
null=True,
|
|
verbose_name="date taken",
|
|
),
|
|
),
|
|
(
|
|
"view_count",
|
|
models.PositiveIntegerField(
|
|
default=0, editable=False, verbose_name="view count"
|
|
),
|
|
),
|
|
(
|
|
"crop_from",
|
|
models.CharField(
|
|
blank=True,
|
|
choices=[
|
|
("top", "Top"),
|
|
("right", "Right"),
|
|
("bottom", "Bottom"),
|
|
("left", "Left"),
|
|
("center", "Center (Default)"),
|
|
],
|
|
default="center",
|
|
max_length=10,
|
|
verbose_name="crop from",
|
|
),
|
|
),
|
|
(
|
|
"title",
|
|
models.CharField(max_length=250, unique=True, verbose_name="title"),
|
|
),
|
|
(
|
|
"slug",
|
|
models.SlugField(
|
|
help_text='A "slug" is a unique URL-friendly title for an object.',
|
|
max_length=250,
|
|
unique=True,
|
|
verbose_name="slug",
|
|
),
|
|
),
|
|
("caption", models.TextField(blank=True, verbose_name="caption")),
|
|
(
|
|
"date_added",
|
|
models.DateTimeField(
|
|
default=django.utils.timezone.now, verbose_name="date added"
|
|
),
|
|
),
|
|
(
|
|
"license",
|
|
models.CharField(
|
|
blank=True, max_length=255, verbose_name="license"
|
|
),
|
|
),
|
|
(
|
|
"is_public",
|
|
models.BooleanField(
|
|
default=True,
|
|
help_text="Public photographs will be displayed in the default views.",
|
|
verbose_name="is public",
|
|
),
|
|
),
|
|
(
|
|
"owner",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="owner",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "photo",
|
|
"verbose_name_plural": "photos",
|
|
"ordering": ["-date_added"],
|
|
"get_latest_by": "date_added",
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Gallery",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.AutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"date_added",
|
|
models.DateTimeField(
|
|
default=django.utils.timezone.now, verbose_name="date published"
|
|
),
|
|
),
|
|
(
|
|
"title",
|
|
models.CharField(max_length=250, unique=True, verbose_name="title"),
|
|
),
|
|
(
|
|
"slug",
|
|
models.SlugField(
|
|
help_text='A "slug" is a unique URL-friendly title for an object.',
|
|
max_length=250,
|
|
unique=True,
|
|
verbose_name="title slug",
|
|
),
|
|
),
|
|
(
|
|
"date_start",
|
|
models.DateField(
|
|
default=django.utils.timezone.now, verbose_name="start date"
|
|
),
|
|
),
|
|
(
|
|
"date_end",
|
|
models.DateField(blank=True, null=True, verbose_name="end date"),
|
|
),
|
|
(
|
|
"description",
|
|
models.TextField(blank=True, verbose_name="description"),
|
|
),
|
|
(
|
|
"is_public",
|
|
models.BooleanField(
|
|
default=True,
|
|
help_text="Public galleries will be displayed in the default views.",
|
|
verbose_name="is public",
|
|
),
|
|
),
|
|
(
|
|
"photos",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
related_name="galleries",
|
|
to="photologue.Photo",
|
|
verbose_name="photos",
|
|
),
|
|
),
|
|
(
|
|
"tags",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
related_name="galleries",
|
|
to="photologue.Tag",
|
|
verbose_name="tags",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "gallery",
|
|
"verbose_name_plural": "galleries",
|
|
"ordering": ["-date_added"],
|
|
"get_latest_by": "date_added",
|
|
},
|
|
),
|
|
]
|