manager: make it possible to add cells to pages

This commit is contained in:
Frédéric Péters 2014-12-07 17:36:21 +01:00
parent 234950845a
commit 6d005bf533
6 changed files with 63 additions and 2 deletions

View File

@ -14,10 +14,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import inspect
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import ugettext_lazy as _
from ckeditor.fields import RichTextField
from model_utils.managers import InheritanceManager
class Page(models.Model):
@ -29,6 +33,19 @@ class CellBase(models.Model):
page = models.ForeignKey(Page)
order = models.PositiveIntegerField()
objects = InheritanceManager()
@classmethod
def get_cell_content_types(cls):
content_types = []
for symbol in globals().values():
if inspect.isclass(symbol) and issubclass(symbol, cls) and symbol is not cls:
content_types.append({
'name': symbol.__name__, # XXX: add support for verbose name
'content_type': ContentType.objects.get_for_model(symbol),
})
return content_types
class TextCell(CellBase):
text = RichTextField(_('Text'), null=True)

View File

@ -7,4 +7,19 @@
{% block content %}
<h2>Available cells</h2>
<ul>
{% for cell_type in cell_types %}
<li><a href="{% url 'combo-manager-page-add-cell' page_pk=object.id cell_type=cell_type.content_type.id %}">{{ cell_type.name }}</a></li>
{% endfor %}
</ul>
<h2>Configured cells</h2>
<ul>
{% for cell in cells %}
<li>{{ cell }}</li>
{% endfor %}
</ul>
</ul>
{% endblock %}

View File

@ -25,4 +25,6 @@ urlpatterns = patterns('combo.views',
url(r'^pages/add/$', views.page_add, name='combo-manager-page-add'),
url(r'^pages/(?P<pk>\w+)/$', views.page_view,
name='combo-manager-page-view'),
url(r'^pages/(?P<page_pk>\w+)/add-cell/(?P<cell_type>\w+)/$', views.page_add_cell,
name='combo-manager-page-add-cell'),
)

View File

@ -14,9 +14,12 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.views.generic import TemplateView, DetailView, CreateView, ListView
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.views.generic import (TemplateView, RedirectView, DetailView,
CreateView, ListView)
from combo.data.models import Page
from combo.data.models import Page, CellBase
class HomepageView(TemplateView):
@ -43,4 +46,26 @@ class PageView(DetailView):
model = Page
template_name = 'combo/page_view.html'
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
context['cell_types'] = CellBase.get_cell_content_types()
context['cells'] = CellBase.objects.filter(page_id=self.object.id
).order_by('order').select_subclasses()
return context
page_view = PageView.as_view()
class PageAddCellView(RedirectView):
def get_redirect_url(self, page_pk, cell_type):
cell_class = ContentType.objects.get(id=cell_type).model_class()
cell = cell_class(page_id=page_pk)
orders = [x.order for x in CellBase.objects.filter(page_id=page_pk)]
if orders:
cell.order = max(orders)+1
else:
cell.order = 1
cell.save()
return reverse('combo-manager-page-view', kwargs={'pk': page_pk})
page_add_cell = PageAddCellView.as_view()

View File

@ -1,3 +1,4 @@
Django==1.6
django-ckeditor
-e git+http://repos.entrouvert.org/gadjo.git/#egg=gadjo
django-model-utils

View File

@ -60,6 +60,7 @@ setup(
install_requires=['django == 1.6',
'django-ckeditor',
'gadjo',
'django-model-utils',
],
zip_safe=False,
)