From 21b9161bc99caf217775a1a6f2bce3c21d2c6190 Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Tue, 6 Sep 2016 18:01:09 +0200 Subject: [PATCH] review backoffice homepage and announce management (#12908) --- corbo/manage_urls.py | 7 +- corbo/models.py | 6 ++ corbo/static/css/corbo.css | 59 +++++++++---- corbo/templates/corbo/category_detail.html | 44 ++++++++++ corbo/templates/corbo/manage.html | 133 ++++++++--------------------- corbo/views.py | 60 ++++++------- 6 files changed, 167 insertions(+), 142 deletions(-) create mode 100644 corbo/templates/corbo/category_detail.html diff --git a/corbo/manage_urls.py b/corbo/manage_urls.py index f0e1538..089fc1e 100644 --- a/corbo/manage_urls.py +++ b/corbo/manage_urls.py @@ -1,7 +1,8 @@ from django.conf.urls import patterns, include, url from .views import add_announce, edit_announce, delete_announce, \ - add_category, edit_category, delete_category, manage, menu_json + add_category, edit_category, view_category, delete_category, manage, \ + add_announce_for_category, menu_json urlpatterns = patterns('', url(r'^$', manage, name='manage'), @@ -10,6 +11,10 @@ urlpatterns = patterns('', name='edit_announce'), url(r'^announce/delete/(?P\d+)$', delete_announce, name='delete_announce'), + url(r'^category/(?P\d+)/$', view_category, + name='view_category'), + url(r'^category/(?P\d+)/announce/$', add_announce_for_category, + name='add_announce_for_category'), url(r'^category/add$', add_category, name='add_category'), url(r'^category/edit/(?P\d+)$', edit_category, diff --git a/corbo/models.py b/corbo/models.py index 8676b90..ff8d78e 100644 --- a/corbo/models.py +++ b/corbo/models.py @@ -31,6 +31,12 @@ class Category(models.Model): def __unicode__(self): return self.name + def get_announces_number(self): + return self.announce_set.all().count() + + def get_subscriptions_number(self): + return self.subscription_set.all().count() + class Announce(models.Model): category = models.ForeignKey('Category', verbose_name=_('category')) diff --git a/corbo/static/css/corbo.css b/corbo/static/css/corbo.css index ecc25b7..42f1a34 100644 --- a/corbo/static/css/corbo.css +++ b/corbo/static/css/corbo.css @@ -9,7 +9,6 @@ body { a:link, a:visited, a:hover { text-decoration: none; - color: #000; } header h1 { @@ -154,9 +153,6 @@ div.user a.logout:before { #management ul li { padding: 5px; border: 1px solid #aaa; - background: #eee; - margin:2px 0; - border-radius: .3em; position: relative; } @@ -164,11 +160,6 @@ div.user a.logout:before { margin: .4em 0; } -.title { - font-size: .9em; - font-weight: bold; -} - .preview { padding-left: 10px; font-size: .8em; @@ -181,6 +172,16 @@ div.user a.logout:before { right: 5px; } +ul.objects-list.single-links li .actions a { + color: #999; + display: inline; + padding: 0; +} + +.actions a:hover { + color: #333; +} + .status { position: absolute; padding: 2px; @@ -200,6 +201,7 @@ div.user a.logout:before { .status .icon { color: #888; + font-size: 0.9em; } .status .published:before { @@ -220,9 +222,10 @@ div.user a.logout:before { } #management .datetime { - width: 15%; - float: right; - margin-right: 35px; + position: absolute; + top: 3px; + right: 0; + width: 25%; } .empty { @@ -295,7 +298,33 @@ form ul li label { clear: both; } -.subscriptions_number { - font-size: 0.8em; +.categories-listing { + -webkit-column-width: 13em; + -moz-column-width: 13em; + column-width: 13em; +} + +.categories-listing div.category { + border-radius: 0.3em; + display: table; + min-width: 10em; + position: relative; + padding:6px; + margin-bottom: 10px; + background:#f6f6f6; + color:#505050; + border: 1px solid #e4e4e4; +} + +div.title { + line-height:1.5em; +} + +div.category .creation_date, div.category .infos { + font-size: 0.7em; +} + +.category .infos { + margin: 5px 0 0 0; float: right; -} \ No newline at end of file +} diff --git a/corbo/templates/corbo/category_detail.html b/corbo/templates/corbo/category_detail.html new file mode 100644 index 0000000..1161b8d --- /dev/null +++ b/corbo/templates/corbo/category_detail.html @@ -0,0 +1,44 @@ +{% extends 'corbo/manage.html' %} +{% load i18n %} + +{% block appbar %} +

{% trans "Category:" %} {{ object.name }}

+{% trans 'Delete' %} +{% trans 'Rename' %} +{% trans 'New announce' %} +{% endblock %} + +{% block content %} +
+ +{% endblock %} diff --git a/corbo/templates/corbo/manage.html b/corbo/templates/corbo/manage.html index 68b11f7..b4f24a4 100644 --- a/corbo/templates/corbo/manage.html +++ b/corbo/templates/corbo/manage.html @@ -1,106 +1,45 @@ {% extends 'corbo/base.html' %} -{% load i18n static %} +{% load i18n %} {% block page-title %} {{ block.super }} :: {% trans "Management" %} {% endblock %} - +{% block appbar %} +

{% trans "Categories" %}

+{% trans 'New category' %} +{% trans 'New announce' %} +{% endblock %} {% block content %} -
- {% trans "Category:" %} - - - {% if category_id %} - - - {% endif %} - -
-

{% trans "Announces" %}

- {% trans "add announce" %} -
- - {% blocktrans count n=subscriptions_number %} - {{ n }} subscription - {% plural %} - {{ n }} subscriptions - {% endblocktrans %} - -
-
-
    -{% for obj in object_list %} -
  • -
    - {% if obj.is_published %} - - {% endif %} - {% if not obj.is_published %} - {% if obj.is_expired %} - - {% else %} - - {% endif %} - {% endif %} -
    -
    - {% blocktrans with mtime=obj.mtime|date:'DATETIME_FORMAT' %} - Modified on {{ mtime }} - {% endblocktrans %} -
    -
    - - -
    -
    -
    {{ obj.title }}
    -
    {{ obj.text|safe|truncatechars_html:128 }}
    -
    -
  • -{% empty %} -
    - {% trans "No announces matching this category" %} -
    -{% endfor %} -
- -{% if is_paginated %} -
    - {% if page_obj.has_previous %} - - {% endif %} -
  • - page {{ page_obj.number }} of {{ paginator.num_pages }} -
  • - {% if page_obj.has_next %} - - {% endif %} -
-{% endif %} +
-{% endblock %} - -{% block page-end %} - -{% endblock %} + {% endblock %} diff --git a/corbo/views.py b/corbo/views.py index a44a341..d2b2aa5 100644 --- a/corbo/views.py +++ b/corbo/views.py @@ -6,7 +6,8 @@ from django.conf import settings from django.core import signing from django.core.urlresolvers import reverse from django.views.generic import CreateView, UpdateView, DeleteView, \ - ListView, TemplateView, RedirectView + ListView, TemplateView, RedirectView, \ + DetailView from django.contrib.syndication.views import Feed from django.shortcuts import resolve_url from django.utils.encoding import force_text @@ -54,19 +55,27 @@ class AnnounceCreateView(CreateView): template_name = 'corbo/announce_form.html' def get_success_url(self): - """ - redirect to the category page of the new created announce - """ - return reverse('manage') + '?' + urlencode({'category': self.object.category.id}) + return reverse('view_category', kwargs={'pk': self.object.category.pk}) add_announce = AnnounceCreateView.as_view() + +class AnnounceForCategoryCreateView(AnnounceCreateView): + + def get_initial(self): + initial = super(AnnounceForCategoryCreateView, self).get_initial() + initial['category'] = models.Category.objects.get(pk=self.kwargs['pk']) + return initial + +add_announce_for_category = AnnounceForCategoryCreateView.as_view() + + class AnnounceEditView(UpdateView): model = models.Announce form_class = AnnounceForm def get_success_url(self): - return reverse('manage') + '?' + urlencode({'category': self.object.category.id}) + return reverse('view_category', kwargs={'pk': self.object.category.pk}) edit_announce = AnnounceEditView.as_view() @@ -92,16 +101,28 @@ class CategoryCreateView(CreateView): add_category = CategoryCreateView.as_view() + class CategoryEditView(UpdateView): form_class = CategoryForm model = models.Category def get_success_url(self): - return self.request.META['HTTP_REFERER'] or \ - reverse('manage') + '?' + urlencode({'category': self.object.id}) + return reverse('view_category', kwargs={'pk': self.object.pk}) edit_category = CategoryEditView.as_view() + +class CategoryView(DetailView): + model = models.Category + + def get_context_data(self, **kwargs): + context = super(CategoryView, self).get_context_data(**kwargs) + context['announces'] = self.object.announce_set.all() + return context + +view_category = CategoryView.as_view() + + class CategoryDeleteView(DeleteView): model = models.Category @@ -135,31 +156,12 @@ unsubscription_done = UnsubscriptionDoneView.as_view() class ManageView(ListView): - paginate_by = settings.ANNOUNCES_PER_PAGE template_name = 'corbo/manage.html' - model = models.Announce - - def get_queryset(self): - queryset = super(ManageView, self).get_queryset() - if self.request.GET.get('category'): - queryset = queryset.filter(category__id=self.request.GET['category']) - return queryset - - def get_context_data(self, **kwargs): - context = super(ManageView, self).get_context_data(**kwargs) - context['categories'] = models.Category.objects.all().order_by('-ctime') - context['subscriptions_number'] = models.Subscription.objects.count() - if self.request.GET.get('category'): - try: - context['category_id'] = int(self.request.GET['category']) - cat = models.Category.objects.get(pk=context['category_id']) - context['subscriptions_number'] = cat.subscription_set.count() - except (ValueError, models.Category.DoesNotExist): - pass - return context + model = models.Category manage = ManageView.as_view() + class Atom1Feed(DjangoAtom1Feed): def root_attributes(self): attrs = super(Atom1Feed, self).root_attributes() -- 2.9.3