From c38ab9a9b4b3b2995baef20dbd950c0900d2b118 Mon Sep 17 00:00:00 2001 From: reverend Date: Wed, 28 Dec 2022 15:57:52 +0100 Subject: [PATCH] Upload image to gallery and view images through galleries --- django_web_galleries/web_galleries/forms.py | 7 +- django_web_galleries/web_galleries/models.py | 7 -- .../templates/gallery/gallery_detail.html | 3 +- .../templates/gallery/upload_image.html | 14 +++ django_web_galleries/web_galleries/urls.py | 6 +- django_web_galleries/web_galleries/views.py | 102 +++++++++++++++++- 6 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 django_web_galleries/web_galleries/templates/gallery/upload_image.html diff --git a/django_web_galleries/web_galleries/forms.py b/django_web_galleries/web_galleries/forms.py index 7821d31..faeda76 100644 --- a/django_web_galleries/web_galleries/forms.py +++ b/django_web_galleries/web_galleries/forms.py @@ -30,4 +30,9 @@ class AccessCodeForm(forms.Form): access_code = forms.CharField(max_length=32) class VisitorNameForm(forms.Form): - name = forms.CharField(max_length=50) \ No newline at end of file + name = forms.CharField(max_length=50) + +class ImageUploadForm(forms.Form): + images = forms.ImageField( + widget=forms.ClearableFileInput(attrs={'multiple': True}) + ) \ No newline at end of file diff --git a/django_web_galleries/web_galleries/models.py b/django_web_galleries/web_galleries/models.py index e6aed26..23c07bc 100644 --- a/django_web_galleries/web_galleries/models.py +++ b/django_web_galleries/web_galleries/models.py @@ -72,13 +72,6 @@ class Gallery(models.Model): def __str__(self): return self.title - def mettwurst(self): - if self.private and access_code is None: - raise ValidationErrorr('Private gallery needs an access code') - if len(self.visitors.all()) > 10: - raise ValidationError('Gallery can not have more than 10 visitors assigned') - - class Image(models.Model): """ An image contains the path to the image file and several information diff --git a/django_web_galleries/web_galleries/templates/gallery/gallery_detail.html b/django_web_galleries/web_galleries/templates/gallery/gallery_detail.html index ff4aea2..80feddc 100644 --- a/django_web_galleries/web_galleries/templates/gallery/gallery_detail.html +++ b/django_web_galleries/web_galleries/templates/gallery/gallery_detail.html @@ -6,10 +6,11 @@ {% if gallery.title %}

{{gallery.title}}

{% endif %} + Upload image to this gallery
  • {% for image in gallery.images.all %} - + {% endfor %} diff --git a/django_web_galleries/web_galleries/templates/gallery/upload_image.html b/django_web_galleries/web_galleries/templates/gallery/upload_image.html new file mode 100644 index 0000000..eafc0f8 --- /dev/null +++ b/django_web_galleries/web_galleries/templates/gallery/upload_image.html @@ -0,0 +1,14 @@ +{% extends '../global.html' %} + +{% block content %} +
    + {% csrf_token %} +

    Upload image to "{{gallery.title}}"

    +
    + {% include 'partials/form_input.html' with field=form.images %} +
    +
    + +
    +
    +{% endblock content %} \ No newline at end of file diff --git a/django_web_galleries/web_galleries/urls.py b/django_web_galleries/web_galleries/urls.py index 1adf16b..e6df269 100644 --- a/django_web_galleries/web_galleries/urls.py +++ b/django_web_galleries/web_galleries/urls.py @@ -10,7 +10,9 @@ from .views import ( ImageDetailView, GainAccessToGalleryView, VisitorSettingsView, - RevokeAccessToGallery + RevokeAccessToGallery, + UploadToGalleryView, + ImageThroughGalleryView ) urlpatterns = [ @@ -24,4 +26,6 @@ urlpatterns = [ path('gallery/gain_access//', GainAccessToGalleryView.as_view(), name='gallery_gain_access'), path('visitor/my_profile', VisitorSettingsView.as_view(), name='visitor_profile'), path('gallery/revoke_access//', RevokeAccessToGallery.as_view(), name='gallery_revoke_access'), + path('gallery/upload/', UploadToGalleryView.as_view(), name='gallery_upload'), + path('gallery/image//', ImageThroughGalleryView.as_view(), name='image_through_gallery') ] diff --git a/django_web_galleries/web_galleries/views.py b/django_web_galleries/web_galleries/views.py index c641bc2..48b6798 100644 --- a/django_web_galleries/web_galleries/views.py +++ b/django_web_galleries/web_galleries/views.py @@ -15,7 +15,8 @@ from .forms import ( ImageUploadForm, GalleryCreatingForm, AccessCodeForm, - VisitorNameForm + VisitorNameForm, + ImageUploadForm ) from .models import ( Image, @@ -94,7 +95,7 @@ class ImageUploadView(VisitorSessionMixin, View): } ) -class PublicImageListView(ListView): +class PublicImageListView(VisitorSessionMixin, ListView): model = Image paginate_by = 20 context_object_name = 'images' @@ -107,6 +108,7 @@ class MyImagesListView(VisitorSessionMixin, View): def get(self, request): visitor = self.get_visitor() uploaded_images = Image.objects.all().filter( + uploaded_by=self.get_visitor() ) shared_images = Image.objects.all().filter( @@ -165,7 +167,12 @@ class GalleryCreateView(VisitorSessionMixin, View): gallery.save() return redirect( - reverse('home') + reverse( + 'gallery', + kwargs={ + 'pk': gallery.id + } + ) ) else: form = ImageUploadForm() @@ -234,6 +241,42 @@ class ImageDetailView(VisitorSessionMixin, UserPassesTestMixin, DetailView): reverse('home') ) +class ImageThroughGalleryView(VisitorSessionMixin, View): + def _redirect_gallery_no_access(self, gallery): + return redirect( + reverse( + 'gallery_gain_access', + kwargs={ + 'gallery_id': gallery.id + } + ) + ) + + def get(self, request, gallery_id, image_id): + gallery = get_object_or_404(Gallery, id=gallery_id) + if self.get_visitor() in gallery.visitors.all() or self.get_visitor() == gallery.created_by: + image = get_object_or_404(Image, id=image_id) + if image in gallery.images.all(): + return render( + request, + 'image/image_detail.html', + { + 'image': image, + 'visitor': self.get_visitor() + } + ) + else: + return redirect( + reverse( + 'gallery', + kwargs={ + 'pk': gallery.id + } + ) + ) + else: + return self._redirect_gallery_no_access(gallery) + class GainAccessToGalleryView(VisitorSessionMixin, View): def _redirect_to_gallery(self, gallery): return redirect( @@ -351,3 +394,56 @@ class VisitorSettingsView(VisitorSessionMixin, View): 'visitor': self.get_visitor() } ) + +class UploadToGalleryView(VisitorSessionMixin, View): + def get(self, request, gallery_id): + upload_form = ImageUploadForm() + gallery = get_object_or_404(Gallery, id=gallery_id) + + return render( + request, + 'gallery/upload_image.html', + { + 'form': upload_form, + 'gallery': gallery + } + ) + + def post(self, request, gallery_id): + upload_form = ImageUploadForm( + request.POST, + request.FILES + ) + + if upload_form.is_valid(): + gallery = get_object_or_404(Gallery, id=gallery_id) + + for image in request.FILES.getlist('images'): + imageObject = Image.objects.create( + image_file=image, + uploaded_by=self.get_visitor(), + private=gallery.private, + access_code=gallery.access_code + + ) + imageObject.galleries.add(gallery) + imageObject.save() + + gallery.save() + return redirect( + reverse( + 'gallery', + kwargs={ + 'pk': gallery.id + } + ) + ) + else: + return render( + request, + 'gallery/upload_image.html', + { + 'form': upload_form, + 'gallery': gallery + } + ) \ No newline at end of file