Skip to content

Commit

Permalink
Article permission filter
Browse files Browse the repository at this point in the history
  • Loading branch information
berk76 committed Mar 13, 2024
1 parent 3162174 commit 4607ed5
Showing 1 changed file with 26 additions and 4 deletions.
30 changes: 26 additions & 4 deletions svjis/articles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.models import Group
from django.contrib import messages
from django.core.paginator import Paginator, InvalidPage
from django.db.models import Q, Count
from django.conf import settings
from django.http import Http404
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.decorators.http import require_GET, require_POST
Expand All @@ -21,21 +23,31 @@ def get_side_menu(ctx):
return result


def get_article_filter(user):
q1 = Q(published=True)
q2 = Q(visible_for_all=True)
# https://stackoverflow.com/questions/4507893/django-filter-many-to-many-with-contains
groups = Group.objects.filter(user__id=user.id)
q3 = Q(visible_for_group__in=groups)
return Q(q1 & (q2 | q3))

@require_GET
def main_view(request):
return main_filtered_view(request, None)


@require_GET
def main_filtered_view(request, menu):
# Articles
article_list = models.Article.objects.filter(published=True)
# Menu
header = _("All articles")
if menu is not None:
article_menu = get_object_or_404(models.ArticleMenu, pk=menu)
article_list = article_list.filter(menu=article_menu)
header = article_menu.description

# Articles
q = get_article_filter(request.user)

# Search
search = request.GET.get('search')
if search is not None and len(search) < 3:
Expand All @@ -45,11 +57,14 @@ def main_filtered_view(request, menu):
messages.error(request, _("Search: Keyword is too long. Type maximum of 100 characters."))
search = None
if search is not None:
article_list = article_list.filter(Q(header__icontains=search) | Q(perex__icontains=search) | Q(body__icontains=search))
qs = (Q(header__icontains=search) | Q(perex__icontains=search) | Q(body__icontains=search))
q = Q(q & qs)
header = _("Search results") + f": {search}"
else:
search = ''

article_list = models.Article.objects.filter(q).distinct()

# Paginator
is_paginated = len(article_list) > getattr(settings, 'SVJIS_ARTICLE_PAGE_SIZE', 10)
page = request.GET.get('page', 1)
Expand Down Expand Up @@ -87,10 +102,17 @@ def main_filtered_view(request, menu):

@require_GET
def article_view(request, pk):
article = get_object_or_404(models.Article, pk=pk)
q = get_article_filter(request.user)
article_qs = models.Article.objects.filter(Q(pk=pk) & q).distinct()
if len(article_qs) == 0:
raise Http404
else:
article = article_qs[0]

user = request.user
if user.is_anonymous:
user = None

models.ArticleLog.objects.create(article=article, user=user)
ctx = utils.get_context()
ctx['aside_menu_name'] = _("Articles")
Expand Down

0 comments on commit 4607ed5

Please sign in to comment.