From 958f2ac9685ceca7ec48c7ea456f680bfaacae83 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/forms.py | 3 +- corbo/manage_urls.py | 8 +- corbo/models.py | 8 +- corbo/static/css/corbo.css | 167 ++------------------- corbo/templates/corbo/announce_confirm_delete.html | 2 + corbo/templates/corbo/announce_form.html | 15 +- corbo/templates/corbo/category_confirm_delete.html | 2 + corbo/templates/corbo/category_detail.html | 44 ++++++ corbo/templates/corbo/category_form.html | 1 + corbo/templates/corbo/manage.html | 120 ++++----------- corbo/views.py | 68 +++++---- 11 files changed, 158 insertions(+), 280 deletions(-) create mode 100644 corbo/templates/corbo/category_detail.html diff --git a/corbo/forms.py b/corbo/forms.py index 423cab4..3ec9b00 100644 --- a/corbo/forms.py +++ b/corbo/forms.py @@ -13,7 +13,8 @@ class AnnounceForm(forms.ModelForm): 'publication_time': forms.TextInput(attrs={'class': 'datetimepicker', 'readonly': True}), 'expiration_time': forms.TextInput(attrs={'class': 'datetimepicker', - 'readonly': True}) + 'readonly': True}), + 'category': forms.HiddenInput() } def save(self, *args, **kwargs): diff --git a/corbo/manage_urls.py b/corbo/manage_urls.py index f0e1538..49cb86b 100644 --- a/corbo/manage_urls.py +++ b/corbo/manage_urls.py @@ -1,15 +1,19 @@ 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, \ + menu_json urlpatterns = patterns('', url(r'^$', manage, name='manage'), - url(r'^announce/add$', add_announce, name='add_announce'), + url(r'^category/(?P\d+)/announce/$', add_announce, + name='add_announce'), url(r'^announce/edit/(?P\d+)$', edit_announce, 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/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..141c0f9 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')) @@ -54,8 +60,6 @@ class Announce(models.Model): return False def is_published(self): - if self.is_expired(): - return False if self.publication_time: return self.publication_time <= timezone.now() return False diff --git a/corbo/static/css/corbo.css b/corbo/static/css/corbo.css index 321e9e5..d0c79b1 100644 --- a/corbo/static/css/corbo.css +++ b/corbo/static/css/corbo.css @@ -1,15 +1,9 @@ -.icon:before, .icon:after { - font-family: FontAwesome; -} - - body { margin: 0; } a:link, a:visited, a:hover { text-decoration: none; - color: #000; } header h1 { @@ -25,64 +19,15 @@ footer { text-align: center; } -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 +87,14 @@ div.user a.logout:before { margin-left: .4em; } -#management { - margin: 1em 0 .5em 0; -} - -#management ul { - margin: 1em 0 0 0; +ul.objects-list.single-links li .actions a { + color: #999; + display: inline; 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; -} - -.actions { - position: absolute; - top: 2px; - right: 5px; +.actions a:hover { + color: #333; } .status { @@ -190,28 +106,8 @@ div.user a.logout:before { width: 20px; } -.edit:before { - content: '\f044'; -} - -.delete:before { - content: '\f1f8'; -} - -.status .icon { - color: #888; -} - -.status .published:before { - content: '\f1ea'; -} - -.status .unpublished:before { - content: '\f06a'; -} - -.status .expired:before { - content: '\f0f6'; +li.unpublished { + background: #f8f8fe; } .announce { @@ -220,9 +116,9 @@ div.user a.logout:before { } #management .datetime { - width: 15%; - float: right; - margin-right: 35px; + position: absolute; + top: 2px; + right: 2px; } .empty { @@ -232,48 +128,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 +146,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..fa2f40b 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 %} @@ -16,6 +26,7 @@ {{ form.as_p }}
+ {% trans 'Cancel' %}
-{% endblock %} + {% endblock %} diff --git a/corbo/views.py b/corbo/views.py index a4a72c0..72af6ba 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 @@ -49,24 +50,40 @@ class HomepageView(RedirectView): homepage = HomepageView.as_view() + class AnnounceCreateView(CreateView): + form_class = AnnounceForm 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}) + + def get_initial(self): + initial = super(AnnounceCreateView, self).get_initial() + initial['category'] = models.Category.objects.get(pk=self.kwargs['pk']) + return initial + + def get_context_data(self, **kwargs): + context = super(AnnounceCreateView, self).get_context_data(**kwargs) + context['category'] = kwargs['form'].initial['category'] + return context add_announce = AnnounceCreateView.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 +91,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 +108,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 +163,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