summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/TODO19
-rw-r--r--app/photos/admin.py5
-rw-r--r--app/photos/forms.py28
-rw-r--r--app/photos/migrations/0002_auto_20151216_1958.py26
-rw-r--r--app/photos/migrations/0003_luxgallery_caption_style.py20
-rw-r--r--app/photos/models.py22
-rw-r--r--app/photos/urls.py9
-rw-r--r--app/photos/views.py13
8 files changed, 123 insertions, 19 deletions
diff --git a/app/TODO b/app/TODO
index 2ddc873..9743b23 100644
--- a/app/TODO
+++ b/app/TODO
@@ -36,24 +36,17 @@ iron out templates and push first piece live.
# photos:
-Okay we're uploading/creating galleries/adding images
+Add map and location picker to upload form
-Then resize all images for responsive gallery.
+handle portrait orientation in resizing
-Then play with gallery templates and add a template selecter to form.
+finish builder
-like this full width design: http://www.photobyrichard.com/photobyrichard/page/2/
-
-Next step is to create private galleries and password protect them on the server at a common url. Flow will be something like:
+Then play with gallery templates
-galleries = PhotoGallery.object.filter(private=True)
-for gal in galleries:
- create at url like /photos/private/gallery-list and
- /photos/private/gallery-name
-
-Then just require a password to get to anything under /photos/private/
+like this full width design: http://www.photobyrichard.com/photobyrichard/page/2/
-Then change the default PhotoGallery manager to filter out anything marked private. Or make sure to write all those queries with .filter(private=False)
+port existing galleries to new structure
---
diff --git a/app/photos/admin.py b/app/photos/admin.py
index d8ad853..659dcb6 100644
--- a/app/photos/admin.py
+++ b/app/photos/admin.py
@@ -1,4 +1,5 @@
from django.contrib import admin
+from django import forms
from django.contrib.gis.admin import OSMGeoAdmin
from django.conf.urls import patterns
from django.conf.urls import url
@@ -9,10 +10,11 @@ from django.contrib.admin import helpers
from django.http import HttpResponseRedirect
-from .forms import UploadZipForm
+from .forms import UploadZipForm, GalleryForm
class LuxImageAdmin(OSMGeoAdmin):
+
list_display = ('pk', 'admin_thumbnail', 'pub_date',)
list_filter = ('pub_date',)
search_fields = ['title', 'caption']
@@ -31,6 +33,7 @@ admin.site.register(LuxImage, LuxImageAdmin)
class LuxGalleryAdmin(OSMGeoAdmin):
+ form = GalleryForm
list_display = ('title', 'location', 'pub_date')
list_filter = ('location',)
diff --git a/app/photos/forms.py b/app/photos/forms.py
index f12ce42..08927cd 100644
--- a/app/photos/forms.py
+++ b/app/photos/forms.py
@@ -13,6 +13,7 @@ except ImportError:
from django import forms
from django.utils.translation import ugettext_lazy as _
+from django.utils.safestring import mark_safe
from django.contrib import messages
from django.core.files.base import ContentFile
from django.contrib.admin import widgets
@@ -28,6 +29,26 @@ from .utils import resize_image
logger = logging.getLogger('photos.forms')
+class GalleryForm(forms.ModelForm):
+ class Meta:
+ model = LuxGallery
+ fields = '__all__'
+ widgets = {
+ 'images': forms.SelectMultiple,
+ }
+
+ def __init__(self, *args, **kwargs):
+ super(GalleryForm, self).__init__(*args, **kwargs)
+
+ images = LuxImage.objects.all()[:100]
+ items = []
+ for image in images:
+ items.append(
+ (image.pk, mark_safe('%s' % image.get_image_name()))
+ )
+ self.fields['images'].choices = items
+ self.fields['images'].allow_tags = True
+
class UploadZipForm(forms.Form):
"""
Handles the uploading of a gallery of photos packed in a .zip file
@@ -129,7 +150,7 @@ class UploadZipForm(forms.Form):
contentfile = ContentFile(data)
image.image.save(filename, contentfile)
image.save()
- gallery.image.add(image)
+ gallery.images.add(image)
with exiftool.ExifTool() as et:
meta = et.get_metadata(image.image.path)
@@ -146,7 +167,10 @@ class UploadZipForm(forms.Form):
try:
image.exif_lens = meta["MakerNotes:LensType"]
except:
- pass
+ try:
+ image.exif_lens = meta["XMP:Lens"]
+ except:
+ pass
try:
image.point = Point(meta["XMP:GPSLongitude"], meta["XMP:GPSLatitude"], srid=4326)
try:
diff --git a/app/photos/migrations/0002_auto_20151216_1958.py b/app/photos/migrations/0002_auto_20151216_1958.py
new file mode 100644
index 0000000..2a2bffb
--- /dev/null
+++ b/app/photos/migrations/0002_auto_20151216_1958.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2015-12-16 19:58
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('photos', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='luxgallery',
+ old_name='image',
+ new_name='images',
+ ),
+ migrations.AlterField(
+ model_name='luxgallery',
+ name='thumb',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gallery_thumb', to='photos.LuxImage'),
+ ),
+ ]
diff --git a/app/photos/migrations/0003_luxgallery_caption_style.py b/app/photos/migrations/0003_luxgallery_caption_style.py
new file mode 100644
index 0000000..b46f970
--- /dev/null
+++ b/app/photos/migrations/0003_luxgallery_caption_style.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9 on 2015-12-17 11:01
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('photos', '0002_auto_20151216_1958'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='luxgallery',
+ name='caption_style',
+ field=models.CharField(blank=True, max_length=400, null=True),
+ ),
+ ]
diff --git a/app/photos/models.py b/app/photos/models.py
index c2d77e4..50ae43b 100644
--- a/app/photos/models.py
+++ b/app/photos/models.py
@@ -43,7 +43,10 @@ class LuxImage(models.Model):
get_latest_by = 'pub_date'
def __str__(self):
- return "%s" % self.pk
+ if self.title:
+ return "%s" % self.title
+ else:
+ return "%s" % self.pk
def get_image_name(self):
return self.image.url.split("galleries/original/")[1]
@@ -80,12 +83,13 @@ class LuxGallery(models.Model):
title = models.CharField(blank=True, max_length=300)
description = models.TextField(blank=True, null=True)
slug = models.CharField(blank=True, max_length=300)
- thumb = models.CharField(blank=True, max_length=300)
- image = models.ManyToManyField(LuxImage)
+ thumb = models.ForeignKey(LuxImage, related_name="gallery_thumb", null=True, blank=True)
+ images = models.ManyToManyField(LuxImage)
pub_date = models.DateTimeField(null=True)
point = models.PointField(null=True, blank=True)
location = models.ForeignKey(Location, null=True, blank=True)
is_public = models.BooleanField(default=True)
+ caption_style = models.CharField(blank=True, null=True, max_length=400)
class Meta:
ordering = ('-pub_date', 'id')
@@ -104,6 +108,18 @@ class LuxGallery(models.Model):
else:
return "/photos/galleries/private/%s" % (self.slug)
+ def latitude(self):
+ return self.point.y
+
+ def longitude(self):
+ return self.point.x
+
+ def thumbs(self):
+ lst = [x.image.name for x in self.images.all()]
+ lst = ["<a href='/media/%s'>%s</a>" % (x, x.split('/')[-1]) for x in lst]
+ return ', '.join(item for item in lst if item)
+ thumbs.allow_tags = True
+
class Photo(models.Model):
description = models.TextField(blank=True, null=True)
diff --git a/app/photos/urls.py b/app/photos/urls.py
index 0c7b752..67375da 100644
--- a/app/photos/urls.py
+++ b/app/photos/urls.py
@@ -16,6 +16,15 @@ urlpatterns = [
name="private"
),
url(
+ r'galleries/private/(?P<page>\d+)/$',
+ views.PrivateGalleryList.as_view(),
+ name="private_list"
+ ),
+ url(
+ r'galleries/private/$',
+ RedirectView.as_view(url="/photos/galleries/private/1/", permanent=False)
+ ),
+ url(
r'galleries/(?P<slug>[-\w]+)/$',
views.gallery,
),
diff --git a/app/photos/views.py b/app/photos/views.py
index 970bbd9..4b89e4c 100644
--- a/app/photos/views.py
+++ b/app/photos/views.py
@@ -10,12 +10,25 @@ from utils.views import PaginatedListView
from django.views.generic import ListView
from django.views.generic.detail import DetailView
+
class PrivateGallery(DetailView):
model = LuxGallery
slug_field = "slug"
template_name = "details/photo_gallery.html"
+class PrivateGalleryList(PaginatedListView):
+ template_name = 'archives/gallery_list.html'
+
+ def get_queryset(self):
+ return LuxGallery.objects.filter(is_public=False)
+
+ def get_context_data(self, **kwargs):
+ # Call the base implementation first to get a context
+ context = super(PrivateGalleryList, self).get_context_data(**kwargs)
+ context['is_private'] = True
+ return context
+
def gallery_list(request, page):
request.page_url = '/photos/%d/'
request.page = int(page)