general: add possibility to attach a picture to pages (#16337)

This commit is contained in:
Frédéric Péters 2017-05-15 14:10:06 +02:00 committed by Thomas NOEL
parent 14eda4eafb
commit 9dea315a53
14 changed files with 99 additions and 3 deletions

View File

@ -24,6 +24,8 @@ recursive-include combo/apps/wcs/templates *.html
recursive-include combo/manager/templates *.html
recursive-include combo/public/templates *.html
recursive-include tests/data *.jpeg
include COPYING README
include MANIFEST.in
include VERSION

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('data', '0026_jsoncell_force_async'),
]
operations = [
migrations.AddField(
model_name='page',
name='picture',
field=models.ImageField(upload_to=b'page-pictures/', null=True, verbose_name='Picture'),
),
]

View File

@ -92,6 +92,8 @@ class Page(models.Model):
groups = models.ManyToManyField(Group, verbose_name=_('Groups'), blank=True)
last_update_timestamp = models.DateTimeField(auto_now=True)
picture = models.ImageField(_('Picture'), upload_to='page-pictures/', null=True)
_level = None
_children = None

View File

@ -43,6 +43,12 @@ class PageEditSlugForm(forms.ModelForm):
return value
class PageEditPictureForm(forms.ModelForm):
class Meta:
model = Page
fields = ('picture',)
class PageVisibilityForm(forms.ModelForm):
class Meta:
model = Page

View File

@ -301,3 +301,7 @@ span.extra-info {
font-size: 80%;
opacity: 0.5;
}
img.page-picture {
max-width: 95%;
}

View File

@ -1,6 +1,7 @@
{% extends "combo/manager_base.html" %}
{% load i18n %}
{% load cells %}
{% load thumbnail %}
{% block appbar %}
<h2>{% trans 'Page' %} - {{ object.title }}</h2>
@ -57,6 +58,17 @@
(<a rel="popup" href="{% url 'combo-manager-page-edit-redirection' pk=object.id %}">{% trans 'change' %}</a>)
</p>
<p>
<label>{% trans 'Picture:' %}</label>
{% if object.picture %}
{% thumbnail object.picture "320x240" crop="50% 25%" as im %}
<img class="page-picture" src="{{im.url}}"/>
(<a href="{% url 'combo-manager-page-remove-picture' pk=object.id %}">{% trans 'remove' %}</a>)
{% endthumbnail %}
{% else %}<i>{% trans 'none' %}</i>{% endif %}
(<a rel="popup" href="{% url 'combo-manager-page-edit-picture' pk=object.id %}">{% trans 'change' %}</a>)
</p>
</div>
</div> <!-- #sidebar -->

View File

@ -39,6 +39,10 @@ urlpatterns = [
name='combo-manager-page-edit-slug'),
url(r'^pages/(?P<pk>\w+)/title$', views.page_edit_title,
name='combo-manager-page-edit-title'),
url(r'^pages/(?P<pk>\w+)/picture/$', views.page_edit_picture,
name='combo-manager-page-edit-picture'),
url(r'^pages/(?P<pk>\w+)/remove-picture/$', views.page_remove_picture,
name='combo-manager-page-remove-picture'),
url(r'^pages/(?P<pk>\w+)/delete$', views.page_delete,
name='combo-manager-page-delete'),
url(r'^pages/(?P<pk>\w+)/export$', views.page_export,

View File

@ -23,7 +23,7 @@ from django.conf import settings
from django.core.files.storage import default_storage
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponse, Http404
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import force_text
@ -38,7 +38,7 @@ from combo import plugins
from .forms import (PageEditTitleForm, PageVisibilityForm, SiteImportForm,
PageEditRedirectionForm, PageSelectTemplateForm, PageEditSlugForm,
PageEditExcludeFromNavigationForm)
PageEditPictureForm, PageEditExcludeFromNavigationForm)
class HomepageView(ListView):
@ -168,6 +168,25 @@ class PageVisibilityView(PageEditView):
page_visibility = PageVisibilityView.as_view()
class PageEditPictureView(PageEditView):
form_class = PageEditPictureForm
page_edit_picture = PageEditPictureView.as_view()
class PageRemovePictureView(DetailView):
model = Page
def get(self, *args, **kwargs):
page = self.get_object()
page.picture = None
page.save()
return HttpResponseRedirect(reverse('combo-manager-page-view', kwargs={'pk': page.id}))
page_remove_picture = PageRemovePictureView.as_view()
class PageView(DetailView):
model = Page
template_name = 'combo/page_view.html'

View File

@ -59,6 +59,7 @@ INSTALLED_APPS = (
'rest_framework',
'ckeditor',
'gadjo',
'sorl.thumbnail',
'cmsplugin_blurp',
'combo.data',
'combo.profile',

4
debian/control vendored
View File

@ -17,7 +17,9 @@ Depends: ${misc:Depends}, ${python:Depends},
python-django-cmsplugin-blurp,
python-xstatic-chartnew-js,
python-eopayment (>= 1.9),
python-django-haystack (>= 2.4.0)
python-django-haystack (>= 2.4.0),
python-sorl-thumbnail,
python-pil
Recommends: python-django-mellon, python-whoosh
Conflicts: python-lingo
Description: Portal Management System (Python module)

View File

@ -11,3 +11,4 @@ python-dateutil
djangorestframework>=3.3, <3.4
django-haystack
whoosh
sorl-thumbnail

View File

@ -116,6 +116,8 @@ setup(
'djangorestframework>=3.3, <3.4',
'django-haystack',
'whoosh',
'sorl-thumbnail',
'Pillow',
],
zip_safe=False,
cmdclass={

BIN
tests/data/black.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

View File

@ -18,6 +18,8 @@ from combo.apps.search.models import SearchCell
pytestmark = pytest.mark.django_db
TESTS_DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
@pytest.fixture
def admin_user():
try:
@ -136,6 +138,26 @@ def test_page_edit_slug(app, admin_user):
assert 'Slug must be unique' in resp.body
assert Page.objects.get(id=page.id).slug == 'two2'
def test_page_edit_picture(app, admin_user):
Page.objects.all().delete()
page = Page(title='One', slug='one', template_name='standard')
page.save()
app = login(app)
resp = app.get('/manage/pages/%s/' % page.id)
resp = resp.click(href='.*/picture/')
resp.form['picture'] = Upload('black.jpeg',
open(os.path.join(TESTS_DATA_DIR, 'black.jpeg')).read(), 'image/jpeg')
resp = resp.form.submit()
assert resp.location == 'http://testserver/manage/pages/%s/' % page.id
resp = resp.follow()
assert '<h2>Page - One</h2>' in resp.body
assert '<img' in resp.body
resp = resp.click(href='.*/remove-picture/')
resp = resp.follow()
assert '<h2>Page - One</h2>' in resp.body
assert not '<img' in resp.body
def test_delete_page(app, admin_user):
Page.objects.all().delete()
page = Page(title='One', slug='one', template_name='standard')