import json from django.conf import settings from django.shortcuts import HttpResponse, get_object_or_404 from django.views.generic import ListView, FormView from django.http import HttpResponseRedirect from .models import Gallery, Photo from .forms import PhotoForm, GalleryForm from sorl.thumbnail import get_thumbnail MULTISITE = getattr(settings, 'PHOTOLOGUE_MULTISITE', False) ENABLE_TAGS = getattr(settings, 'PHOTOLOGUE_ENABLE_TAGS', False) 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 = 'c_admin/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 data['sort'] = photo.sort 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 return form_class(data) else: return form_class() class GalleryView(AdminViewObject): model = Gallery form_class = GalleryForm template_name = 'c_admin/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 return form_class(data) else: return form_class() class PhotoListView(ListView): paginate_by = settings.ADMIN_PAGINATION model = Photo template_name = 'c_admin/photogallery/admin_photo_list.html' class GalleryListView(ListView): paginate_by = settings.ADMIN_PAGINATION model = Gallery template_name = 'c_admin/photogallery/admin_gallery_list.html' def upload_photo(request, id, Model): """ uploading photo to some instance of Model instance must have upload_photo method, which download photo """ def get_images_list(obj): """ :param obj: instance of Model :return: images list """ images = [] if obj.photogallery: for img in obj.photogallery.photos.all(): im = get_thumbnail( img.image, '188x143', crop='center', quality=99 ) images.append({ 'name': img.title or img.image.name, 'size': img.image.size, 'file': im.url, 'type': 'image', 'remove_url': img.get_delete_url(), 'detail_link': img.admin_url() }) return images data = {'success': False} obj = get_object_or_404(Model, pk=id) if request.is_ajax() and request.method == 'POST': form = PhotoForm(request.POST, request.FILES) if form.is_valid(): photo = form.save() obj.upload_photo(photo) im = get_thumbnail( photo.image, '188x143', crop='center', quality=99 ) data['success'] = True data['name'] = photo.title or photo.image.name data['size'] = photo.image.size data['file'] = im.url data['type'] = 'image' data['remove_url'] = photo.get_delete_url() data['detail_link'] = photo.admin_url() else: data['errors'] = form.errors elif request.is_ajax() and request.method == 'GET': data['success'] = True data['files'] = get_images_list(obj) return HttpResponse(json.dumps(data), content_type='application/json') 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')