manager: make it possible to add cells to pages
This commit is contained in:
parent
234950845a
commit
6d005bf533
|
@ -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)
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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'),
|
||||
)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
Django==1.6
|
||||
django-ckeditor
|
||||
-e git+http://repos.entrouvert.org/gadjo.git/#egg=gadjo
|
||||
django-model-utils
|
||||
|
|
Loading…
Reference in New Issue