src/egonomy/views.py
changeset 168 c90576d18319
parent 159 b98558f8d2c1
child 191 d7b30914607d
equal deleted inserted replaced
166:61ff8ecfdb28 168:c90576d18319
     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