photo-objects 0.10.2__tar.gz → 0.10.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {photo_objects-0.10.2 → photo_objects-0.10.4}/PKG-INFO +3 -3
  2. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/api/backup.py +15 -1
  3. photo_objects-0.10.4/photo_objects/django/migrations/0008_sitesettings_copyright_notice.py +29 -0
  4. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/models.py +20 -3
  5. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/templatetags/photo_objects_extras.py +18 -0
  6. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/ui/album.py +13 -0
  7. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects.egg-info/PKG-INFO +3 -3
  8. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects.egg-info/SOURCES.txt +1 -0
  9. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects.egg-info/requires.txt +1 -1
  10. {photo_objects-0.10.2 → photo_objects-0.10.4}/pyproject.toml +3 -3
  11. {photo_objects-0.10.2 → photo_objects-0.10.4}/LICENSE +0 -0
  12. {photo_objects-0.10.2 → photo_objects-0.10.4}/README.md +0 -0
  13. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/__init__.py +0 -0
  14. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/config.py +0 -0
  15. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/__init__.py +0 -0
  16. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/admin.py +0 -0
  17. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/api/__init__.py +0 -0
  18. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/api/album.py +0 -0
  19. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/api/auth.py +0 -0
  20. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/api/photo.py +0 -0
  21. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/api/photo_change_request.py +0 -0
  22. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/api/utils.py +0 -0
  23. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/apps.py +0 -0
  24. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/conf.py +0 -0
  25. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/context_processors.py +0 -0
  26. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/forms.py +0 -0
  27. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/management/__init__.py +0 -0
  28. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/management/commands/__init__.py +0 -0
  29. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/management/commands/clean-scaled-photos.py +0 -0
  30. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/management/commands/create-initial-admin-account.py +0 -0
  31. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/management/commands/restore-backup.py +0 -0
  32. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/0001_initial.py +0 -0
  33. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/0002_created_at_updated_at.py +0 -0
  34. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/0003_admin_visibility.py +0 -0
  35. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/0004_camera_setup_and_settings.py +0 -0
  36. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/0005_sitesettings.py +0 -0
  37. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/0006_photo_alt_text.py +0 -0
  38. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/0007_backup.py +0 -0
  39. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/migrations/__init__.py +0 -0
  40. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/objsto.py +0 -0
  41. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/signals.py +0 -0
  42. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/templatetags/__init__.py +0 -0
  43. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/__init__.py +0 -0
  44. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_album.py +0 -0
  45. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_auth.py +0 -0
  46. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_commands.py +0 -0
  47. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_img.py +0 -0
  48. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_og_meta.py +0 -0
  49. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_photo.py +0 -0
  50. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_photo_change_requests.py +0 -0
  51. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/test_utils.py +0 -0
  52. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/tests/utils.py +0 -0
  53. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/urls.py +0 -0
  54. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/__init__.py +0 -0
  55. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/api/__init__.py +0 -0
  56. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/api/album.py +0 -0
  57. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/api/auth.py +0 -0
  58. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/api/photo.py +0 -0
  59. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/api/utils.py +0 -0
  60. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/ui/__init__.py +0 -0
  61. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/ui/configuration.py +0 -0
  62. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/ui/photo.py +0 -0
  63. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/ui/photo_change_request.py +0 -0
  64. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/ui/users.py +0 -0
  65. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/ui/utils.py +0 -0
  66. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/django/views/utils.py +0 -0
  67. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/error.py +0 -0
  68. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/img.py +0 -0
  69. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects/utils.py +0 -0
  70. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects.egg-info/dependency_links.txt +0 -0
  71. {photo_objects-0.10.2 → photo_objects-0.10.4}/photo_objects.egg-info/top_level.txt +0 -0
  72. {photo_objects-0.10.2 → photo_objects-0.10.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: photo-objects
3
- Version: 0.10.2
3
+ Version: 0.10.4
4
4
  Summary: Application for storing photos in S3 compatible object-storage.
5
5
  Author: Toni Kangas
6
6
  License: MIT License
@@ -29,7 +29,7 @@ Project-URL: Homepage, https://github.com/kangasta/photo-objects
29
29
  Project-URL: Repository, https://github.com/kangasta/photo-objects.git
30
30
  Classifier: Environment :: Web Environment
31
31
  Classifier: Framework :: Django
32
- Classifier: Framework :: Django :: 5.0
32
+ Classifier: Framework :: Django :: 6.0
33
33
  Classifier: Intended Audience :: Developers
34
34
  Classifier: License :: OSI Approved :: MIT License
35
35
  Classifier: Operating System :: OS Independent
@@ -43,7 +43,7 @@ Description-Content-Type: text/markdown
43
43
  License-File: LICENSE
44
44
  Requires-Dist: markdown~=3.7
45
45
  Requires-Dist: minio<7.2.19,>=7.2.0
46
- Requires-Dist: pillow~=10.4
46
+ Requires-Dist: pillow~=12.0
47
47
  Dynamic: license-file
48
48
 
49
49
  # Photo Objects
@@ -1,4 +1,5 @@
1
1
  from threading import Thread
2
+ from time import sleep
2
3
 
3
4
  from django.contrib.auth import get_user_model
4
5
  from django.contrib.auth.models import Group, Permission
@@ -59,7 +60,20 @@ def _group_dict(group: Group):
59
60
 
60
61
 
61
62
  def _create_backup(backup_id: int):
62
- backup = Backup.objects.get(id=backup_id)
63
+ # Backup might not be available immediately.
64
+ # Retry getting the backup a few times.
65
+ for _ in range(5):
66
+ try:
67
+ backup = Backup.objects.get(id=backup_id)
68
+ break
69
+ except Backup.DoesNotExist:
70
+ sleep(2)
71
+
72
+ if not backup:
73
+ return
74
+
75
+ backup.status = "processing"
76
+ backup.save()
63
77
 
64
78
  user_model = get_user_model()
65
79
 
@@ -0,0 +1,29 @@
1
+ # Generated by Django 5.2.6 on 2025-12-20 18:09
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('photo_objects', '0007_backup'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='sitesettings',
16
+ name='copyright_notice',
17
+ field=models.CharField(blank=True, help_text='Copyright notice to display in the site footer. Content will be HTML-escaped before rendering.'),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name='sitesettings',
21
+ name='description',
22
+ field=models.TextField(blank=True, help_text='Description of the site, used in site level meta description tags and social media previews.'),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name='sitesettings',
26
+ name='preview_image',
27
+ field=models.ForeignKey(blank=True, help_text='Photo to use as the site level social media preview image.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='photo_objects.photo'),
28
+ ),
29
+ ]
@@ -211,10 +211,26 @@ class SiteSettings(models.Model):
211
211
  site = models.OneToOneField(
212
212
  Site, on_delete=models.CASCADE, related_name="settings")
213
213
 
214
- description = models.TextField(blank=True)
214
+ description = models.TextField(
215
+ blank=True,
216
+ help_text=_(
217
+ "Description of the site, used in site level meta description "
218
+ "tags and social media previews."),
219
+ )
215
220
  preview_image = models.ForeignKey(
216
- Photo, blank=True, null=True, on_delete=models.SET_NULL)
217
-
221
+ Photo,
222
+ blank=True,
223
+ null=True,
224
+ on_delete=models.SET_NULL,
225
+ help_text=_(
226
+ "Photo to use as the site level social media preview image."),
227
+ )
228
+ copyright_notice = models.CharField(
229
+ blank=True,
230
+ help_text=_(
231
+ "Copyright notice to display in the site footer. Content will be "
232
+ "HTML-escaped before rendering."),
233
+ )
218
234
  objects = SiteSettingsManager()
219
235
 
220
236
  def __str__(self):
@@ -240,6 +256,7 @@ class Backup(models.Model):
240
256
  return _str(
241
257
  f'Backup {self.id}',
242
258
  created_at=self.created_at,
259
+ status=self.status,
243
260
  comment=self.comment,
244
261
  )
245
262
 
@@ -1,5 +1,7 @@
1
1
  from datetime import datetime
2
2
  from django import template
3
+ from django.utils.safestring import mark_safe
4
+ from django.utils.html import escape
3
5
 
4
6
  from photo_objects.django.models import SiteSettings
5
7
  from photo_objects.django.views.utils import meta_description
@@ -59,3 +61,19 @@ def meta_og(context):
59
61
  }
60
62
  except Exception:
61
63
  return context
64
+
65
+
66
+ @register.simple_tag(takes_context=True)
67
+ def copyright_notice(context):
68
+ try:
69
+ request = context.get("request")
70
+ site = request.site
71
+
72
+ settings = SiteSettings.objects.get(site)
73
+
74
+ if settings.copyright_notice:
75
+ notice = escape(settings.copyright_notice)
76
+ return mark_safe(f"<div>{notice}</div>")
77
+ return ""
78
+ except Exception:
79
+ return ""
@@ -56,6 +56,18 @@ def get_info(request: HttpRequest, album_key: str):
56
56
  return None
57
57
 
58
58
 
59
+ def _timeline(album: Album):
60
+ if not album.first_timestamp or not album.last_timestamp:
61
+ return None
62
+
63
+ start = album.first_timestamp.strftime("%Y %B")
64
+ end = album.last_timestamp.strftime("%Y %B")
65
+
66
+ if start == end:
67
+ return start
68
+ return f"{start} – {end}"
69
+
70
+
59
71
  @json_problem_as_html
60
72
  def show_album(request: HttpRequest, album_key: str):
61
73
  album = api.check_album_access(request, album_key)
@@ -64,6 +76,7 @@ def show_album(request: HttpRequest, album_key: str):
64
76
  back = BackLink("Albums", reverse('photo_objects:list_albums'))
65
77
  details = {
66
78
  "Description": render_markdown(album.description),
79
+ "Timeline": _timeline(album),
67
80
  "Visibility": Album.Visibility(album.visibility).label,
68
81
  }
69
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: photo-objects
3
- Version: 0.10.2
3
+ Version: 0.10.4
4
4
  Summary: Application for storing photos in S3 compatible object-storage.
5
5
  Author: Toni Kangas
6
6
  License: MIT License
@@ -29,7 +29,7 @@ Project-URL: Homepage, https://github.com/kangasta/photo-objects
29
29
  Project-URL: Repository, https://github.com/kangasta/photo-objects.git
30
30
  Classifier: Environment :: Web Environment
31
31
  Classifier: Framework :: Django
32
- Classifier: Framework :: Django :: 5.0
32
+ Classifier: Framework :: Django :: 6.0
33
33
  Classifier: Intended Audience :: Developers
34
34
  Classifier: License :: OSI Approved :: MIT License
35
35
  Classifier: Operating System :: OS Independent
@@ -43,7 +43,7 @@ Description-Content-Type: text/markdown
43
43
  License-File: LICENSE
44
44
  Requires-Dist: markdown~=3.7
45
45
  Requires-Dist: minio<7.2.19,>=7.2.0
46
- Requires-Dist: pillow~=10.4
46
+ Requires-Dist: pillow~=12.0
47
47
  Dynamic: license-file
48
48
 
49
49
  # Photo Objects
@@ -40,6 +40,7 @@ photo_objects/django/migrations/0004_camera_setup_and_settings.py
40
40
  photo_objects/django/migrations/0005_sitesettings.py
41
41
  photo_objects/django/migrations/0006_photo_alt_text.py
42
42
  photo_objects/django/migrations/0007_backup.py
43
+ photo_objects/django/migrations/0008_sitesettings_copyright_notice.py
43
44
  photo_objects/django/migrations/__init__.py
44
45
  photo_objects/django/templatetags/__init__.py
45
46
  photo_objects/django/templatetags/photo_objects_extras.py
@@ -1,3 +1,3 @@
1
1
  markdown~=3.7
2
2
  minio<7.2.19,>=7.2.0
3
- pillow~=10.4
3
+ pillow~=12.0
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "photo-objects"
7
- version = "0.10.2"
7
+ version = "0.10.4"
8
8
  dependencies = [
9
9
  "markdown~=3.7",
10
10
  "minio>=7.2.0,<7.2.19",
11
- "pillow~=10.4"
11
+ "pillow~=12.0"
12
12
  ]
13
13
  description = "Application for storing photos in S3 compatible object-storage."
14
14
  readme = "README.md"
@@ -20,7 +20,7 @@ authors = [
20
20
  classifiers = [
21
21
  "Environment :: Web Environment",
22
22
  "Framework :: Django",
23
- "Framework :: Django :: 5.0",
23
+ "Framework :: Django :: 6.0",
24
24
  "Intended Audience :: Developers",
25
25
  "License :: OSI Approved :: MIT License",
26
26
  "Operating System :: OS Independent",
File without changes
File without changes
File without changes