return obj
-@cache.cache_control(must_revalidate=True, max_age=3600)
def main_page(request):
if request.user.is_authenticated():
shelves = models.Tag.objects.filter(category='set', user=request.user)
context_instance=RequestContext(request))
-@cache.cache_control(must_revalidate=True, max_age=3600)
def tagged_object_list(request, tags=''):
# Prevent DoS attacks on our database
if len(tags.split('/')) > 6:
raise Http404
model = models.Book
+ shelf = [tag for tag in tags if tag.category == 'set']
shelf_is_set = (len(tags) == 1 and tags[0].category == 'set')
theme_is_set = len([tag for tag in tags if tag.category == 'theme']) > 0
if theme_is_set:
model = models.Fragment
+ user_is_owner = (len(shelf) and request.user.is_authenticated() and request.user == shelf[0].user)
+
extra_where = 'NOT catalogue_tag.category = "set"'
related_tags = models.Tag.objects.related_for_model(tags, model, counts=True, extra={'where': [extra_where]})
categories = split_tags(related_tags)
queryset_or_model=model,
tags=tags,
template_name='catalogue/tagged_object_list.html',
- extra_context = {'categories': categories, 'shelf_is_set': shelf_is_set },
+ extra_context = {'categories': categories, 'shelf_is_set': shelf_is_set, 'user_is_owner': user_is_owner },
)
def tags_starting_with(request):
- prefix = request.GET['q']
+ prefix = request.GET.get('q', '')
# Prefix must have at least 2 characters
if len(prefix) < 2:
return HttpResponse('')
return render_to_response('catalogue/user_shelves.html', locals(),
context_instance=RequestContext(request))
-
@cache.never_cache
def book_sets(request, slug):
book = get_object_or_404(models.Book, slug=slug)
if request.method == 'POST':
form = forms.ObjectSetsForm(book, request.user, request.POST)
if form.is_valid():
- book.tags = ([models.Tag.objects.get(pk=id) for id in form.cleaned_data['set_ids']] +
- list(book.tags.filter(~Q(category='set') | ~Q(user=request.user))))
+ old_shelves = list(book.tags.filter(category='set'))
+ new_shelves = [models.Tag.objects.get(pk=id) for id in form.cleaned_data['set_ids']]
+
+ for shelf in [shelf for shelf in old_shelves if shelf not in new_shelves]:
+ shelf.book_count -= 1
+ shelf.save()
+
+ for shelf in [shelf for shelf in new_shelves if shelf not in old_shelves]:
+ shelf.book_count += 1
+ shelf.save()
+
+ book.tags = new_shelves + list(book.tags.filter(~Q(category='set') | ~Q(user=request.user)))
if request.is_ajax():
return HttpResponse('<p>Półki zostały zapisane.</p>')
else:
context_instance=RequestContext(request))
+@login_required
+@require_POST
+@cache.never_cache
+def remove_from_shelf(request, shelf, book):
+ book = get_object_or_404(models.Book, slug=book)
+ shelf = get_object_or_404(models.Tag, slug=shelf, category='set', user=request.user)
+
+ models.Tag.objects.remove_tag(book, shelf)
+
+ shelf.book_count -= 1
+ shelf.save()
+
+ return HttpResponse('Usunieto')
+
+
@cache.never_cache
def download_shelf(request, slug):
""""
# Create a ZIP archive
temp = temp = tempfile.TemporaryFile()
archive = zipfile.ZipFile(temp, 'w')
- for book in models.Book.tagged.with_all(shelf):
+
+ # Collect all books to include in ZIP archive
+ def collect_books(books):
+ result = []
+ for book in books:
+ if len(book.children.all()) == 0:
+ result.append(book)
+ else:
+ result += collect_books(book.children.all())
+ return result
+
+ for book in collect_books(models.Book.tagged.with_all(shelf)):
if book.pdf_file:
filename = book.pdf_file.path
archive.write(filename, str('%s.pdf' % book.slug))
else:
return HttpResponseRedirect('/')
- return render_to_response('catalogue/book_sets.html', locals(),
- context_instance=RequestContext(request))
+ return HttpResponseRedirect('/')
@login_required