diff options
Diffstat (limited to 'app/utils/views.py')
-rw-r--r-- | app/utils/views.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/app/utils/views.py b/app/utils/views.py new file mode 100644 index 0000000..7a0c67d --- /dev/null +++ b/app/utils/views.py @@ -0,0 +1,102 @@ +from itertools import chain +import json +from django.http import Http404, HttpResponse, JsonResponse +from django.apps import apps +from django.views.generic import ListView +from django.views.generic.base import View, RedirectView +from django.views.generic.edit import FormView, ModelFormMixin +from django.utils.decorators import method_decorator +from django.contrib.auth.decorators import login_required +from django.shortcuts import render_to_response +from django.shortcuts import render +from django.template import RequestContext +from taggit.models import Tag +#from dal import autocomplete + + +class PaginatedListView(ListView): + """ + handles my own pagination system + """ + context_object_name = 'object_list' + + def dispatch(self, request, *args, **kwargs): + path = request.path.split('/')[1:-1] + if path[-1] == self.kwargs['page']: + path = "/".join(t for t in path[:-1]) + request.page_url = "/" + path + '/%d/' + else: + request.page_url = request.path + '%d/' + print(request.page_url) + request.page = int(self.kwargs['page']) + request.base_path = path + return super(PaginatedListView, self).dispatch(request, *args, **kwargs) + + +@method_decorator(login_required, name='dispatch') +class LoggedInViewWithUser(View): + + def get_form_kwargs(self, **kwargs): + kwargs = super().get_form_kwargs(**kwargs) + kwargs.update({'user': self.request.user}) + return kwargs + + +@method_decorator(login_required, name='dispatch') +class LoggedInViewWithUser(FormView): + + def get_form_kwargs(self, **kwargs): + kwargs = super().get_form_kwargs(**kwargs) + kwargs.update({'user': self.request.user}) + return kwargs + + +class AjaxableResponseMixin: + """ + Mixin to add AJAX support to a form. + Must be used with an object-based FormView (e.g. CreateView) + """ + def form_invalid(self, form): + response = super().form_invalid(form) + if self.request.is_ajax(): + return JsonResponse(form.errors, status=400) + else: + return response + + def form_valid(self, form): + # We make sure to call the parent's form_valid() method because + # it might do some processing (in the case of CreateView, it will + # call form.save() for example). + print(self.request.META) + print('x request header', self.request.META['HTTP_X_REQUESTED_WITH']) + response = super().form_valid(form) + if self.request.is_ajax(): + data = { + 'pk': self.object.pk, + } + return JsonResponse(data) + else: + return response +''' +class TagAutocomplete(autocomplete.Select2QuerySetView): + def get_queryset(self): + # Don't forget to filter out results depending on the visitor ! + if not self.request.user.is_authenticated: + return Tag.objects.none() + + qs = Tag.objects.all() + + if self.q: + qs = qs.filter(name__istartswith=self.q) + + return qs +''' + +def nav_json(request, app, model, pk): + model = apps.get_model(app_label=app, model_name=model) + p = model.objects.get(pk=pk) + data = {} + data['prev'] = p.get_previous_admin_url + data['next'] = p.get_next_admin_url + data = json.dumps(data) + return HttpResponse(data) |