From 65944deaf59254ca25d75c575ba44af88c6b4dc3 Mon Sep 17 00:00:00 2001 From: Oleg Lavrovsky Date: Sat, 14 Oct 2017 23:57:39 +0200 Subject: [PATCH] Sync entries button --- feedler/admin.py | 102 +++++++----------- feedler/refresh.py | 1 + .../modeladmin/feedler/entry/index.html | 6 +- feedler/wagtail_hooks.py | 4 +- 4 files changed, 43 insertions(+), 70 deletions(-) diff --git a/feedler/admin.py b/feedler/admin.py index ed805ab..391117d 100644 --- a/feedler/admin.py +++ b/feedler/admin.py @@ -7,120 +7,92 @@ from django.conf.urls import url from django.core.urlresolvers import reverse from django.utils.functional import cached_property from django.utils.translation import ugettext as _ +from django.shortcuts import redirect from wagtail.contrib.modeladmin.helpers import AdminURLHelper, ButtonHelper from wagtail.contrib.modeladmin.options import ModelAdmin from wagtail.contrib.modeladmin.views import IndexView +from wagtail.wagtailadmin import messages from feedler.models import Entry +from feedler.refresh import refresh_streams +from feedler.models.admin import FeedlySettings -class ExportButtonHelper(ButtonHelper): +class RefreshButtonHelper(ButtonHelper): """ - This helper constructs all the necessary attributes to create a button. - - There is a lot of boilerplate just for the classnames to be right :( + This helper constructs a refresh button """ - - export_button_classnames = ['icon', 'icon-download'] - - def export_button(self, classnames_add=None, classnames_exclude=None): - if classnames_add is None: - classnames_add = [] - if classnames_exclude is None: - classnames_exclude = [] - - classnames = self.export_button_classnames + classnames_add + button_classnames = ['icon', 'icon-download'] + def refresh_button(self, classnames_add=None, classnames_exclude=None): + if classnames_add is None: classnames_add = [] + if classnames_exclude is None: classnames_exclude = [] + classnames = self.button_classnames + classnames_add cn = self.finalise_classname(classnames, classnames_exclude) - text = _('Export {}'.format(self.verbose_name_plural.title())) - + text = _('Sync {}'.format(self.verbose_name_plural.title())) return { - 'url': self.url_helper.get_action_url('export', query_params=self.request.GET), - 'label': text, - 'classname': cn, - 'title': text, + 'url': self.url_helper.get_action_url('refresh', query_params=self.request.GET), + 'label': text, 'classname': cn, 'title': text, } - -class ExportAdminURLHelper(AdminURLHelper): +class RefreshAdminURLHelper(AdminURLHelper): """ - This helper constructs the different urls. - - This is mostly just to overwrite the default behaviour - which consider any action other than 'create', 'choose_parent' and 'index' - as `object specific` and will try to add the object PK to the url - which is not what we want for the `export` option. - - In addition, it appends the filters to the action. + This helper constructs the different urls, to overwrite the default behaviour + and append the filters to the action. """ - - non_object_specific_actions = ('create', 'choose_parent', 'index', 'export') - + non_object_specific_actions = ('create', 'choose_parent', 'index', 'refresh') def get_action_url(self, action, *args, **kwargs): query_params = kwargs.pop('query_params', None) - url_name = self.get_action_url_name(action) if action in self.non_object_specific_actions: url = reverse(url_name) else: url = reverse(url_name, args=args, kwargs=kwargs) - if query_params: url += '?{params}'.format(params=query_params.urlencode()) - return url - def get_action_url_pattern(self, action): if action in self.non_object_specific_actions: return self._get_action_url_pattern(action) - return self._get_object_specific_action_url_pattern(action) - -class ExportView(IndexView): +class RefreshView(IndexView): """ - A Class Based View which will generate + A Class Based View which will handle the button click """ - - def export_csv(self): - data = self.queryset.all() - response = ... - return response - - + # def export_csv(self): + # data = self.queryset.all() + # response = ... + # return response @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): super().dispatch(request, *args, **kwargs) - return self.export_csv() + if not refresh_streams(FeedlySettings.for_site(request.site)): + messages.error( + request, _('Sorry, could not refresh streams. Please contact your administrator.')) + return redirect('/admin/feedler/entry/') -class ExportModelAdminMixin(object): +class EntryModelAdminMixin(object): """ A mixin to add to your model admin which hooks the different helpers, the view and register the new urls. """ - - button_helper_class = ExportButtonHelper - url_helper_class = ExportAdminURLHelper - - export_view_class = ExportView + button_helper_class = RefreshButtonHelper + url_helper_class = RefreshAdminURLHelper + view_class = RefreshView def get_admin_urls_for_registration(self): urls = super().get_admin_urls_for_registration() urls += ( url( - self.url_helper.get_action_url_pattern('export'), - self.export_view, - name=self.url_helper.get_action_url_name('export') + self.url_helper.get_action_url_pattern('refresh'), + self.refresh_view, + name=self.url_helper.get_action_url_name('refresh') ), ) - return urls - def export_view(self, request): + def refresh_view(self, request): kwargs = {'model_admin': self} - view_class = self.export_view_class + view_class = self.view_class return view_class.as_view(**kwargs)(request) - - -class MenuModelAdmin(ExportModelAdminMixin, ModelAdmin): - model = Entry diff --git a/feedler/refresh.py b/feedler/refresh.py index ccf65a6..f5cc3df 100644 --- a/feedler/refresh.py +++ b/feedler/refresh.py @@ -72,3 +72,4 @@ def refresh_stream(stream, settings, retry=False): entry = feedparser.parse(entry, raw_entry, stream) # Persist resulting object entry.save() + return True diff --git a/feedler/templates/modeladmin/feedler/entry/index.html b/feedler/templates/modeladmin/feedler/entry/index.html index f86f8eb..234e82f 100644 --- a/feedler/templates/modeladmin/feedler/entry/index.html +++ b/feedler/templates/modeladmin/feedler/entry/index.html @@ -3,9 +3,9 @@ {% block header_extra %} {% if user_can_create %}
-
- {% include 'modeladmin/includes/button.html' with button=view.button_helper.export_button %} -
+
+ {% include 'modeladmin/includes/button.html' with button=view.button_helper.refresh_button %} +
{% endif %} {{ block.super }}{% comment %}Show original buttons{% endcomment %} diff --git a/feedler/wagtail_hooks.py b/feedler/wagtail_hooks.py index 79052ed..b40200f 100644 --- a/feedler/wagtail_hooks.py +++ b/feedler/wagtail_hooks.py @@ -3,10 +3,10 @@ from wagtail.contrib.modeladmin.options import ( ModelAdmin, modeladmin_register) -from .admin import ExportModelAdminMixin +from .admin import EntryModelAdminMixin from .models import Entry, Stream -class EntryModelAdmin(ExportModelAdminMixin, ModelAdmin): +class EntryModelAdmin(EntryModelAdminMixin, ModelAdmin): model = Entry menu_icon = 'date' menu_order = 200