| author | cavaliet |
| Tue, 19 Feb 2013 13:12:30 +0100 | |
| changeset 45 | ea2c1961a515 |
| parent 43 | 119cd616faa4 |
| child 49 | df024e5f011d |
| permissions | -rw-r--r-- |
| 9 | 1 |
from django.conf import settings |
| 19 | 2 |
from django.contrib.auth.decorators import login_required |
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
3 |
from django.core.paginator import Paginator, InvalidPage, EmptyPage |
| 41 | 4 |
from django.core.urlresolvers import reverse |
5 |
from django.db.models.aggregates import Max |
|
|
23
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
6 |
from django.shortcuts import get_object_or_404, render_to_response, redirect |
| 9 | 7 |
from django.template import RequestContext |
| 41 | 8 |
from egonomy.models import ImageMetadata, Image, Fragment |
9 |
from egonomy.search_indexes import QueryParser |
|
10 |
from egonomy.search_indexes.paginator import SearchPaginator |
|
| 38 | 11 |
from egonomy.search_indexes.query import ModelRelatedSearchQuerySet |
|
43
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
12 |
from haystack.query import RelatedSearchQuerySet |
| 41 | 13 |
import logging |
| 9 | 14 |
|
| 29 | 15 |
logger = logging.getLogger(__name__) |
| 9 | 16 |
|
17 |
||
18 |
def home(request): |
|
19 |
||
| 29 | 20 |
# We force list() because if not, img_id_list is a valuelistqueryset and not a list of values. |
21 |
# We separate image requests and make requests with select_related to optimize database hits. |
|
22 |
img_id_list = list(Image.objects.values_list('id', flat=True).annotate(date_modif=Max('fragment__date_saved')).exclude(date_modif=None).order_by('-date_modif')[:12]) |
|
23 |
img_list = Image.objects.filter(id__in=img_id_list).select_related('info', 'metadata') |
|
24 |
frg_list = Fragment.objects.all().order_by('-date_saved').select_related('image', 'image__info', 'image__metadata','author')[:12] |
|
| 17 | 25 |
|
| 9 | 26 |
return render_to_response("egonomy_home.html", |
| 40 | 27 |
{'img_list':img_list, 'fragment_list':frg_list}, |
| 9 | 28 |
context_instance=RequestContext(request)) |
29 |
||
| 15 | 30 |
|
|
23
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
31 |
def annotate_picture(request, image_id): |
|
18
ffd106d9b8e1
Prepare template for real datas. Some fake datas temporary generated in views.
cavaliet
parents:
17
diff
changeset
|
32 |
|
| 30 | 33 |
img = get_object_or_404(Image.objects.select_related('info', 'metadata'), id=image_id) |
34 |
||
35 |
# We force list() to get only one database hit instead of 3 (first request, count, [0]) |
|
36 |
frg_list = list(Fragment.objects.filter(image=img).order_by('-date_saved').select_related('image', 'image__info', 'image__metadata','author')) |
|
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
37 |
last_frg = None |
| 30 | 38 |
if len(frg_list)>0: |
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
39 |
last_frg = frg_list[0] |
| 9 | 40 |
|
41 |
return render_to_response("egonomy_annotate_picture.html", |
|
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
42 |
{'img': img, 'fragment_list': frg_list, 'last_frg':last_frg}, |
| 9 | 43 |
context_instance=RequestContext(request)) |
44 |
||
45 |
||
|
23
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
46 |
def view_fragment(request, fragment_pk): |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
47 |
|
| 30 | 48 |
frg = get_object_or_404(Fragment.objects.select_related('image', 'image__info', 'image__metadata','author'), pk=fragment_pk) |
49 |
frg_list = Fragment.objects.filter(image=frg.image).select_related('image', 'image__info', 'image__metadata','author') |
|
|
18
ffd106d9b8e1
Prepare template for real datas. Some fake datas temporary generated in views.
cavaliet
parents:
17
diff
changeset
|
50 |
|
| 15 | 51 |
return render_to_response("egonomy_view_fragment.html", |
|
18
ffd106d9b8e1
Prepare template for real datas. Some fake datas temporary generated in views.
cavaliet
parents:
17
diff
changeset
|
52 |
{'fragment': frg, 'fragment_list': frg_list}, |
| 15 | 53 |
context_instance=RequestContext(request)) |
54 |
||
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
55 |
@login_required |
|
23
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
56 |
def create_fragment(request, image_id): |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
57 |
|
| 30 | 58 |
img = get_object_or_404(Image.objects.select_related('info', 'metadata'), id=image_id) |
59 |
frg_list = Fragment.objects.filter(image=img).order_by('-date_saved').select_related('image', 'image__info', 'image__metadata','author') |
|
|
18
ffd106d9b8e1
Prepare template for real datas. Some fake datas temporary generated in views.
cavaliet
parents:
17
diff
changeset
|
60 |
|
| 15 | 61 |
return render_to_response("egonomy_create_fragment.html", |
|
23
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
62 |
{'img': img, 'fragment_list': frg_list}, |
| 15 | 63 |
context_instance=RequestContext(request)) |
64 |
||
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
65 |
@login_required |
| 19 | 66 |
def save_fragment(request): |
67 |
||
68 |
frg_title = request.POST["fragment_title"] |
|
69 |
frg_desc = request.POST["fragment_description"] |
|
70 |
frg_kw = request.POST["users_keywords"] |
|
71 |
frg_path = request.POST["fragment_path"] |
|
|
23
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
72 |
frg_image_id = request.POST["image_id"] |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
73 |
img = get_object_or_404(Image, id=frg_image_id) |
| 19 | 74 |
|
|
23
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
75 |
frg = Fragment() |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
76 |
frg.image = img |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
77 |
frg.coordinates = frg_path |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
78 |
frg.title = frg_title |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
79 |
frg.description = frg_desc |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
80 |
frg.tags = frg_kw |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
81 |
frg.author = request.user |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
82 |
|
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
83 |
frg.save() |
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
84 |
|
|
bb7819c8d7c2
first step user login/logout. Create fragment works. Views and templates adapted with real data model.
cavaliet
parents:
20
diff
changeset
|
85 |
return redirect("view_fragment", fragment_pk=frg.pk) |
| 15 | 86 |
|
87 |
||
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
88 |
def all_pictures(request): |
|
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
89 |
|
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
90 |
# Get the cur_page_nb number parameter if possible |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
91 |
cur_page_nb = request.GET.get("page") or 1 |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
92 |
cur_page_nb = int(cur_page_nb) |
| 36 | 93 |
|
94 |
search = None |
|
| 40 | 95 |
nb_results = 1 |
| 36 | 96 |
if "search" in request.GET: |
97 |
search = request.GET["search"] |
|
98 |
field = "all" |
|
99 |
if "field" in request.GET: |
|
100 |
field = request.GET["field"] |
|
101 |
||
| 38 | 102 |
img_list = Image.objects.select_related('info', 'metadata') |
103 |
nb = getattr(settings,"IMAGES_PER_PAGE", 32) |
|
| 36 | 104 |
if search: |
105 |
if not field or field == 'all': |
|
| 40 | 106 |
field = 'text' |
107 |
qp = QueryParser(field) |
|
| 38 | 108 |
res = ModelRelatedSearchQuerySet(model=Image).filter(qp.parse(search)).models(ImageMetadata).load_all_queryset(Image, img_list).load_all() |
109 |
paginator = SearchPaginator(res, nb) |
|
| 36 | 110 |
else: |
| 38 | 111 |
img_list = img_list.order_by('pk').all() |
| 41 | 112 |
paginator = Paginator(img_list, nb) |
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
113 |
|
|
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
114 |
try: |
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
115 |
results = paginator.page(cur_page_nb) |
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
116 |
except (EmptyPage, InvalidPage): |
|
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
117 |
results = paginator.page(paginator.num_pages) |
| 41 | 118 |
|
119 |
url_pagination = reverse("all_pictures") |
|
120 |
if search: |
|
121 |
url_pagination = url_pagination + "?search=" + search |
|
| 19 | 122 |
|
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
123 |
return render_to_response("egonomy_all_pictures.html", |
| 41 | 124 |
{'results':results, 'nb_pages':paginator.num_pages, 'cur_page_nb':cur_page_nb, "search":search, "nb_results":nb_results, "url_pagination":url_pagination}, |
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
125 |
context_instance=RequestContext(request)) |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
126 |
|
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
127 |
|
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
128 |
def all_fragments(request): |
|
43
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
129 |
|
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
130 |
# Get the cur_page_nb number parameter if possible |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
131 |
cur_page_nb = request.GET.get("page") or 1 |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
132 |
cur_page_nb = int(cur_page_nb) |
|
43
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
133 |
|
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
134 |
search = None |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
135 |
nb_results = 1 |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
136 |
if "search" in request.GET: |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
137 |
search = request.GET["search"] |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
138 |
field = "all" |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
139 |
if "field" in request.GET: |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
140 |
field = request.GET["field"] |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
141 |
|
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
142 |
frg_list = Fragment.objects.select_related('image', 'image__info', 'image__metadata','author') |
| 36 | 143 |
nb = getattr(settings,"IMAGES_PER_PAGE", 32) |
|
43
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
144 |
if search: |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
145 |
if not field or field == 'all': |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
146 |
field = 'text' |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
147 |
qp = QueryParser(field) |
| 45 | 148 |
res = RelatedSearchQuerySet().filter(qp.parse(search)).models(Fragment).load_all_queryset(Fragment, frg_list).load_all().highlight() |
149 |
paginator = Paginator(res, nb) |
|
|
43
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
150 |
else: |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
151 |
frg_list = frg_list.order_by('pk').all() |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
152 |
paginator = Paginator(frg_list, nb) |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
153 |
|
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
154 |
try: |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
155 |
results = paginator.page(cur_page_nb) |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
156 |
except (EmptyPage, InvalidPage): |
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
157 |
results = paginator.page(paginator.num_pages) |
|
43
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
158 |
|
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
159 |
url_pagination = reverse("all_fragments") |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
160 |
if search: |
|
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
161 |
url_pagination = url_pagination + "?search=" + search |
|
27
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
162 |
|
|
daaafc916dc4
Debug in templates. All fragments page added. Language files updated.
cavaliet
parents:
26
diff
changeset
|
163 |
return render_to_response("egonomy_all_fragments.html", |
|
43
119cd616faa4
Search fragment works. Highlight needs to be improved.
cavaliet
parents:
41
diff
changeset
|
164 |
{"search_fragment":True, 'results':results, 'nb_pages':paginator.num_pages, 'cur_page_nb':cur_page_nb, "search":search, "nb_results":nb_results, "url_pagination":url_pagination}, |
|
24
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
165 |
context_instance=RequestContext(request)) |
|
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
166 |
|
|
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
167 |
|
|
d65e05154aec
All pictures view with intelligent pagination. Css need to be improved.
cavaliet
parents:
23
diff
changeset
|
168 |