summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/views/editor_helpers.py111
-rw-r--r--core/views/expo.py2
2 files changed, 112 insertions, 1 deletions
diff --git a/core/views/editor_helpers.py b/core/views/editor_helpers.py
new file mode 100644
index 0000000..e0ff5cd
--- /dev/null
+++ b/core/views/editor_helpers.py
@@ -0,0 +1,111 @@
+from django.shortcuts import render, redirect
+from django.http import HttpResponse, HttpResponseRedirect, Http404, JsonResponse
+
+from django.urls import reverse, resolve
+from django.template import Context, loader
+import re, io
+from PIL import Image
+from pathlib import Path
+import django.forms as forms
+import troggle.settings as settings
+
+from troggle.lib import version_control
+
+MAX_IMAGE_WIDTH = 1000
+MAX_IMAGE_HEIGTH = 800
+
+THUMBNAIL_WIDTH = 200
+THUMBNAIL_HEIGTH = 200
+
+def image_selector(request, path):
+ '''Returns available images'''
+ directory = path.rsplit('/', 1)[0]
+ thumbnailspath = Path(settings.EXPOWEB) / directory / "t"
+ thumbnails = []
+ for f in thumbnailspath.iterdir():
+ if f.is_file():
+ thumbnail_url = reverse('expopage', args=["%s/t/%s" % (directory, f.name)])
+ name_base = f.name.rsplit('.', 1)[0]
+ page_path_base = Path(settings.EXPOWEB) / directory / "l"
+ if ((page_path_base / ("%s.htm" % name_base)).is_file()):
+ page_url = reverse('expopage', args=["%s/l/%s.htm" % (directory, name_base)])
+ else:
+ page_url = reverse('expopage', args=["%s/l/%s.html" % (directory, name_base)])
+
+ thumbnails.append({"thumbnail_url": thumbnail_url, "page_url": page_url})
+
+ return render(request, 'image_selector.html', {'thumbnails': thumbnails})
+
+def new_image_form(request, path):
+ '''Manages a form to upload new images'''
+ directory = path.rsplit('/', 1)[0]
+ if request.method == 'POST':
+ form = NewWebImageForm(request.POST, request.FILES, directory = directory)
+ if form.is_valid():
+ f = request.FILES["file_"]
+ binary_data = io.BytesIO()
+ for chunk in f.chunks():
+ binary_data.write(chunk)
+ i = Image.open(binary_data)
+ width, height = i.size
+ if width > MAX_IMAGE_WIDTH or height > MAX_IMAGE_HEIGTH:
+ scale = max(width / MAX_IMAGE_WIDTH, height / MAX_IMAGE_HEIGTH)
+ i = i.resize((int(width / scale), int(height / scale)), Image.ANTIALIAS)
+ tscale = max(width / THUMBNAIL_WIDTH, height / THUMBNAIL_HEIGTH)
+ thumbnail = i.resize((int(width / tscale), int(height / tscale)), Image.ANTIALIAS)
+ ib = io.BytesIO()
+ i.save(ib, format="png")
+ tb = io.BytesIO()
+ thumbnail.save(tb, format="png")
+ image_rel_path, thumb_rel_path, desc_rel_path = form.get_rel_paths()
+ image_page_template = loader.get_template('image_page_template.html')
+ image_page = image_page_template.render({'header': form.cleaned_data["header"], 'description': form.cleaned_data["description"],
+ 'photographer': form.cleaned_data["photographer"], 'year': form.cleaned_data["year"],
+ 'filepath': f'/{image_rel_path}'
+ })
+ image_path, thumb_path, desc_path = form.get_full_paths()
+ try:
+ change_message = form.cleaned_data["change_message"]
+ version_control.write_and_commit([(desc_path, image_page, "utf-8"),
+ (image_path, ib.getbuffer(), False),
+ (thumb_path, tb.getbuffer(), False)],
+ f'{change_message} - online adding of an image')
+ except version_control.WriteAndCommitError as e:
+ return JsonResponse({"error": e.message})
+ linked_image_template = loader.get_template('linked_image_template.html')
+ html_snippet = linked_image_template.render({'thumbnail_url': f'/{thumb_rel_path}', 'page_url': f'/{desc_rel_path}'}, request)
+ return JsonResponse({"html": html_snippet})
+ else:
+ form = NewWebImageForm(directory = directory)
+ template = loader.get_template('new_image_form.html')
+ htmlform = template.render({'form': form, 'path': path}, request)
+ return JsonResponse({"form": htmlform})
+
+class NewWebImageForm(forms.Form):
+ '''The form used by the editexpopage function
+ '''
+ header = forms.CharField(widget=forms.TextInput(attrs={'size':'60', 'placeholder': "Enter title (displayed as a header and in the tab)"}))
+ file_ = forms.FileField()
+ description = forms.CharField(widget=forms.Textarea(attrs={"cols":80, "rows":20, 'placeholder': "Describe the photo (using HTML)"}))
+ photographer = forms.CharField(widget=forms.TextInput(attrs={'size':'60', 'placeholder': "Photographers name"}), required = False)
+ year = forms.CharField(widget=forms.TextInput(attrs={'size':'60', 'placeholder': "Year photo was taken"}), required = False)
+ change_message = forms.CharField(widget=forms.Textarea(attrs={"cols":80, "rows":3, 'placeholder': "Descibe the change made (for git)"}))
+
+ def __init__(self, *args, **kwargs):
+ self.directory = Path(kwargs.pop('directory'))
+ super(forms.Form, self).__init__(*args, **kwargs)
+
+ def get_rel_paths(self):
+ f = self.cleaned_data['file_']
+ return [self.directory / "i" / (f.name.rsplit('.', 1)[0] + ".png"),
+ self.directory / "t" / (f.name.rsplit('.', 1)[0] + ".png"),
+ self.directory / "l" / (f.name.rsplit('.', 1)[0] + ".html")]
+
+ def get_full_paths(self):
+ return [Path(settings.EXPOWEB) / x for x in self.get_rel_paths()]
+
+ def clean_file_(self):
+ for rel_path, full_path in zip(self.get_rel_paths(), self.get_full_paths()):
+ if full_path.exists():
+ raise forms.ValidationError("File already exists in %s" % rel_path)
+ return self.cleaned_data['file_']
diff --git a/core/views/expo.py b/core/views/expo.py
index 00cb6dc..91919a5 100644
--- a/core/views/expo.py
+++ b/core/views/expo.py
@@ -359,7 +359,7 @@ def editexpopage(request, path):
if result != html: # Check if content changed
try:
change_message = pageform.cleaned_data["change_message"]
- version_control.write_and_commit(filepath, result, f'{change_message} - online edit of {path}')
+ version_control.write_and_commit([(filepath, result, "utf-8")], f'{change_message} - online edit of {path}')
except version_control.WriteAndCommitError as e:
return render(request,'errors/generic.html', {'message': e.message})