1 from django.conf import settings |
1 from django.conf import settings |
2 from django.contrib.auth.decorators import login_required |
2 from django.contrib.auth.decorators import login_required |
3 from django.contrib.auth.models import User |
3 from django.contrib.auth.models import User |
|
4 from django.contrib.contenttypes.models import ContentType |
4 from django.core.paginator import Paginator, InvalidPage, EmptyPage |
5 from django.core.paginator import Paginator, InvalidPage, EmptyPage |
5 from django.core.urlresolvers import reverse |
6 from django.core.urlresolvers import reverse |
6 from django.db.models.aggregates import Max |
7 from django.db.models.aggregates import Max |
7 from django.http.response import HttpResponseForbidden, HttpResponse |
8 from django.http.response import HttpResponseForbidden, HttpResponse |
8 from django.shortcuts import get_object_or_404, render_to_response, redirect |
9 from django.shortcuts import get_object_or_404, render_to_response, redirect |
9 from django.template import RequestContext |
10 from django.template import RequestContext |
10 from django.utils.translation import ugettext as _ |
11 from django.utils.translation import ugettext as _ |
11 from egonomy.models import ImageMetadata, Image, Fragment, ImageInfo, Collection |
12 from egonomy.models import ImageMetadata, Image, Fragment, ImageInfo, Collection,\ |
|
13 CollectionItem |
12 from egonomy.search_indexes import QueryParser |
14 from egonomy.search_indexes import QueryParser |
13 from egonomy.search_indexes.paginator import SearchPaginator |
15 from egonomy.search_indexes.paginator import SearchPaginator |
14 from egonomy.search_indexes.query import ModelRelatedSearchQuerySet |
16 from egonomy.search_indexes.query import ModelRelatedSearchQuerySet |
15 from haystack.query import RelatedSearchQuerySet |
17 from haystack.query import RelatedSearchQuerySet |
16 from sorl.thumbnail import default, get_thumbnail |
18 from sorl.thumbnail import default, get_thumbnail |
369 |
371 |
370 # Get the cur_page_nb number parameter if possible |
372 # Get the cur_page_nb number parameter if possible |
371 cur_page_nb = request.GET.get("page") or 1 |
373 cur_page_nb = request.GET.get("page") or 1 |
372 cur_page_nb = int(cur_page_nb) |
374 cur_page_nb = int(cur_page_nb) |
373 |
375 |
374 collections = Collection.objects.filter(public=True).order_by('-creation').select_related('items') |
376 collections = Collection.objects.filter(public=True).order_by('-creation').select_related('author', 'items') |
375 nb = request.GET.get("limit") or getattr(settings,"IMAGES_PER_PAGE", 32) |
377 nb = request.GET.get("limit") or getattr(settings,"IMAGES_PER_PAGE", 32) |
376 paginator = Paginator(collections, nb) |
378 paginator = Paginator(collections, nb) |
377 |
379 |
378 try: |
380 try: |
379 results = paginator.page(cur_page_nb) |
381 results = paginator.page(cur_page_nb) |
396 # get the username |
398 # get the username |
397 user = get_object_or_404(User, username=username) |
399 user = get_object_or_404(User, username=username) |
398 |
400 |
399 if user==request.user: |
401 if user==request.user: |
400 user_collections = True |
402 user_collections = True |
401 collections = Collection.objects.filter(author=user).order_by('-creation').select_related('items') |
403 collections = Collection.objects.filter(author=user).order_by('-creation').select_related('author', 'items') |
402 else: |
404 else: |
403 user_collections = False |
405 user_collections = False |
404 collections = Collection.objects.filter(author=user).filter(public=True).order_by('-creation').select_related('items') |
406 collections = Collection.objects.filter(author=user).filter(public=True).order_by('-creation').select_related('author', 'items') |
405 |
407 |
406 nb = request.GET.get("limit") or getattr(settings,"IMAGES_PER_PAGE", 32) |
408 nb = request.GET.get("limit") or getattr(settings,"IMAGES_PER_PAGE", 32) |
407 paginator = Paginator(collections, nb) |
409 paginator = Paginator(collections, nb) |
408 |
410 |
409 try: |
411 try: |
436 |
438 |
437 |
439 |
438 |
440 |
439 def view_collection(request, collection_pk): |
441 def view_collection(request, collection_pk): |
440 |
442 |
441 col = get_object_or_404(Collection.objects.select_related('items'), pk=collection_pk) |
443 display = request.GET.get("display") or "slideshow" |
|
444 if display!="slideshow" and display!="mosaic" and display!="geographical": |
|
445 display = "slideshow" |
|
446 |
|
447 col = get_object_or_404(Collection.objects.select_related('author'), pk=collection_pk) |
|
448 items = CollectionItem.objects.filter(collection=col).select_related('author', 'content_type', 'object_id', 'content_object').order_by("order") |
442 |
449 |
443 return render_to_response("egonomy_view_collection.html", |
450 return render_to_response("egonomy_view_collection.html", |
444 {'col':col}, |
451 {'col':col, 'items':items, 'display':display, |
|
452 'current_user_collection_list':current_user_collection_list(request)}, |
445 context_instance=RequestContext(request)) |
453 context_instance=RequestContext(request)) |
446 |
454 |
447 |
455 |
448 |
456 |
449 |
457 |
452 if request.user.is_authenticated(): |
460 if request.user.is_authenticated(): |
453 return Collection.objects.filter(author=request.user).order_by("title") |
461 return Collection.objects.filter(author=request.user).order_by("title") |
454 else: |
462 else: |
455 return None |
463 return None |
456 |
464 |
|
465 |
|
466 |
|
467 |
|
468 def add_item_to_collection(request): |
|
469 |
|
470 col_pk = request.POST["collection-pk"] |
|
471 item_desc = request.POST["item-description"] |
|
472 item_type = request.POST["item-type"] |
|
473 item_id = request.POST["item-id"] |
|
474 |
|
475 # Test collection |
|
476 try: |
|
477 col_pk = int(col_pk) |
|
478 except: |
|
479 return HttpResponse("Collection number invalid.", status_code=400) |
|
480 col = get_object_or_404(Collection, pk=col_pk) |
|
481 |
|
482 if item_type=="image": |
|
483 # Test image |
|
484 item = get_object_or_404(Image, id=item_id) |
|
485 elif item_type=="fragment": |
|
486 # Test fragment |
|
487 try: |
|
488 item_id = int(item_id) |
|
489 except: |
|
490 return HttpResponse("Fragment number invalid.", status_code=400) |
|
491 item = get_object_or_404(Fragment, pk=item_id) |
|
492 else: |
|
493 return HttpResponse("item-type must be 'image' or 'fragment'.", status_code=400) |
|
494 |
|
495 col_item = CollectionItem() |
|
496 col_item.collection = col |
|
497 col_item.content_type = ContentType.objects.get_for_model(item) |
|
498 col_item.object_id = str(item_id) |
|
499 col_item.content_object = item |
|
500 col_item.description = item_desc |
|
501 # Get the collection's max order and set the new item's one |
|
502 max_order = CollectionItem.objects.filter(collection=col).aggregate(Max('order'))['order__max'] |
|
503 if not max_order: |
|
504 max_order = 0 |
|
505 col_item.order = max_order + 1 |
|
506 col_item.save() |
|
507 |
|
508 return redirect("view_collection", collection_pk=col.pk) |
|
509 |