diff --git a/gallery/admin.py b/gallery/admin.py index 8cec1db..4683ec7 100644 --- a/gallery/admin.py +++ b/gallery/admin.py @@ -39,7 +39,7 @@ class AlbumAdmin(admin.ModelAdmin): prepopulated_fields = {'slug': ('name',)} list_display = ('__str__', 'location', 'album_date', 'is_public', 'thumbnail', ) search_fields = ('name',) - ordering = ('name',) + ordering = ('-album_date',) list_per_page = 30 list_editable = ('is_public', 'location') diff --git a/gallery/migrations/0001_initial.py b/gallery/migrations/0001_initial.py index 0a71445..e8626ae 100644 --- a/gallery/migrations/0001_initial.py +++ b/gallery/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.4 on 2025-01-15 18:22 +# Generated by Django 5.1.4 on 2025-01-18 07:39 import datetime import django.db.models.deletion @@ -44,10 +44,12 @@ class Migration(migrations.Migration): ('slug', models.SlugField(max_length=150, unique=True, verbose_name='Slug')), ('album_date', models.DateField(default=datetime.datetime.now, verbose_name='Album Date')), ('is_public', models.BooleanField(default=False, verbose_name='Published')), + ('parent', models.ForeignKey(blank=True, limit_choices_to={'parent__isnull': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='gallery.album', verbose_name='Parent Album')), ('location', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='albums', to='gallery.location', verbose_name='Location')), ], options={ 'verbose_name_plural': 'Albums', + 'ordering': ('album_date',), }, ), migrations.CreateModel( @@ -65,6 +67,10 @@ class Migration(migrations.Migration): ('likes', models.PositiveIntegerField(default=0, verbose_name='Likes')), ('album', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='gallery.album', verbose_name='Album')), ], + options={ + 'verbose_name_plural': 'Photos', + 'ordering': ('-taken_at',), + }, ), migrations.AddField( model_name='album', diff --git a/gallery/models/album.py b/gallery/models/album.py index c084f5d..11535b6 100644 --- a/gallery/models/album.py +++ b/gallery/models/album.py @@ -1,5 +1,6 @@ from datetime import datetime +from django.core.exceptions import ValidationError from django.db import models from django.templatetags.static import static from django.urls import reverse @@ -7,12 +8,11 @@ from django.utils.text import slugify from gallery.models.location import Location -#from gallery.models.photo import Photo - class Album(models.Model): name = models.CharField(max_length=150, unique=True, verbose_name="Album") slug = models.SlugField(max_length=150, unique=True, verbose_name="Slug") + parent = models.ForeignKey('self', on_delete=models.SET_NULL, blank=True, null=True, limit_choices_to={'parent__isnull': True}, related_name='children', verbose_name="Parent Album") location = models.ForeignKey(Location, blank=True, null=True, on_delete=models.SET_NULL, related_name='albums', verbose_name="Location") album_date = models.DateField(default=datetime.now, verbose_name="Album Date") cover = models.ForeignKey("Photo", blank=True, null=True, on_delete=models.SET_NULL, related_name='cover_to', verbose_name="Album cover") @@ -30,6 +30,11 @@ class Album(models.Model): if random_cover: return random_cover.photo.url return static('img/placeholder.png') + + def clean(self): + super().clean() + if self.parent and self.parent == self: + raise ValidationError({'parent': "An album cannot be its own parent."}) def save(self, *args, **kwargs): if not self.slug: @@ -41,6 +46,7 @@ class Album(models.Model): class Meta: verbose_name_plural = "Albums" + ordering = ('album_date',) def __str__(self): return '{}'.format(self.name)