Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate linkcheck views to ModelAdmin #189

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
Unreleased

* Migrate linkcheck views to `ModelAdmin` (Timo Brembeck, #186)
* Add `ModelAdmin` for Url and Link models
* Delete `report` view
* Fix encoding of utf-8 domain names (Timo Brembeck, #190)
* Move coverage view to management command (Timo Brembeck, #187)
* Add new management command `linkcheck_suggest_config`
Expand Down
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ include README.rst
include linkcheck/locale/*/LC_MESSAGES/django.mo
exclude linkcheck/locale/*/LC_MESSAGES/django.po
recursive-include linkcheck/templates/linkcheck *
recursive-include linkcheck/static/linkcheck *
recursive-include linkcheck/tests/media *
13 changes: 9 additions & 4 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ django-linkcheck
A fairly flexible app that will analyze and report on links in any model that
you register with it.

.. image:: https://github.com/DjangoAdminHackers/django-linkcheck/raw/master/linkcheck.jpg
.. image:: examples/linkcheck.png

Links can be bare (urls or image and file fields) or
embedded in HTML (linkcheck handles the parsing). It's fairly easy to override
Expand Down Expand Up @@ -50,11 +50,16 @@ Basic usage

#. Run ``./manage.py migrate``.

#. Add to your root url config::
#. Register linkcheck models in your admin::

path('admin/linkcheck/', include('linkcheck.urls'))
from django.contrib import admin
from linkcheck.models import Link, Url
from linkcheck.admin import LinkAdmin, UrlAdmin

#. View ``/admin/linkcheck/`` from your browser.
admin.site.register(Url, UrlAdmin)
admin.site.register(Link, LinkAdmin)

#. View ``/admin/linkcheck/url/`` from your browser.

We are aware that this documentation is on the brief side of things so any
suggestions for elaboration or clarification would be gratefully accepted.
Expand Down
Binary file modified examples/linkcheck.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed linkcheck.jpg
Binary file not shown.
6 changes: 6 additions & 0 deletions linkcheck/admin/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from .link_admin import LinkAdmin
from .url_admin import UrlAdmin

__all__ = [
"LinkAdmin", "UrlAdmin"
]
124 changes: 124 additions & 0 deletions linkcheck/admin/link_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
from django.contrib import admin, messages
from django.template.defaultfilters import yesno
from django.utils.translation import gettext_lazy as _

from ..models import Link, Url
from ..templatetags.linkcheck_admin_tags import (
linkcheck_actions,
linkcheck_source,
linkcheck_status_icon,
linkcheck_url,
linkcheck_wrap_in_div,
)


class LinkAdmin(admin.ModelAdmin):
list_display = [
'list_url',
'list_status',
'list_text',
'list_content_object',
'content_type',
'list_field',
'list_ignore',
'list_actions',
]
actions = ['recheck', 'ignore', 'unignore']
list_per_page = 15

@admin.display(ordering='url', description=Url._meta.get_field('url').verbose_name)
def list_url(self, link):
return linkcheck_url(link.url)

@admin.display(ordering='url__status', description=Url._meta.get_field('status').verbose_name)
def list_status(self, link):
return linkcheck_status_icon(link.url)

@admin.display(description=_('link text'))
def list_text(self, link):
return linkcheck_wrap_in_div(link.text)

@admin.display(ordering='object_id', description=_('source'))
def list_content_object(self, link):
return linkcheck_source(link)

@admin.display(ordering='field', description=Link._meta.get_field('field').verbose_name)
def list_field(self, link):
return type(link.content_object)._meta.get_field(link.field).verbose_name

@admin.display(ordering='ignore', description=Link._meta.get_field('ignore').verbose_name)
def list_ignore(self, link):
return yesno(link.ignore)

@admin.display(description=_('Actions'))
def list_actions(self, link):
return linkcheck_actions(link.url, obj=link)

def has_add_permission(self, request, obj=None):
return False

def has_change_permission(self, request, obj=None):
return False

def has_delete_permission(self, request, obj=None):
return False

@admin.action(description=_('Recheck selected links'))
def recheck(self, request, queryset):
for link in queryset:
link.url.check_url(external_recheck_interval=0)
if len(queryset) == 1:
messages.success(
request,
_('The link "{}" was rechecked.').format(queryset[0].url),
)
else:
messages.success(
request,
_('The selected links were rechecked.'),
)

@admin.action(description=_('Ignore selected links'))
def ignore(self, request, queryset):
queryset.update(ignore=True)
if len(queryset) == 1:
messages.success(
request,
_('The link "{}" is now ignored.').format(queryset[0].url),
)
else:
messages.success(
request,
_('The selected links are now ignored.'),
)

@admin.action(description=_('No longer ignore selected links'))
def unignore(self, request, queryset):
queryset.update(ignore=False)
if len(queryset) == 1:
messages.success(
request,
_('The link "{}" is no longer ignored.').format(queryset[0].url),
)
else:
messages.success(
request,
_('The selected links are no longer ignored.'),
)

def changelist_view(self, request, extra_context=None):
extra_context = extra_context or {}
if request.GET.get('ignore__exact') == '1':
title = _('Ignored links')
elif request.GET.get('ignore__exact') == '0':
title = _('Not ignored links')
else:
title = _('Links')
extra_context['title'] = title
return super().changelist_view(request, extra_context=extra_context)

class Media:
css = {
'all': ['linkcheck/css/style.css'],
}
js = ['linkcheck/js/actions.js']
Loading
Loading