Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
511 changes: 511 additions & 0 deletions freenit/api/lms.py

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions freenit/base_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ class BaseConfig:
role = "freenit.models.sql.role"
mailinglist = "freenit.models.sql.mailinglist"
project = "freenit.models.sql.project"
lms = "freenit.models.sql.lms"
modules = ["auth"]
meta = None
auth = Auth()
Expand Down Expand Up @@ -199,6 +200,7 @@ class TestConfig(BaseConfig):
"user",
"role",
"project",
"lms",
"mailinglist",
"domain",
"dav",
Expand Down
16 changes: 16 additions & 0 deletions freenit/models/lms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from freenit.config import getConfig

config = getConfig()
lms = config.get_model("lms")

Course = lms.Course
CourseOptional = lms.CourseOptional
Lecture = lms.Lecture
LectureOptional = lms.LectureOptional
LectureState = lms.LectureState
CourseGroup = lms.CourseGroup
CourseGroupOptional = lms.CourseGroupOptional
CourseGroupPermission = lms.CourseGroupPermission
CourseMember = lms.CourseMember
NotFoundError = lms.NotFoundError
IntegrityError = lms.IntegrityError
125 changes: 125 additions & 0 deletions freenit/models/sql/lms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
from __future__ import annotations

from datetime import datetime
from enum import StrEnum

import oxyde
import pydantic

from freenit.models.sql.base import OxydeBaseModel, User

NotFoundError = oxyde.NotFoundError
IntegrityError = oxyde.IntegrityError


class LectureState(StrEnum):
DRAFT = "draft"
PUBLISHED_PUBLIC = "published_public"
PUBLISHED_PRIVATE = "published_private"


class Course(OxydeBaseModel):
id: int | None = oxyde.Field(default=None, db_pk=True)
name: str = oxyde.Field(db_unique=True)
description: str | None = oxyde.Field(default=None)
created_by: User | None = oxyde.Field(
default=None, db_fk="id", db_on_delete="SET NULL"
)
created_at: datetime | None = oxyde.Field(default=None)
updated_at: datetime | None = oxyde.Field(default=None)

class Meta:
is_table = True
table_name = "course"


class Lecture(OxydeBaseModel):
id: int | None = oxyde.Field(default=None, db_pk=True)
course: Course | None = oxyde.Field(
default=None, db_fk="id", db_on_delete="CASCADE"
)
title: str = oxyde.Field()
content: str | None = oxyde.Field(default=None)
position: int = oxyde.Field(default=0)
state: LectureState = oxyde.Field(default=LectureState.DRAFT)
created_at: datetime | None = oxyde.Field(default=None)
updated_at: datetime | None = oxyde.Field(default=None)

class Meta:
is_table = True
table_name = "lecture"
unique_together = [("course_id", "title")]


class CourseOptional(pydantic.BaseModel):
model_config = pydantic.ConfigDict(extra="forbid")

name: str | None = None
description: str | None = None


class LectureOptional(pydantic.BaseModel):
model_config = pydantic.ConfigDict(extra="forbid")

title: str | None = None
content: str | None = None
position: int | None = None
state: LectureState | None = None


class CourseGroup(OxydeBaseModel):
id: int | None = oxyde.Field(default=None, db_pk=True)
course: Course | None = oxyde.Field(
default=None, db_fk="id", db_on_delete="CASCADE"
)
name: str = oxyde.Field()
description: str | None = oxyde.Field(default=None)
created_at: datetime | None = oxyde.Field(default=None)
updated_at: datetime | None = oxyde.Field(default=None)

class Meta:
is_table = True
table_name = "course_group"
unique_together = [("course_id", "name")]


class CourseGroupOptional(pydantic.BaseModel):
model_config = pydantic.ConfigDict(extra="forbid")

name: str | None = None
description: str | None = None
permissions: list[str] | None = None


class CourseGroupPermission(OxydeBaseModel):
id: int | None = oxyde.Field(default=None, db_pk=True)
group: CourseGroup | None = oxyde.Field(
default=None, db_fk="id", db_on_delete="CASCADE"
)
permission: str = oxyde.Field()

class Meta:
is_table = True
table_name = "course_group_permission"
unique_together = [("group_id", "permission")]


class CourseMember(OxydeBaseModel):
id: int | None = oxyde.Field(default=None, db_pk=True)
group: CourseGroup | None = oxyde.Field(
default=None, db_fk="id", db_on_delete="CASCADE"
)
user: User | None = oxyde.Field(default=None, db_fk="id", db_on_delete="CASCADE")
created_at: datetime | None = oxyde.Field(default=None)

class Meta:
is_table = True
table_name = "course_member"
unique_together = [("group_id", "user_id")]


Course.model_rebuild()
Lecture.model_rebuild()
CourseGroup.model_rebuild()
CourseGroupPermission.model_rebuild()
CourseMember.model_rebuild()
6 changes: 6 additions & 0 deletions freenit/modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ def __hash__(self):
models=["freenit.models.sql.project"],
api="freenit.api.project",
),
"lms": Module(
name="lms",
dependencies=["user"],
models=["freenit.models.sql.lms"],
api="freenit.api.lms",
),
"mailinglist": Module(
name="mailinglist",
dependencies=["user"],
Expand Down
2 changes: 1 addition & 1 deletion freenit/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

domain_perms = permissions()
group_perms = permissions()
lms_perms = permissions()
mailinglist_perms = permissions()
profile_perms = permissions()
project_perms = permissions()
role_perms = permissions()
theme_perms = permissions()
user_perms = permissions()
2 changes: 1 addition & 1 deletion freenit/project/project/base_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ class BaseConfig(FreenitBaseConfig):
version = "0.0.1"
# Modules are inherited from FreenitBaseConfig (default: ["auth"]).
# Add feature modules here, e.g.:
# modules = ["auth", "project"]
# modules = ["auth", "project", "lms"]
stalwart_url = "http://stalwart.example.com"
stalwart_admin = "%admin"
stalwart_admin_pass = "" # nosec: B105
Expand Down
Loading
Loading