Skip to content
Snippets Groups Projects
Commit 3cd776a7 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

remove unnecessary Guardian, reorder views & make collapsible recording categories

parent e60a9c2f
Branches
No related tags found
No related merge requests found
Pipeline #16460 passed
from django.contrib import admin
from shared.admin import MarkdownxGuardedModelAdmin
from markdownx.admin import MarkdownxModelAdmin
from .forms import LectureGroupTypeFormset
from .models import (
......@@ -16,12 +15,12 @@ from .models import (
# Register your models here.
class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin):
class IndexHiddenModelAdmin(MarkdownxModelAdmin):
def has_module_permission(self, request):
return False
class LectureGroupAdmin(MarkdownxGuardedModelAdmin):
class LectureGroupAdmin(MarkdownxModelAdmin):
autocomplete_fields = ("user_groups",)
search_fields = ("name",)
......@@ -45,7 +44,7 @@ class LectureGroupTypeInline(admin.StackedInline):
extra = 1
class LectureAdmin(MarkdownxGuardedModelAdmin):
class LectureAdmin(MarkdownxModelAdmin):
inlines = (
LectureGroupTypeInline,
LectureRecordingInline,
......@@ -77,11 +76,11 @@ class LectureAdmin(MarkdownxGuardedModelAdmin):
return display_string
class LectureCategoryAdmin(MarkdownxGuardedModelAdmin):
class LectureCategoryAdmin(MarkdownxModelAdmin):
search_fields = ("name",)
class LectureLectorAdmin(MarkdownxGuardedModelAdmin):
class LectureLectorAdmin(MarkdownxModelAdmin):
search_fields = ("name", "username")
......
......@@ -25,6 +25,11 @@
>
<div class="flex justify-center mb-10">
<div class="switch overflow-x-auto">
<a
@click="toggleView('recordings')"
class="switch__item whitespace-nowrap"
:class="{'switch__item--active': isCurrentView('recordings')}"
>Záznamy</a>
<a
@click="toggleView('current_lectures')"
class="switch__item whitespace-nowrap"
......@@ -35,14 +40,58 @@
class="switch__item whitespace-nowrap"
:class="{'switch__item--active': isCurrentView('timeline')}"
>Časová osa</a>
<a
@click="toggleView('recordings')"
class="switch__item whitespace-nowrap"
:class="{'switch__item--active': isCurrentView('recordings')}"
>Záznamy</a>
</div>
</div>
<div>
<template v-if="isCurrentView('recordings')">
{% if past_lectures %}
<div class="flex flex-col gap-3">
{% regroup past_lectures by category as lecture_categories %}
{% for category in lecture_categories %}
<div
class="
flex flex-col gap-3 group justify-center p-4 cursor-pointer
hover:bg-gray-100
__lecture-category
"
data-is-open="false"
>
<div class="flex justify-between items-center">
<h2 class="text-3xl font-alt">{{ category.grouper }}</h2>
<div>
<i
class="
__lecture-category-opener
ico--chevron-down text-2xl
"
></i>
</div>
</div>
<noscript>
<ul class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4">
{% for lecture in category.list %}
{% include "lectures/includes/lecture.html" with lecture=lecture group=group %}
{% endfor %}
</ul>
</noscript>
<ul class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4 hidden __lecture-category-content">
{% for lecture in category.list %}
{% include "lectures/includes/lecture.html" with lecture=lecture group=group %}
{% endfor %}
</ul>
</div>
{% endfor %}
</div>
{% else %}
<span class="text-gray-600">Žádné dostupné záznamy.</span>
{% endif %}
</template>
<template v-if="isCurrentView('current_lectures')">
{% if current_lectures %}
<ul class="grid grid-cols-1 md:grid-cols-2 gap-4">
......@@ -54,6 +103,7 @@
<span class="text-gray-600">Žádná dostupná aktuální školení.</span>
{% endif %}
</template>
<template v-if="isCurrentView('timeline')">
<div>
<div class="head-alt-md mb-4 flex items-center justify-between">
......@@ -120,24 +170,6 @@
</script>
</div>
</template>
<template v-if="isCurrentView('recordings')">
{% if past_lectures %}
<div class="flex flex-col gap-3">
{% regroup past_lectures by category as lecture_categories %}
{% for category in lecture_categories %}
<h2 class="text-3xl font-alt">{{ category.grouper }}</h2>
<ul class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4">
{% for lecture in category.list %}
{% include "lectures/includes/lecture.html" with lecture=lecture group=group %}
{% endfor %}
</ul>
{% endfor %}
</div>
{% else %}
<span class="text-gray-600">Žádné dostupné záznamy.</span>
{% endif %}
</template>
</div>
</ui-view-provider>
</div>
......
......@@ -14,9 +14,8 @@ from django.utils import timezone
from django.views.decorators.http import require_POST
from django_downloadview import ObjectDownloadView
from django_http_exceptions import HTTPExceptions
from guardian.shortcuts import get_objects_for_user
from .models import Lecture, LectureGroup, LectureMaterial
from .models import Lecture, LectureGroup, LectureLector, LectureMaterial
class LectureMaterialFileDownloadView(ObjectDownloadView):
......@@ -60,7 +59,7 @@ def generate_auth_redirect(request) -> HttpResponseRedirect:
def get_lectures(request, filter=None, get_exceptions: bool = True) -> tuple:
lectures = get_objects_for_user(request.user, "lectures.view_lecture")
lectures = Lecture.objects
if filter is not None:
lectures = lectures.filter(filter)
......@@ -68,9 +67,10 @@ def get_lectures(request, filter=None, get_exceptions: bool = True) -> tuple:
if get_exceptions and not lectures.exists():
raise HTTPExceptions.NOT_FOUND
lectures = lectures.all()
if not (
get_objects_for_user(request.user, "lectures.view_lecturegroup")
.filter(
LectureGroup.objects.filter(
models.Q(
id__in=(
LectureGroup.objects.filter(
......@@ -104,8 +104,7 @@ def get_lectures(request, filter=None, get_exceptions: bool = True) -> tuple:
def view_groups(request):
lecture_groups = (
get_objects_for_user(request.user, "lectures.view_lecturegroup")
.filter(
LectureGroup.objects.filter(
(
models.Q(user_groups__in=request.user.groups.all())
| models.Q(user_groups=None)
......@@ -132,9 +131,7 @@ def view_groups(request):
def view_group_lectures(request, group_id: int):
group = get_objects_for_user(request.user, "lectures.view_lecturegroup").filter(
id=group_id
)
group = LectureGroup.objects.filter(id=group_id)
group_id_exists = group.exists()
......@@ -159,22 +156,18 @@ def view_group_lectures(request, group_id: int):
timestamp_ending_separator = timezone.now() + Lecture.is_current_ending_treshold
past_lectures = (
get_objects_for_user(request.user, "lectures.view_lecture")
.filter(
Lecture.objects.filter(
lecture_group_types__group=group,
timestamp__lt=timestamp_starting_separator,
)
.order_by("category")
.all()
)
current_lectures = (
get_objects_for_user(request.user, "lectures.view_lecture")
.filter(
current_lectures = Lecture.objects.filter(
lecture_group_types__group=group,
timestamp__gte=timestamp_starting_separator,
timestamp__lte=timestamp_ending_separator,
)
.all()
)
).all()
calendar_data = []
all_lectures = list(
......@@ -182,12 +175,10 @@ def view_group_lectures(request, group_id: int):
past_lectures,
current_lectures,
(
get_objects_for_user(request.user, "lectures.view_lecture")
.filter(
Lecture.objects.filter(
lecture_group_types__group=group,
timestamp__gte=timestamp_ending_separator,
)
.all()
).all()
),
)
)
......@@ -272,11 +263,7 @@ def get_related_group_id(request):
if not str(related_group_id).isnumeric():
raise HTTPExceptions.BAD_REQUEST
if not (
get_objects_for_user(request.user, "lectures.view_lecturegroup")
.filter(id=related_group_id)
.exists()
):
if not (LectureGroup.objects.filter(id=related_group_id).exists()):
# Ignore the wrong part of the URL and move on, don't raise exceptions
# just because of the related_group_id being wrong.
related_group_id = None
......@@ -360,9 +347,7 @@ def search(request):
def view_lector(request, id):
lector = get_object_or_404(
get_objects_for_user(request.user, "lectures.view_lecturelector"), id=id
)
lector = get_object_or_404(LectureLector, id=id)
lectures = get_lectures(
request, models.Q(id__in=lector.lectures.all()), get_exceptions=False
......@@ -374,11 +359,7 @@ def view_lector(request, id):
if not str(related_lecture_id).isnumeric():
raise HTTPExceptions.BAD_REQUEST
if not (
get_objects_for_user(request.user, "lectures.view_lecture")
.filter(id=related_lecture_id)
.exists()
):
if not (Lecture.objects.filter(id=related_lecture_id).exists()):
# Ignore the wrong part of the URL and move on, don't raise exceptions
# just because of the related_lecture_id being wrong.
related_lecture_id = None
......
......@@ -1283,9 +1283,9 @@
}
},
"node_modules/nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"funding": [
{
"type": "github",
......@@ -1447,9 +1447,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.27",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz",
"integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==",
"version": "8.4.33",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz",
"integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
"funding": [
{
"type": "opencollective",
......@@ -1465,7 +1465,7 @@
}
],
"dependencies": {
"nanoid": "^3.3.6",
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
......
......@@ -11,7 +11,6 @@ pirates==0.6.0
django-markdownx==4.0.0b1
django-environ==0.9.0
django-http-exceptions==1.4.0
django-guardian==2.4.0
gql[requests]==3.4.1
requests==2.31.0
PyJWT==2.6.0
......
import enum
from django.contrib import admin
from guardian.admin import GuardedModelAdmin
from markdownx.admin import MarkdownxModelAdmin
class MarkdownxGuardedModelAdmin(MarkdownxModelAdmin, GuardedModelAdmin):
pass
class FieldsetInlineOrder(enum.Enum):
......
......@@ -26,5 +26,34 @@ $(window).ready(
window.currentTimelineYear--;
showTimelineYear();
}
$(".__lecture-category").on(
"click",
event => {
if (event.currentTarget.dataset.isOpen === 'true') {
$(event.currentTarget).
find(".__lecture-category-opener").
addClass("ico--chevron-down").
removeClass("ico--chevron-up")
event.currentTarget.dataset.isOpen = 'false'
$(event.currentTarget).
find(".__lecture-category-content").
addClass("hidden")
} else {
$(event.currentTarget).
find(".__lecture-category-opener").
removeClass("ico--chevron-down").
addClass("ico--chevron-up")
event.currentTarget.dataset.isOpen = 'true'
$(event.currentTarget).
find(".__lecture-category-content").
removeClass("hidden")
}
}
)
}
)
......@@ -52,7 +52,6 @@ INSTALLED_APPS = [
"django.contrib.messages",
"django.contrib.staticfiles",
"dbsettings",
"guardian",
"markdownx",
"pirates",
"webpack_loader",
......@@ -131,7 +130,6 @@ AUTH_USER_MODEL = "users.User"
AUTHENTICATION_BACKENDS = (
"oidc.auth.UcebniceOIDCAuthenticationBackend",
"django.contrib.auth.backends.ModelBackend",
"guardian.backends.ObjectPermissionBackend",
)
LOGIN_URL = "/oidc/authenticate/"
......
from django.contrib import admin
from shared.admin import MarkdownxGuardedModelAdmin
from markdownx.admin import MarkdownxModelAdmin
from .models import User
class UserAdmin(MarkdownxGuardedModelAdmin):
class UserAdmin(MarkdownxModelAdmin):
search_fields = ("first_name", "last_name", "email")
......
......@@ -30,10 +30,6 @@ class User(pirates_models.AbstractUser):
verbose_name="E-mailová adresa",
)
def set_unusable_password(self) -> None:
# Purely for compatibility with Guardian
pass
def get_username(self) -> str:
first_name = self.first_name
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment