Skip to content

Commit

Permalink
Merge pull request #3549 from webkom/create-abaquery-forums
Browse files Browse the repository at this point in the history
Create abaquery forums
  • Loading branch information
jonasdeluna authored Feb 26, 2024
2 parents cc3afbf + fd5913a commit c48fb05
Show file tree
Hide file tree
Showing 16 changed files with 712 additions and 5 deletions.
4 changes: 2 additions & 2 deletions lego/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import RedirectView

from .v1 import router as v1
from .v1 import urlpatterns as v1_urlpatterns


@csrf_exempt
Expand All @@ -22,7 +22,7 @@ def version_redirect(request, path):

app_name = "api"
urlpatterns = [
re_path(r"^v1/", include((v1.urls, "v1"), namespace="v1")),
re_path(r"^v1/", include((v1_urlpatterns, "v1"), namespace="v1")),
re_path(
r"^$", RedirectView.as_view(url=f"/api/{settings.API_VERSION}/"), name="default"
),
Expand Down
10 changes: 10 additions & 0 deletions lego/api/v1.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.urls import include, path
from rest_framework import routers

from lego.apps.articles.views import ArticlesViewSet
Expand Down Expand Up @@ -33,6 +34,8 @@
FollowEventViewSet,
FollowUserViewSet,
)
from lego.apps.forums.urls import urlpatterns as forums_urls
from lego.apps.forums.views import ForumsViewSet, ThreadViewSet
from lego.apps.frontpage.views import FrontpageViewSet
from lego.apps.gallery.views import GalleryPictureViewSet, GalleryViewSet
from lego.apps.ical.viewsets import ICalTokenViewset, ICalViewset
Expand Down Expand Up @@ -131,6 +134,7 @@
router.register(r"followers-company", FollowCompanyViewSet)
router.register(r"followers-event", FollowEventViewSet)
router.register(r"followers-user", FollowUserViewSet)
router.register(r"forums", ForumsViewSet)
router.register(r"frontpage", FrontpageViewSet, basename="frontpage")
router.register(r"galleries", GalleryViewSet)
router.register(r"galleries/(?P<gallery_pk>\d+)/pictures", GalleryPictureViewSet)
Expand Down Expand Up @@ -192,6 +196,7 @@
r"surveys/(?P<survey_pk>\d+)/submissions", SubmissionViewSet, basename="submission"
)
router.register(r"tags", TagViewSet)
router.register(r"threads", ThreadViewSet)
router.register(r"user-delete", UserDeleteViewSet, basename="user-delete")
router.register(r"users", UsersViewSet)
router.register(
Expand All @@ -201,3 +206,8 @@
)
router.register(r"oidc", OIDCViewSet, basename="oidc")
router.register(r"webhooks-stripe", StripeWebhook, basename="webhooks-stripe")

urlpatterns = [
path("", include(router.urls)),
path("forums/", include((forums_urls, "forums"))),
]
Empty file added lego/apps/forums/__init__.py
Empty file.
Empty file added lego/apps/forums/admin.py
Empty file.
201 changes: 201 additions & 0 deletions lego/apps/forums/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
# Generated by Django 4.0.10 on 2024-02-26 16:56

import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models

import lego.apps.content.fields


class Migration(migrations.Migration):
initial = True

dependencies = [
("users", "0041_user_linkedin_id_alter_user_github_username"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("tags", "0004_auto_20200324_1859"),
]

operations = [
migrations.CreateModel(
name="Forum",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"created_at",
models.DateTimeField(
db_index=True, default=django.utils.timezone.now, editable=False
),
),
(
"updated_at",
models.DateTimeField(
default=django.utils.timezone.now, editable=False
),
),
(
"deleted",
models.BooleanField(db_index=True, default=False, editable=False),
),
("require_auth", models.BooleanField(default=True)),
("slug", models.SlugField(null=True, unique=True)),
("title", models.CharField(max_length=255)),
("description", models.TextField()),
("text", lego.apps.content.fields.ContentField(allow_images=False)),
("pinned", models.BooleanField(default=False)),
(
"can_edit_groups",
models.ManyToManyField(
blank=True,
related_name="can_edit_%(class)s",
to="users.abakusgroup",
),
),
(
"can_edit_users",
models.ManyToManyField(
blank=True,
related_name="can_edit_%(class)s",
to=settings.AUTH_USER_MODEL,
),
),
(
"can_view_groups",
models.ManyToManyField(
blank=True,
related_name="can_view_%(class)s",
to="users.abakusgroup",
),
),
(
"created_by",
models.ForeignKey(
default=None,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_created",
to=settings.AUTH_USER_MODEL,
),
),
("tags", models.ManyToManyField(blank=True, to="tags.tag")),
(
"updated_by",
models.ForeignKey(
default=None,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_updated",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="Thread",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"created_at",
models.DateTimeField(
db_index=True, default=django.utils.timezone.now, editable=False
),
),
(
"updated_at",
models.DateTimeField(
default=django.utils.timezone.now, editable=False
),
),
(
"deleted",
models.BooleanField(db_index=True, default=False, editable=False),
),
("require_auth", models.BooleanField(default=True)),
("slug", models.SlugField(null=True, unique=True)),
("title", models.CharField(max_length=255)),
("description", models.TextField()),
("text", lego.apps.content.fields.ContentField(allow_images=False)),
("pinned", models.BooleanField(default=False)),
(
"can_edit_groups",
models.ManyToManyField(
blank=True,
related_name="can_edit_%(class)s",
to="users.abakusgroup",
),
),
(
"can_edit_users",
models.ManyToManyField(
blank=True,
related_name="can_edit_%(class)s",
to=settings.AUTH_USER_MODEL,
),
),
(
"can_view_groups",
models.ManyToManyField(
blank=True,
related_name="can_view_%(class)s",
to="users.abakusgroup",
),
),
(
"created_by",
models.ForeignKey(
default=None,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_created",
to=settings.AUTH_USER_MODEL,
),
),
(
"forum",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="threads",
to="forums.forum",
),
),
("tags", models.ManyToManyField(blank=True, to="tags.tag")),
(
"updated_by",
models.ForeignKey(
default=None,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="%(class)s_updated",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
]
Empty file.
20 changes: 20 additions & 0 deletions lego/apps/forums/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django.db.models import CASCADE, ForeignKey

from lego.apps.content.models import Content
from lego.apps.forums.permissions import ForumPermissionHandler, ThreadPermissionHandler
from lego.apps.permissions.models import ObjectPermissionsModel
from lego.utils.models import BasisModel


class Forum(Content, BasisModel, ObjectPermissionsModel):
class Meta:
abstract = False
permission_handler = ForumPermissionHandler()


class Thread(Content, BasisModel, ObjectPermissionsModel):
forum = ForeignKey(Forum, on_delete=CASCADE, related_name="threads")

class Meta:
abstract = False
permission_handler = ThreadPermissionHandler()
94 changes: 94 additions & 0 deletions lego/apps/forums/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
from lego.apps.permissions.constants import CREATE, DELETE, EDIT, LIST, VIEW
from lego.apps.permissions.permissions import PermissionHandler


class ForumPermissionHandler(PermissionHandler):
force_object_permission_check = True
authentication_map = {LIST: False, VIEW: False}
default_keyword_permission = "/sudo/admin/forums/{perm}/"
default_require_auth = True

def has_perm(
self,
user,
perm,
obj=None,
queryset=None,
check_keyword_permissions=True,
**kwargs
):
if perm == LIST:
return True

if not user.is_authenticated:
return False

# Check object permissions before keywork perms
if obj is not None:
if self.has_object_permissions(user, perm, obj):
return True

if perm == EDIT and self.created_by(user, obj):
return True

has_perm = super().has_perm(
user, perm, obj, queryset, check_keyword_permissions, **kwargs
)

if has_perm:
return True

return False

def has_object_permissions(self, user, perm, obj):
return not (perm == DELETE or perm == EDIT)


class ThreadPermissionHandler(PermissionHandler):
force_object_permission_check = True
authentication_map = {LIST: False, VIEW: False}
default_keyword_permission = "/sudo/admin/threads/{perm}/"
default_require_auth = True

def has_perm(
self,
user,
perm,
obj=None,
queryset=None,
check_keyword_permissions=True,
**kwargs
):
if perm == LIST:
return True
if not user.is_authenticated:
return False

# Check object permissions before keywork perms
if obj is not None:
if self.has_object_permissions(user, perm, obj):
return True

if perm == EDIT and self.created_by(user, obj):
return True

if perm == CREATE:
return True

has_perm = super().has_perm(
user, perm, obj, queryset, check_keyword_permissions, **kwargs
)

if has_perm:
return True

return False

def has_object_permissions(self, user, perm, obj):
if perm == DELETE:
return False
if perm == EDIT and obj.created_by == user:
return True
if perm == CREATE:
return True
return not (perm == DELETE or perm == EDIT)
Loading

0 comments on commit c48fb05

Please sign in to comment.