Sync entries button
This commit is contained in:
parent
a11d8a2796
commit
65944deaf5
4 changed files with 43 additions and 70 deletions
102
feedler/admin.py
102
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
{% block header_extra %}
|
||||
{% if user_can_create %}
|
||||
<div class="right">
|
||||
<div class="addbutton">
|
||||
{% include 'modeladmin/includes/button.html' with button=view.button_helper.export_button %}
|
||||
</div>
|
||||
<div style="position: relative; top: -1px;">
|
||||
{% include 'modeladmin/includes/button.html' with button=view.button_helper.refresh_button %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{{ block.super }}{% comment %}Show original buttons{% endcomment %}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue