1
0
Fork 0
mirror of https://github.com/Findus23/acronomy.git synced 2024-09-19 15:33:45 +02:00
acronomy/acros/views.py

211 lines
6.3 KiB
Python
Raw Normal View History

2020-07-06 19:54:36 +02:00
from datetime import date
2020-06-01 11:03:21 +02:00
from django.contrib.auth.mixins import LoginRequiredMixin
2020-06-13 22:36:46 +02:00
from django.contrib.messages.views import SuccessMessageMixin
2020-07-27 13:41:16 +02:00
from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest
2020-07-27 13:34:19 +02:00
from django.shortcuts import redirect, render
2020-07-08 22:01:43 +02:00
from django.urls import reverse
2020-06-01 11:03:21 +02:00
from django.views import generic
from rest_framework import viewsets, filters
2020-07-19 21:38:09 +02:00
from acros.forms import EditForm, AddForm, WikipediaForm, PaperForm, WeblinkForm, EditLetterForm
2020-07-08 22:01:43 +02:00
from acros.models import Acronym, Tag, AcroOfTheDay, WikipediaLink, PaperReference, Weblink
2020-06-01 11:03:21 +02:00
from acros.serializers import AcronymSerializer, AcronymListSerializer, TagSerializer
2020-06-13 21:18:58 +02:00
from acros.utils.assets import get_css
from acros.utils.checks import registry
2020-06-01 11:03:21 +02:00
2020-06-15 21:02:50 +02:00
handler404 = 'acros.views.PageNotFoundView'
2020-06-01 11:03:21 +02:00
2020-07-06 19:54:36 +02:00
2020-06-01 11:03:21 +02:00
class IndexView(generic.TemplateView):
template_name = "acros/index.html"
2020-07-06 19:54:36 +02:00
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
aotd = AcroOfTheDay.objects.filter(date=date.today()).select_related('acronym')
data['acronyms_of_the_day'] = aotd
popular = Acronym.objects.filter(pageviews__gt=0).order_by('-pageviews')[:5]
data['popular_acronyms'] = popular
2020-07-06 19:54:36 +02:00
data['num_acronyms'] = Acronym.objects.all().count()
return data
class IntegrationsView(generic.TemplateView):
template_name = "integrations.html"
2020-06-15 21:02:50 +02:00
class PageNotFoundView(generic.TemplateView):
template_name = "404.html"
2020-06-01 11:03:21 +02:00
class OverView(generic.ListView):
template_name = "acros/overview.html"
model = Acronym
context_object_name = 'acros'
ordering = "name"
class DetailView(generic.DetailView):
template_name = 'acros/detail.html'
context_object_name = 'acro'
model = Acronym
2020-06-15 21:02:50 +02:00
class EditView(LoginRequiredMixin, SuccessMessageMixin, generic.UpdateView):
2020-06-01 11:03:21 +02:00
template_name = 'acros/edit.html'
context_object_name = 'acro'
model = Acronym
# fields = ['name', 'full_name', "description_md", "tags"]
form_class = EditForm
2020-06-15 21:02:50 +02:00
success_message = 'Acronym "%(name)s" was edited successfully'
2020-06-01 11:03:21 +02:00
2020-07-19 21:38:09 +02:00
class EditLetterView(LoginRequiredMixin, SuccessMessageMixin, generic.UpdateView):
template_name = 'acros/edit_letter.html'
context_object_name = 'acro'
model = Acronym
form_class = EditLetterForm
success_message = 'Letters were edited successfully'
2020-06-13 22:36:46 +02:00
class AddView(LoginRequiredMixin, SuccessMessageMixin, generic.CreateView):
2020-06-01 11:03:21 +02:00
template_name = "acros/add.html"
form_class = AddForm
model = Acronym
2020-06-13 22:36:46 +02:00
success_message = 'Acronym "%(name)s" was created successfully'
2020-06-01 11:03:21 +02:00
2020-07-08 22:01:43 +02:00
class AddReferenceView(LoginRequiredMixin, SuccessMessageMixin, generic.CreateView):
def form_valid(self, form):
acro = Acronym.objects.get(slug=self.kwargs.get('slug'))
form.instance.acronym = acro
return super().form_valid(form)
def get_success_url(self):
return reverse("detail", kwargs={"slug": self.kwargs.get('slug')})
class AddWikipediaView(AddReferenceView):
template_name = "acros/addwiki.html"
form_class = WikipediaForm
model = WikipediaLink
success_message = 'Wikipedia Reference "%(title)s" was created successfully'
class AddPaperView(AddReferenceView):
template_name = "acros/addpaper.html"
form_class = PaperForm
model = PaperReference
2020-07-18 19:45:19 +02:00
success_message = 'Paper Reference "%(bibcode)s" was created successfully'
2020-07-08 22:01:43 +02:00
class AddWeblinkView(AddReferenceView):
template_name = "acros/addwebsite.html"
form_class = WeblinkForm
model = Weblink
success_message = 'Weblink "%(url)s" was created successfully'
2020-06-01 11:03:21 +02:00
class TagListView(generic.ListView):
template_name = "acros/taglist.html"
model = Tag
context_object_name = 'tags'
ordering = "name"
2020-06-15 20:30:17 +02:00
queryset = Tag.objects.exclude(acronyms=None)
2020-06-01 11:03:21 +02:00
class TagAcroView(generic.ListView):
template_name = "acros/tagacro.html"
context_object_name = 'acros'
ordering = "name"
2020-06-15 21:02:50 +02:00
allow_empty = False
2020-06-01 11:03:21 +02:00
def get_queryset(self):
return Acronym.objects.filter(tags__slug__exact=self.kwargs['slug'])
class DataCheckView(generic.TemplateView, LoginRequiredMixin):
template_name = "acros/datacheck.html"
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
errors = registry.run_checks()
data['errors'] = errors
return data
2020-07-27 13:34:19 +02:00
#### Search Views ####
def search_suggestion_view(request):
2020-07-27 13:41:16 +02:00
query: str = request.GET.get('q')
if not query:
return HttpResponseBadRequest("q parameter is required")
2020-07-27 13:34:19 +02:00
results = Acronym.objects.filter(slug__contains=query)
suggestions = []
r: Acronym
for r in results:
suggestions.append(f"{r.name}: {r.full_name}")
response = [
query,
suggestions
]
return JsonResponse(response, safe=False)
def search_view(request):
2020-07-27 13:41:16 +02:00
query: str = request.GET.get('q')
if not query:
return HttpResponseBadRequest("q parameter is required")
2020-07-27 13:34:19 +02:00
query_acr = query.split(":")[0]
print(query_acr)
try:
acr = Acronym.objects.get(name__iexact=query_acr)
return redirect("detail", slug=acr.slug)
except Acronym.DoesNotExist:
pass
results = Acronym.objects.filter(name__trigram_similar=query_acr)
return render(request, "acros/search.html", {"results": results, "query": query_acr})
2020-06-01 11:03:21 +02:00
#### API Views ####
class AcronymViewSet(viewsets.ReadOnlyModelViewSet):
"""
API endpoint for viewing Acronyms
"""
queryset = Acronym.objects.all().order_by('name')
serializer_class = AcronymSerializer
serializer_classes = {
'list': AcronymListSerializer,
'retrieve': AcronymSerializer,
}
default_serializer_class = AcronymListSerializer
filter_backends = [filters.SearchFilter]
search_fields = ['name']
def get_serializer_class(self):
return self.serializer_classes.get(self.action, self.default_serializer_class)
class TagViewSet(viewsets.ReadOnlyModelViewSet):
2020-07-26 15:25:26 +02:00
"""
A list of all available tags (used for auto-completion)
"""
2020-06-01 11:03:21 +02:00
queryset = Tag.objects.all().order_by("name")
serializer_class = TagSerializer
2020-06-13 21:18:58 +02:00
##### DEBUG views #####
def debug_css(request):
css, source_map = get_css(debug=True)
return HttpResponse(css, content_type="text/css")
def debug_css_sourcemap(request):
css, source_map = get_css(debug=True)
return HttpResponse(source_map, content_type="application/json")