general: add possibility to attach a picture to pages (#16337)
This commit is contained in:
parent
14eda4eafb
commit
9dea315a53
|
@ -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
|
||||
|
|
|
@ -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'),
|
||||
),
|
||||
]
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -301,3 +301,7 @@ span.extra-info {
|
|||
font-size: 80%;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
img.page-picture {
|
||||
max-width: 95%;
|
||||
}
|
||||
|
|
|
@ -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 -->
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -59,6 +59,7 @@ INSTALLED_APPS = (
|
|||
'rest_framework',
|
||||
'ckeditor',
|
||||
'gadjo',
|
||||
'sorl.thumbnail',
|
||||
'cmsplugin_blurp',
|
||||
'combo.data',
|
||||
'combo.profile',
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -11,3 +11,4 @@ python-dateutil
|
|||
djangorestframework>=3.3, <3.4
|
||||
django-haystack
|
||||
whoosh
|
||||
sorl-thumbnail
|
||||
|
|
2
setup.py
2
setup.py
|
@ -116,6 +116,8 @@ setup(
|
|||
'djangorestframework>=3.3, <3.4',
|
||||
'django-haystack',
|
||||
'whoosh',
|
||||
'sorl-thumbnail',
|
||||
'Pillow',
|
||||
],
|
||||
zip_safe=False,
|
||||
cmdclass={
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 558 B |
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue