diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/TODO | 19 | ||||
-rw-r--r-- | app/photos/admin.py | 5 | ||||
-rw-r--r-- | app/photos/forms.py | 28 | ||||
-rw-r--r-- | app/photos/migrations/0002_auto_20151216_1958.py | 26 | ||||
-rw-r--r-- | app/photos/migrations/0003_luxgallery_caption_style.py | 20 | ||||
-rw-r--r-- | app/photos/models.py | 22 | ||||
-rw-r--r-- | app/photos/urls.py | 9 | ||||
-rw-r--r-- | app/photos/views.py | 13 |
8 files changed, 123 insertions, 19 deletions
@@ -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) |