fmartingr
/
shelfzilla
Archived
1
0
Fork 0

Added an easy system to update covers using a simple google image search with the first four results with a one-click update system

This commit is contained in:
Felipe Martín 2014-08-24 12:23:59 +02:00
parent 4c306eb065
commit 8f91f9d30f
5 changed files with 144 additions and 3 deletions

View File

@ -1,10 +1,13 @@
from django.conf.urls import patterns, url
from .views import VolumeChangeSeriesView
from .views import VolumeChangeSeriesView, VolumeChangeCoverView
urlpatterns = patterns(
'',
url(r'^manga/volume/change_series/$',
VolumeChangeSeriesView.as_view(),
name="_admin.manga.volume.change_series"),
url(r'^manga/volume/cover/(?P<volume_pk>\d+)/$',
VolumeChangeCoverView.as_view(),
name="_admin.manga.volume.cover"),
)

View File

@ -3,6 +3,8 @@ from django.template import RequestContext
from django.utils.translation import ugettext as _
from django.contrib import messages
from django.http import HttpResponseForbidden, HttpResponseRedirect
from django.views.decorators.csrf import csrf_exempt
from filer.models import Image
from shelfzilla.views import View
from shelfzilla.apps.manga.models import Volume, Series
@ -42,3 +44,46 @@ class VolumeChangeSeriesView(View):
messages.success(request, _('Volume series changed'))
return HttpResponseRedirect('/admin/manga/volume/')
class VolumeChangeCoverView(View):
@csrf_exempt
def dispatch(self, request, *args, **kwargs):
if not request.user.is_staff:
return HttpResponseForbidden()
else:
return super(VolumeChangeCoverView, self).dispatch(
request, *args, **kwargs)
def post(self, request, volume_pk):
try:
volume = Volume.objects.get(pk=volume_pk)
if 'cover_url' in request.POST:
cover_url = request.POST['cover_url']
from django.core.files.temp import NamedTemporaryFile
from django.core.files import File
import urllib2
cover_temp = NamedTemporaryFile(delete=True)
cover_temp.write(urllib2.urlopen(cover_url).read())
cover_temp.flush()
new_cover, is_new = Image.objects.get_or_create(file=File(cover_temp))
# new_cover._move_file()
if volume.cover:
volume.cover.delete()
volume.cover = new_cover
volume.save()
messages.success(request, _('Volume series changed'))
else:
messages.error(request, _('Cover url to update not found.'))
except Volume.DoesNotExist:
messages.error(request, _('Volume not found.'))
return HttpResponseRedirect(
'/admin/manga/volume/{}/'.format(volume_pk))

View File

@ -91,6 +91,7 @@ class SeriesAdmin(ImportExportModelAdmin, reversion.VersionAdmin):
suit_form_tabs = (
('general', _('General')),
('volumes', _('Volumes')),
('cover', _('Cover')),
('review', _('Review')),
('advanced', _('Advanced')),
)
@ -133,6 +134,7 @@ class VolumeAdmin(ImportExportModelAdmin, reversion.VersionAdmin):
suit_form_tabs = (
('general', _('General')),
('cover', _('Cover')),
('review', _('Review')),
('advanced', _('Advanced')),
)
@ -154,6 +156,10 @@ class VolumeAdmin(ImportExportModelAdmin, reversion.VersionAdmin):
}),
]
suit_form_includes = (
('_admin/volumes/includes/cover.html', 'top', 'cover'),
)
def change_series(self, request, queryset):
selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
return HttpResponseRedirect(

View File

@ -240,8 +240,11 @@ def series_delete_folder(sender, instance, using, **kwargs):
def volume_delete_cover(sender, instance, **kwargs):
if instance.cover:
instance.cover.delete()
try:
if instance.cover:
instance.cover.delete()
except:
pass
post_save.connect(series_check_filer, sender=Series)
post_save.connect(volume_check_filer, sender=Volume)

View File

@ -0,0 +1,84 @@
{% load i18n %}
<table class="table table-striped table-bordered table-hover table-condensed">
<thead>
<tr>
<td>{% trans "Actual cover:" %}</td>
<td>{% trans "Search" %}</td>
</tr>
</thead>
<tbody>
<tr>
<td width="50%" align="center"><img src="{{ original.cover.url }}" /></td>
<td>
<input type="text" id="GIMG-query" value="{{ original.series.name }} {{ original.publisher.name }} tomo {{ original.number }} {{ original.name }}" />
<input type="text" id="GIMG-limit" value="5" maxlength="2" size="2" style="width: 30px;" />
<button class="btn btn-info" id="GIMG-submit" type="button">{% trans "Search" %}</button>
</td>
</tr>
<tr>
<td id="GIMG-results" colspan="2"></td>
</tr>
</tbody>
</table>
<script type="text/javascript">
$(function() {
var submitButton = $('#GIMG-submit');
var results = $('#GIMG-results');
var searchQuery = function() { return $('#GIMG-query').val(); };
var searchLimit = function() { return $('#GIMG-limit').val(); };
$('#GIMG-query').keypress(function(event) {
if (event.keyCode == 13) {
event.preventDefault();
submitButton.click()
};
});
submitButton.on('click', function() {
$.getJSON(
'http://google-images-api.eu01.aws.af.cm/',
{ q: searchQuery(), limit: searchLimit() },
function(data) {
results.html('');
console.log(data.items);
for (var i = 0; i < data.items.length; i++) {
var image = data.items[i];
var containerElement = $('<div />');
containerElement.css('text-align', 'center')
.css('width', '25%')
.css('float', 'left');
var imageElement = $('<img />');
imageElement.attr('src', image);
/* imageElement.on('error', function(e) {
$(this).remove();
})*/
var formElement = $('<form />');
formElement.attr('action', '/_admin/manga/volume/cover/{{ original.pk }}/');
formElement.attr('method', 'post');
var buttonElement = $('<button />');
buttonElement.attr('type', 'submit');
buttonElement.addClass('btn');
buttonElement.text('{% trans "Update with this" %}')
var urlElement = $('<input />');
urlElement.attr('type', 'hidden');
urlElement.attr('name', 'cover_url');
urlElement.val(image);
formElement.append(buttonElement);
formElement.append(urlElement);
containerElement.append(formElement);
containerElement.append(imageElement);
results.append(containerElement);
}
}
);
});
})
</script>