2023-04-06 11:08:42 +00:00
|
|
|
# -*- coding:utf-8 -*-
|
2017-04-24 15:51:12 +00:00
|
|
|
#
|
2023-04-06 11:08:42 +00:00
|
|
|
# Copyright 2023 © AE UTBM
|
|
|
|
# ae@utbm.fr / ae.info@utbm.fr
|
|
|
|
# All contributors are listed in the CONTRIBUTORS file.
|
2017-04-24 15:51:12 +00:00
|
|
|
#
|
2023-04-06 11:08:42 +00:00
|
|
|
# This file is part of the website of the UTBM Student Association (AE UTBM),
|
|
|
|
# https://ae.utbm.fr.
|
2017-04-24 15:51:12 +00:00
|
|
|
#
|
2023-04-06 11:08:42 +00:00
|
|
|
# You can find the whole source code at https://github.com/ae-utbm/sith3
|
2017-04-24 15:51:12 +00:00
|
|
|
#
|
2023-04-06 11:08:42 +00:00
|
|
|
# LICENSED UNDER THE GNU GENERAL PUBLIC LICENSE VERSION 3 (GPLv3)
|
|
|
|
# SEE : https://raw.githubusercontent.com/ae-utbm/sith3/master/LICENSE
|
|
|
|
# OR WITHIN THE LOCAL FILE "LICENSE"
|
2017-04-24 15:51:12 +00:00
|
|
|
#
|
2023-04-06 11:08:42 +00:00
|
|
|
# PREVIOUSLY LICENSED UNDER THE MIT LICENSE,
|
|
|
|
# SEE : https://raw.githubusercontent.com/ae-utbm/sith3/master/LICENSE.old
|
|
|
|
# OR WITHIN THE LOCAL FILE "LICENSE.old"
|
2017-04-24 15:51:12 +00:00
|
|
|
#
|
|
|
|
|
2024-06-24 11:07:36 +00:00
|
|
|
import json
|
|
|
|
|
|
|
|
from django.conf import settings
|
2016-08-19 00:53:44 +00:00
|
|
|
from django.contrib.auth.decorators import login_required
|
2024-06-24 11:07:36 +00:00
|
|
|
from django.core import serializers
|
|
|
|
from django.db.models.query import QuerySet
|
|
|
|
from django.http import JsonResponse
|
|
|
|
from django.shortcuts import redirect, render
|
2019-05-09 17:51:55 +00:00
|
|
|
from django.utils import html
|
2020-04-21 11:50:43 +00:00
|
|
|
from django.utils.text import slugify
|
2024-06-24 11:07:36 +00:00
|
|
|
from django.views.generic import ListView, TemplateView
|
2016-12-19 20:00:09 +00:00
|
|
|
from haystack.query import SearchQuerySet
|
|
|
|
|
2016-08-19 00:53:44 +00:00
|
|
|
from club.models import Club
|
2024-06-24 11:07:36 +00:00
|
|
|
from core.models import Notification, User
|
|
|
|
from core.utils import bbcode_to_markdown, doku_to_markdown
|
2016-08-10 03:48:06 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2015-11-24 15:09:46 +00:00
|
|
|
def index(request, context=None):
|
2019-08-16 14:59:13 +00:00
|
|
|
from com.views import NewsListView
|
2018-10-04 19:29:19 +00:00
|
|
|
|
2019-08-16 14:59:13 +00:00
|
|
|
return NewsListView.as_view()(request)
|
2016-08-19 00:53:44 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2016-12-09 23:06:17 +00:00
|
|
|
class NotificationList(ListView):
|
|
|
|
model = Notification
|
|
|
|
template_name = "core/notification_list.jinja"
|
|
|
|
|
2023-05-02 11:07:36 +00:00
|
|
|
def get_queryset(self) -> QuerySet[Notification]:
|
|
|
|
if self.request.user.is_anonymous:
|
|
|
|
return Notification.objects.none()
|
2019-09-08 22:45:08 +00:00
|
|
|
# TODO: Bulk update in django 2.2
|
2018-10-04 19:29:19 +00:00
|
|
|
if "see_all" in self.request.GET.keys():
|
2019-09-08 22:45:08 +00:00
|
|
|
for n in self.request.user.notifications.filter(viewed=False):
|
2017-09-06 11:16:28 +00:00
|
|
|
n.viewed = True
|
|
|
|
n.save()
|
2023-05-02 11:07:36 +00:00
|
|
|
|
2018-10-04 19:29:19 +00:00
|
|
|
return self.request.user.notifications.order_by("-date")[:20]
|
2016-12-09 23:06:17 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2016-12-08 18:47:28 +00:00
|
|
|
def notification(request, notif_id):
|
|
|
|
notif = Notification.objects.filter(id=notif_id).first()
|
|
|
|
if notif:
|
2017-09-06 11:16:28 +00:00
|
|
|
if notif.type not in settings.SITH_PERMANENT_NOTIFICATIONS:
|
|
|
|
notif.viewed = True
|
2017-10-15 09:59:41 +00:00
|
|
|
else:
|
|
|
|
notif.callback()
|
|
|
|
notif.save()
|
2016-12-08 18:47:28 +00:00
|
|
|
return redirect(notif.url)
|
|
|
|
return redirect("/")
|
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2016-08-19 21:24:23 +00:00
|
|
|
def search_user(query, as_json=False):
|
2019-05-09 17:51:55 +00:00
|
|
|
try:
|
2020-04-21 11:50:43 +00:00
|
|
|
# slugify turns everything into ascii and every whitespace into -
|
2020-04-21 13:36:13 +00:00
|
|
|
# it ends by removing duplicate - (so ' - ' will turn into '-')
|
2020-04-21 11:50:43 +00:00
|
|
|
# replace('-', ' ') because search is whitespace based
|
|
|
|
query = slugify(query).replace("-", " ")
|
2020-04-21 13:36:13 +00:00
|
|
|
# TODO: is this necessary?
|
2020-04-21 11:50:43 +00:00
|
|
|
query = html.escape(query)
|
2020-04-21 13:36:13 +00:00
|
|
|
res = (
|
|
|
|
SearchQuerySet()
|
|
|
|
.models(User)
|
|
|
|
.autocomplete(auto=query)
|
|
|
|
.order_by("-last_update")[:20]
|
|
|
|
)
|
2019-05-09 17:51:55 +00:00
|
|
|
return [r.object for r in res]
|
|
|
|
except TypeError:
|
2018-12-07 12:34:46 +00:00
|
|
|
return []
|
2016-08-19 21:24:23 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2016-08-19 21:24:23 +00:00
|
|
|
def search_club(query, as_json=False):
|
|
|
|
clubs = []
|
|
|
|
if query:
|
|
|
|
clubs = Club.objects.filter(name__icontains=query).all()
|
|
|
|
clubs = clubs[:5]
|
2024-06-24 09:56:38 +00:00
|
|
|
if as_json:
|
|
|
|
# Re-loads json to avoid double encoding by JsonResponse, but still benefit from serializers
|
2018-10-04 19:29:19 +00:00
|
|
|
clubs = json.loads(serializers.serialize("json", clubs, fields=("name")))
|
2016-08-19 21:24:23 +00:00
|
|
|
else:
|
2016-08-19 01:12:20 +00:00
|
|
|
clubs = list(clubs)
|
2016-08-19 21:24:23 +00:00
|
|
|
return clubs
|
2016-08-19 00:53:44 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2016-08-19 00:53:44 +00:00
|
|
|
@login_required
|
|
|
|
def search_view(request):
|
2016-08-19 21:24:23 +00:00
|
|
|
result = {
|
2018-10-04 19:29:19 +00:00
|
|
|
"users": search_user(request.GET.get("query", "")),
|
|
|
|
"clubs": search_club(request.GET.get("query", "")),
|
2017-06-12 07:42:03 +00:00
|
|
|
}
|
2018-10-04 19:29:19 +00:00
|
|
|
return render(request, "core/search.jinja", context={"result": result})
|
2016-08-19 21:24:23 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2016-08-19 21:24:23 +00:00
|
|
|
@login_required
|
|
|
|
def search_user_json(request):
|
2018-10-04 19:29:19 +00:00
|
|
|
result = {"users": search_user(request.GET.get("query", ""), True)}
|
2016-08-19 21:24:23 +00:00
|
|
|
return JsonResponse(result)
|
2016-08-19 00:53:44 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2016-08-19 00:53:44 +00:00
|
|
|
@login_required
|
|
|
|
def search_json(request):
|
2016-08-19 21:24:23 +00:00
|
|
|
result = {
|
2018-10-04 19:29:19 +00:00
|
|
|
"users": search_user(request.GET.get("query", ""), True),
|
|
|
|
"clubs": search_club(request.GET.get("query", ""), True),
|
2017-06-12 07:42:03 +00:00
|
|
|
}
|
2016-08-19 21:24:23 +00:00
|
|
|
return JsonResponse(result)
|
2015-11-24 15:09:46 +00:00
|
|
|
|
2017-06-12 07:42:03 +00:00
|
|
|
|
2017-05-30 17:29:35 +00:00
|
|
|
class ToMarkdownView(TemplateView):
|
|
|
|
template_name = "core/to_markdown.jinja"
|
2017-05-14 01:14:38 +00:00
|
|
|
|
|
|
|
def post(self, request, *args, **kwargs):
|
2018-10-04 19:29:19 +00:00
|
|
|
self.text = request.POST["text"]
|
|
|
|
if request.POST["syntax"] == "doku":
|
2017-05-30 17:29:35 +00:00
|
|
|
self.text_md = doku_to_markdown(self.text)
|
|
|
|
else:
|
|
|
|
self.text_md = bbcode_to_markdown(self.text)
|
2017-05-14 01:14:38 +00:00
|
|
|
context = self.get_context_data(**kwargs)
|
|
|
|
return self.render_to_response(context)
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
2017-05-30 17:29:35 +00:00
|
|
|
kwargs = super(ToMarkdownView, self).get_context_data(**kwargs)
|
2017-05-14 01:14:38 +00:00
|
|
|
try:
|
2018-10-04 19:29:19 +00:00
|
|
|
kwargs["text"] = self.text
|
|
|
|
kwargs["text_md"] = self.text_md
|
2017-05-14 01:14:38 +00:00
|
|
|
except:
|
2018-10-04 19:29:19 +00:00
|
|
|
kwargs["text"] = ""
|
|
|
|
kwargs["text_md"] = ""
|
2017-05-14 01:14:38 +00:00
|
|
|
return kwargs
|