From 9d4053195d1b3a66cc91fe3e9c6d7deeb98c7313 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 | 142 ++------------------- corbo/templates/corbo/announce_confirm_delete.html | 2 + corbo/templates/corbo/announce_form.html | 14 +- corbo/templates/corbo/category_confirm_delete.html | 2 + corbo/templates/corbo/category_detail.html | 41 ++++++ corbo/templates/corbo/manage.html | 122 +++++------------- corbo/views.py | 71 +++++++---- 9 files changed, 157 insertions(+), 250 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..0979e55 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_count(self): + return self.announce_set.all().count() + + def get_subscriptions_count(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 321e9e5..d4cfb09 100644 --- a/corbo/static/css/corbo.css +++ b/corbo/static/css/corbo.css @@ -2,14 +2,12 @@ font-family: FontAwesome; } - body { margin: 0; } a:link, a:visited, a:hover { text-decoration: none; - color: #000; } header h1 { @@ -29,60 +27,15 @@ div#content { padding: 0 10px; } -ul.announces { - margin: 0; - padding: 0; -} - -ul.announces li, ul.auth li, #management ul li { +ul.auth li { list-style-type: none; padding: .1em .5em; } -li.bright { - background: #fff; -} - -li.bluesky { - background: #d3d8e8 !important; -} - -div.pub_time { - float: right; - font: bold Arial .8em; -} - div.clear { clear: both; } -ul.pagination { - font-size: .8em; - margin: 0; - padding: 0; -} - -#management ul.pagination li { - display: inline; - margin: 0 2px; -} - -ul.pagination li.current { - border: 0; -} - -ul.pagination a { - color: #000; -} - -ul.pagination li.next a:before { - content: '\f105'; -} - -ul.pagination li.prev a:before { - content: '\f104'; -} - ul.auth { border-radius: .2em; -moz-border-radius: .2em; @@ -142,43 +95,19 @@ div.user a.logout:before { margin-left: .4em; } -#management { - margin: 1em 0 .5em 0; -} - -#management ul { - margin: 1em 0 0 0; - padding: 0; -} #management ul li { padding: 5px; - border: 1px solid #aaa; - background: #eee; - margin:2px 0; - border-radius: .3em; - position: relative; -} - -#management h4 { - margin: .4em 0; -} - -.title { - font-size: .9em; - font-weight: bold; } -.preview { - padding-left: 10px; - font-size: .8em; - color: #777; +ul.objects-list.single-links li .actions a { + color: #999; + display: inline; + padding: 0; } -.actions { - position: absolute; - top: 2px; - right: 5px; +.actions a:hover { + color: #333; } .status { @@ -190,16 +119,9 @@ div.user a.logout:before { width: 20px; } -.edit:before { - content: '\f044'; -} - -.delete:before { - content: '\f1f8'; -} - .status .icon { color: #888; + font-size: 0.9em; } .status .published:before { @@ -220,9 +142,10 @@ div.user a.logout:before { } #management .datetime { - width: 15%; - float: right; - margin-right: 35px; + position: absolute; + top: 3px; + right: 0; + width: 25%; } .empty { @@ -232,48 +155,15 @@ div.user a.logout:before { margin: 0 auto; } -.categories { - float: right; -} - -.categories select { - border: 1px solid #aaa; - display: inline; -} - -.categories a, #management > span a { - color: #000; - padding: 1px 3px; - margin: 0; - font-weight: bold; - font-size: .75em; -} - -a.add:before { - content: '\f067'; - padding-right:3px; -} - form ul li { list-style-type: none; margin: 5px 0; } -li.datetime:after { - margin-left: 5px; - font-family: FontAwesome; - content: '\f073'; - color: #555; -} - form ul li label { display: block; } -#id_transport_channel li, #id_transport_channel label { - display: inline; -} - .content { width: 50%; margin: auto; @@ -283,10 +173,4 @@ form ul li label { background: #e6db74; border: 1px solid #aaa; padding: 5px; -} - -.info { - background: #a6e22e; - border: 1px solid #aaa; - padding: 5px; -} +} \ No newline at end of file diff --git a/corbo/templates/corbo/announce_confirm_delete.html b/corbo/templates/corbo/announce_confirm_delete.html index c95f3e4..b9e7fc6 100644 --- a/corbo/templates/corbo/announce_confirm_delete.html +++ b/corbo/templates/corbo/announce_confirm_delete.html @@ -1,5 +1,7 @@ {% extends "corbo/manage.html" %} {% load i18n %} +{% block appbar %} +{% endblock %} {% block content %}

diff --git a/corbo/templates/corbo/announce_form.html b/corbo/templates/corbo/announce_form.html index fb8eb0c..d466042 100644 --- a/corbo/templates/corbo/announce_form.html +++ b/corbo/templates/corbo/announce_form.html @@ -1,12 +1,22 @@ {% extends "corbo/manage.html" %} {% load i18n %} +{% block breadcrumb %} +{{ block.super }} +{% if category %} +{{ category }} +{% endif %} +{% endblock %} + {% block appbar %} {% if object %} -

{% trans "Modify Announce" %}

+

{% trans "Edit Announce" %}

+{% trans 'Delete' %} {% else %} -

{% trans "New Announce" %}

+

{% trans "New Announce" %}

{% endif %} + + {% endblock %} {% block content %} diff --git a/corbo/templates/corbo/category_confirm_delete.html b/corbo/templates/corbo/category_confirm_delete.html index a70abdd..7942286 100644 --- a/corbo/templates/corbo/category_confirm_delete.html +++ b/corbo/templates/corbo/category_confirm_delete.html @@ -1,5 +1,7 @@ {% extends "corbo/manage.html" %} {% load i18n %} +{% block appbar %} +{% endblock %} {% block content %} {% csrf_token %} diff --git a/corbo/templates/corbo/category_detail.html b/corbo/templates/corbo/category_detail.html new file mode 100644 index 0000000..0c8f347 --- /dev/null +++ b/corbo/templates/corbo/category_detail.html @@ -0,0 +1,41 @@ +{% extends 'corbo/manage.html' %} +{% load i18n %} + +{% block appbar %} +

{{ 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 eb11185..4e8e9b3 100644 --- a/corbo/templates/corbo/manage.html +++ b/corbo/templates/corbo/manage.html @@ -1,96 +1,38 @@ {% extends 'corbo/base.html' %} -{% load i18n static %} -{% block page-title %} -{{ block.super }} :: {% trans "Management" %} -{% endblock %} - +{% load i18n %} +{% block appbar %} +

{% trans "Categories" %}

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

{% trans "Announces" %}

- {% trans "add announce" %} -
    -{% 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 a4a72c0..ce5402c 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,38 @@ 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 + + def get_context_data(self, **kwargs): + context = super(AnnounceForCategoryCreateView, self).get_context_data(**kwargs) + context['category'] = kwargs['form'].initial['category'] + return context + +add_announce_for_category = AnnounceForCategoryCreateView.as_view() + + class AnnounceEditView(UpdateView): model = models.Announce form_class = AnnounceForm + def get_context_data(self, **kwargs): + context = super(AnnounceEditView, self).get_context_data(**kwargs) + category_id = kwargs['form'].initial['category'] + context['category'] = models.Category.objects.get(pk=category_id) + return context + 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() @@ -74,8 +94,7 @@ class AnnounceDeleteView(DeleteView): model = models.Announce def get_success_url(self): - return self.request.META['HTTP_REFERER'] or \ - reverse('manage') + '?' + urlencode({'category': self.object.category.id}) + return reverse('view_category', kwargs={'pk': self.object.category.pk}) delete_announce = AnnounceDeleteView.as_view() @@ -92,16 +111,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,28 +166,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') - if self.request.GET.get('category'): - try: - context['category_id'] = int(self.request.GET['category']) - except: - 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