url(r'^(?P<slug>[\w:-]+)/api-save/$', staff_member_required(views.NoteApiSaveView.as_view())),
url(r'^ajax/upload/$', staff_member_required(views.ajax_upload)),
url(r'^ajax/newpage/$', staff_member_required(views.ajax_new_page)),
+ url(r'^ajax/search/$', views.ajax_search, name='ajax-search'),
url(r'^new-note/$', staff_member_required(views.NoteAddView.as_view(), login_url='login')),
url(r'^feeds/(?P<sub>[\w:-]+)/atom$', views.AtomFeed()),
url(r'^feed/atom$', views.AtomFeed()),
import urllib.parse
from django.conf import settings
+from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
from django.contrib.syndication.views import Feed
from django.core.exceptions import PermissionDenied
from django.core.files.storage import default_storage
'request_id': request.POST['request_id'],
}
)
+
+
+def ajax_search(request, *args, **kwargs):
+ vector = SearchVector('title', weight='A') + SearchVector('text', weight='B')
+ query = SearchQuery(request.GET.get('q', ''), config='french')
+ results = (
+ Note.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.3).order_by('-rank')[:10]
+ )
+ return JsonResponse(
+ {'data': [{'title': x.title, 'rank': x.rank, 'url': x.get_absolute_url()} for x in results]}
+ )