You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

371 lines
13 KiB

import json
from django import forms
from django.conf import settings
from django.shortcuts import HttpResponse
from django.contrib import admin
from django.contrib.sites.models import Site
from django.contrib import messages
from django.utils.translation import ungettext, ugettext_lazy as _
from .models import Gallery, Photo, GalleryUpload, PhotoEffect, PhotoSize, \
Watermark
MULTISITE = getattr(settings, 'PHOTOLOGUE_MULTISITE', False)
ENABLE_TAGS = getattr(settings, 'PHOTOLOGUE_ENABLE_TAGS', False)
"""
class GalleryAdminForm(forms.ModelForm):
class Meta:
model = Gallery
if MULTISITE:
exclude = []
else:
exclude = ['sites']
if not ENABLE_TAGS:
exclude.append('tags')
class GalleryAdmin(admin.ModelAdmin):
list_display = ('title', 'date_added', 'photo_count', 'is_public')
list_filter = ['date_added', 'is_public']
if MULTISITE:
list_filter.append('sites')
date_hierarchy = 'date_added'
prepopulated_fields = {'slug': ('title',)}
form = GalleryAdminForm
if MULTISITE:
filter_horizontal = ['sites']
if MULTISITE:
actions = [
'add_to_current_site',
'add_photos_to_current_site',
'remove_from_current_site',
'remove_photos_from_current_site'
]
def formfield_for_manytomany(self, db_field, request, **kwargs):
''' Set the current site as initial value. '''
if db_field.name == "sites":
kwargs["initial"] = [Site.objects.get_current()]
return super(GalleryAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
def save_related(self, request, form, *args, **kwargs):
'''
If the user has saved a gallery with a photo that belongs only to
different Sites - it might cause much confusion. So let them know.
'''
super(GalleryAdmin, self).save_related(request, form, *args, **kwargs)
orphaned_photos = form.instance.orphaned_photos()
if orphaned_photos:
msg = ungettext(
'The following photo does not belong to the same site(s)'
' as the gallery, so will never be displayed: %(photo_list)s.',
'The following photos do not belong to the same site(s)'
' as the gallery, so will never be displayed: %(photo_list)s.',
len(orphaned_photos)
) % {'photo_list': ", ".join([photo.title for photo in orphaned_photos])}
messages.warning(request, msg)
def add_to_current_site(modeladmin, request, queryset):
current_site = Site.objects.get_current()
current_site.gallery_set.add(*queryset)
msg = ungettext(
"The gallery has been successfully added to %(site)s",
"The galleries have been successfully added to %(site)s",
len(queryset)
) % {'site': current_site.name}
messages.success(request, msg)
add_to_current_site.short_description = \
_("Add selected galleries from the current site")
def remove_from_current_site(modeladmin, request, queryset):
current_site = Site.objects.get_current()
current_site.gallery_set.remove(*queryset)
msg = ungettext(
"The gallery has been successfully removed from %(site)s",
"The selected galleries have been successfully removed from %(site)s",
len(queryset)
) % {'site': current_site.name}
messages.success(request, msg)
remove_from_current_site.short_description = \
_("Remove selected galleries from the current site")
def add_photos_to_current_site(modeladmin, request, queryset):
photos = Photo.objects.filter(galleries__in=queryset)
current_site = Site.objects.get_current()
current_site.photo_set.add(*photos)
msg = ungettext(
'All photos in gallery %(galleries)s have been successfully added to %(site)s',
'All photos in galleries %(galleries)s have been successfully added to %(site)s',
len(queryset)
) % {
'site': current_site.name,
'galleries': ", ".join(["'{0}'".format(gallery.title)
for gallery in queryset])
}
messages.success(request, msg)
add_photos_to_current_site.short_description = \
_("Add all photos of selected galleries to the current site")
def remove_photos_from_current_site(modeladmin, request, queryset):
photos = Photo.objects.filter(galleries__in=queryset)
current_site = Site.objects.get_current()
current_site.photo_set.remove(*photos)
msg = ungettext(
'All photos in gallery %(galleries)s have been successfully removed from %(site)s',
'All photos in galleries %(galleries)s have been successfully removed from %(site)s',
len(queryset)
) % {
'site': current_site.name,
'galleries': ", ".join(["'{0}'".format(gallery.title)
for gallery in queryset])
}
messages.success(request, msg)
remove_photos_from_current_site.short_description = \
_("Remove all photos in selected galleries from the current site")
admin.site.register(Gallery, GalleryAdmin)
class GalleryUploadAdmin(admin.ModelAdmin):
def has_change_permission(self, request, obj=None):
return False # To remove the 'Save and continue editing' button
def save_model(self, request, obj, form, change):
# Warning the user when things go wrong in a zip upload.
obj.request = request
obj.save()
admin.site.register(GalleryUpload, GalleryUploadAdmin)
class PhotoAdminForm(forms.ModelForm):
class Meta:
model = Photo
if MULTISITE:
exclude = []
else:
exclude = ['sites']
if not ENABLE_TAGS:
exclude.append('tags')
class PhotoAdmin(admin.ModelAdmin):
list_display = ('title', 'date_taken', 'date_added',
'is_public', 'tags', 'view_count', 'admin_thumbnail')
list_filter = ['date_added', 'is_public']
if MULTISITE:
list_filter.append('sites')
search_fields = ['title', 'slug', 'caption']
list_per_page = 10
prepopulated_fields = {'slug': ('title',)}
form = PhotoAdminForm
if MULTISITE:
filter_horizontal = ['sites']
if MULTISITE:
actions = ['add_photos_to_current_site', 'remove_photos_from_current_site']
def formfield_for_manytomany(self, db_field, request, **kwargs):
''' Set the current site as initial value. '''
if db_field.name == "sites":
kwargs["initial"] = [Site.objects.get_current()]
return super(PhotoAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
def add_photos_to_current_site(modeladmin, request, queryset):
current_site = Site.objects.get_current()
current_site.photo_set.add(*queryset)
msg = ungettext(
'The photo has been successfully added to %(site)s',
'The selected photos have been successfully added to %(site)s',
len(queryset)
) % {'site': current_site.name}
messages.success(request, msg)
add_photos_to_current_site.short_description = \
_("Add selected photos to the current site")
def remove_photos_from_current_site(modeladmin, request, queryset):
current_site = Site.objects.get_current()
current_site.photo_set.remove(*queryset)
msg = ungettext(
'The photo has been successfully removed from %(site)s',
'The selected photos have been successfully removed from %(site)s',
len(queryset)
) % {'site': current_site.name}
messages.success(request, msg)
remove_photos_from_current_site.short_description = \
_("Remove selected photos from the current site")
admin.site.register(Photo, PhotoAdmin)
class PhotoEffectAdmin(admin.ModelAdmin):
list_display = ('name', 'description', 'color', 'brightness',
'contrast', 'sharpness', 'filters', 'admin_sample')
fieldsets = (
(None, {
'fields': ('name', 'description')
}),
('Adjustments', {
'fields': ('color', 'brightness', 'contrast', 'sharpness')
}),
('Filters', {
'fields': ('filters',)
}),
('Reflection', {
'fields': ('reflection_size', 'reflection_strength', 'background_color')
}),
('Transpose', {
'fields': ('transpose_method',)
}),
)
admin.site.register(PhotoEffect, PhotoEffectAdmin)
class PhotoSizeAdmin(admin.ModelAdmin):
list_display = ('name', 'width', 'height', 'crop', 'pre_cache', 'effect', 'increment_count')
fieldsets = (
(None, {
'fields': ('name', 'width', 'height', 'quality')
}),
('Options', {
'fields': ('upscale', 'crop', 'pre_cache', 'increment_count')
}),
('Enhancements', {
'fields': ('effect', 'watermark',)
}),
)
admin.site.register(PhotoSize, PhotoSizeAdmin)
class WatermarkAdmin(admin.ModelAdmin):
list_display = ('name', 'opacity', 'style')
admin.site.register(Watermark, WatermarkAdmin)
"""
#------------------EXPOMAP VIEWS----------------------------------------------
from django.views.generic import ListView, FormView
from forms import PhotoForm, GalleryForm
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponseRedirect
class AdminViewObject(FormView):
"""
need overwrite get_form method for every class
"""
form_class = None
model = None
template_name = None
success_url = None
obj = None
def set_obj(self):
"""
this method must be called in get_form method
to determine if we changing or creating
"""
slug = self.kwargs.get('slug')
if slug:
obj = get_object_or_404(self.model, slug=slug)
self.obj =obj
else:
self.obj = None
def form_valid(self, form):
self.set_obj()
form.save(obj=self.obj)
return HttpResponseRedirect(self.success_url)
def get_context_data(self, **kwargs):
context = super(AdminViewObject, self).get_context_data(**kwargs)
context['object'] = self.obj
context['languages'] = settings.LANGUAGES
return context
class PhotoView(AdminViewObject):
model = Photo
form_class = PhotoForm
template_name = 'photogallery/admin_photo.html'
success_url = '/admin/photogallery/photo/all/'
def get_form(self, form_class):
if self.request.POST:
return super(PhotoView, self).get_form(form_class)
self.set_obj()
if self.obj:
photo = self.obj
data = {}
data['image'] = photo.image.url
for code, name in settings.LANGUAGES:
obj = Photo._meta.translations_model.objects.get(language_code = code,master__id=getattr(photo, 'id')) #access to translated fields
data['title_%s' % code] = obj.title
data['caption_%s' % code] = obj.caption
#form.fields['tag'].widget.attrs['data-init-text'] = [item.name for item in article.tag.all()]
return form_class(data)
else:
return form_class()
class GalleryView(AdminViewObject):
model = Gallery
form_class = GalleryForm
template_name = 'photogallery/admin_gallery.html'
success_url = '/admin/photogallery/gallery/all/'
def get_form(self, form_class):
if self.request.POST:
return super(GalleryView, self).get_form(form_class)
self.set_obj()
if self.obj:
gallery = self.obj
data = {}
for code, name in settings.LANGUAGES:
obj = Gallery._meta.translations_model.objects.get(language_code = code,master__id=getattr(gallery, 'id')) #access to translated fields
data['title_%s' % code] = obj.title
data['description_%s' % code] = obj.description
#form.fields['tag'].widget.attrs['data-init-text'] = [item.name for item in article.tag.all()]
return form_class(data)
else:
return form_class()
class PhotoListView(ListView):
paginate_by = settings.ADMIN_PAGINATION
model = Photo
template_name = 'photogallery/admin_photo_list.html'
class GalleryListView(ListView):
paginate_by = settings.ADMIN_PAGINATION
model = Gallery
template_name = 'photogallery/admin_gallery_list.html'
def delete_photo(request, photo_id):
photo = get_object_or_404(Photo, pk=photo_id)
photo.delete()
response = {'success': True}
return HttpResponse(json.dumps(response), content_type='application/json')