Merge pull request #202 from tohojo/meta-sort

Allow sorting on metadata keys.
This commit is contained in:
Simon Conseil
2016-05-02 10:30:00 +02:00
11 changed files with 42 additions and 5 deletions

View File

@@ -32,5 +32,6 @@ alphabetical order):
- @trapperhoney
- Thomas Misilo
- Tobias Preuss
- Toke Høiland-Jørgensen (@tohojo)
- Vikram Shirgur
- Yuce Tekol

View File

@@ -314,7 +314,12 @@ class Album(UnicodeMixin):
if self.subdirs:
if albums_sort_attr:
root_path = self.path if self.path != '.' else ''
key = lambda s: strxfrm(getattr(
if albums_sort_attr.startswith("meta."):
meta_key = albums_sort_attr.split(".", 1)[1]
key = lambda s: strxfrm(
self.gallery.albums[join(root_path, s)].meta.get(meta_key, [''])[0])
else:
key = lambda s: strxfrm(getattr(
self.gallery.albums[join(root_path, s)], albums_sort_attr))
else:
key = strxfrm
@@ -328,6 +333,9 @@ class Album(UnicodeMixin):
if self.medias:
if medias_sort_attr == 'date':
key = lambda s: s.date or datetime.now()
elif medias_sort_attr.startswith('meta.'):
meta_key = medias_sort_attr.split(".", 1)[1]
key = lambda s: strxfrm(s.meta.get(meta_key, [''])[0])
else:
key = lambda s: strxfrm(getattr(s, medias_sort_attr))

View File

@@ -101,14 +101,16 @@ thumb_size = (280, 210)
# Use symbolic links instead of copying the original images
# orig_link = False
# Attribute of Album objects which is used to sort medias (eg 'title').
# Attribute of Album objects which is used to sort medias (eg 'title'). To sort
# on a metadata key, use 'meta.key'.
# albums_sort_attr = 'name'
# Reverse sort for albums
# albums_sort_reverse = False
# Attribute of Media objects which is used to sort medias. 'date' can be used
# to sort with EXIF dates.
# to sort with EXIF dates, and 'meta.key' to sort on a metadata key (which then
# must exist for all images).
# medias_sort_attr = 'filename'
# Reverse sort for medias

View File

@@ -90,7 +90,10 @@ def read_markdown(filename):
pass
else:
output['meta'] = meta
output['title'] = md.Meta.get('title', [''])[0]
try:
output['title'] = md.Meta['title'][0]
except KeyError:
pass
return output

View File

@@ -1,2 +1,3 @@
Title: An example sub-category
Thumbnail: 11.jpg
Order: 03

View File

@@ -0,0 +1 @@
Order: 01

View File

@@ -0,0 +1 @@
Order: 02

View File

@@ -0,0 +1 @@
Order: 01

View File

@@ -1 +1,2 @@
Title: 01 First title alphabetically
Order: 02

View File

@@ -191,6 +191,18 @@ def test_albums_sort(settings):
a.sort_subdirs('title')
assert [im.title for im in a.albums] == list(reversed(titles))
orders = ['01', '02', '03']
orders.sort()
settings['albums_sort_reverse'] = False
a = Album('dir1', settings, album['subdirs'], album['medias'], gal)
a.sort_subdirs('meta.order')
assert [d.meta['order'][0] for d in a.albums] == orders
settings['albums_sort_reverse'] = True
a = Album('dir1', settings, album['subdirs'], album['medias'], gal)
a.sort_subdirs('meta.order')
assert [d.meta['order'][0] for d in a.albums] == list(reversed(orders))
def test_medias_sort(settings):
gal = Gallery(settings, ncpu=1)
@@ -208,6 +220,12 @@ def test_medias_sort(settings):
assert [im.filename for im in a.images] == ['22.jpg', '21.jpg',
'archlinux-kiss-1024x640.png']
settings['medias_sort_attr'] = 'meta.order'
settings['medias_sort_reverse'] = False
a = Album('dir1/test2', settings, album['subdirs'], album['medias'], gal)
a.sort_medias(settings['medias_sort_attr'])
assert [im.filename for im in a.images] == ['archlinux-kiss-1024x640.png', '21.jpg', '22.jpg']
def test_gallery(settings, tmpdir):
"Test the Gallery class."

View File

@@ -58,7 +58,7 @@ def test_read_markdown_empty_file(tmpdir):
src = tmpdir.join("file.txt")
src.write("content")
m = utils.read_markdown(str(src))
assert m['title'] == ''
assert 'title' not in m
assert m['meta'] == {}
assert m['description'] == '<p>content</p>'