Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def add_coach(self, user):
return self.add_role(user, role_kinds.COACH)
can_be_updated_by=(), # Role objects shouldn't be updated; they should be deleted and recreated as needed
can_be_deleted_by=(role_kinds.ADMIN,),
)
permissions = own | role
user = models.ForeignKey(
"FacilityUser",
related_name="roles",
blank=False,
null=False,
on_delete=models.CASCADE,
)
# Note: "It's recommended you use mptt.fields.TreeForeignKey wherever you have a foreign key to an MPTT model.
# https://django-mptt.github.io/django-mptt/models.html#treeforeignkey-treeonetoonefield-treemanytomanyfield
collection = TreeForeignKey("Collection")
kind = models.CharField(max_length=26, choices=role_kinds.choices)
class Meta:
unique_together = (("user", "collection", "kind"),)
def calculate_partition(self):
return "{dataset_id}:user-ro:{user_id}".format(
dataset_id=self.dataset_id, user_id=self.user_id
)
def calculate_source_id(self):
return "{collection_id}:{kind}".format(
collection_id=self.collection_id, kind=self.kind
)
def infer_dataset(self, *args, **kwargs):
user_dataset_id = self.cached_related_dataset_lookup("user")
from kolibri.core.auth.permissions.base import RoleBasedPermissions
from kolibri.core.fields import DateTimeTzField
from kolibri.core.fields import JSONField
from kolibri.core.notifications.models import LearnerProgressNotification
from kolibri.utils.time_utils import local_now
class Lesson(AbstractFacilityDataModel):
"""
A Lesson is a collection of non-topic ContentNodes that is linked to
a Classroom and LearnerGroups within that Classroom.
"""
permissions = RoleBasedPermissions(
target_field="collection",
can_be_created_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_read_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_updated_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_deleted_by=(role_kinds.ADMIN, role_kinds.COACH),
)
title = models.CharField(max_length=50)
description = models.CharField(default="", blank=True, max_length=200)
"""
Like Exams, we store an array of objects with the following form:
{
contentnode_id: string,
content_id: string,
channel_id: string
}
"""
resources = JSONField(default=[], blank=True)
return self.title
class ExamAssignment(AbstractFacilityDataModel):
"""
This class acts as an intermediary to handle assignment of an exam to particular collections
classes, groups, etc.
"""
morango_model_name = "examassignment"
permissions = (
RoleBasedPermissions(
target_field="collection",
can_be_created_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_read_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_updated_by=(),
can_be_deleted_by=(role_kinds.ADMIN, role_kinds.COACH),
)
| UserCanReadExamAssignmentData()
)
exam = models.ForeignKey(Exam, related_name="assignments", blank=False, null=False)
collection = models.ForeignKey(
Collection, related_name="assigned_exams", blank=False, null=False
)
assigned_by = models.ForeignKey(
FacilityUser, related_name="assigned_exams", blank=False, null=False
)
def infer_dataset(self, *args, **kwargs):
return self.cached_related_dataset_lookup("assigned_by")
def infer_dataset(self, *args, **kwargs):
return self.cached_related_dataset_lookup("created_by")
def calculate_partition(self):
return self.dataset_id
class LessonAssignment(AbstractFacilityDataModel):
"""
Links LearnerGroup- or Classroom-type Collections to a Lesson
"""
permissions = RoleBasedPermissions(
target_field="collection",
can_be_created_by=(),
can_be_read_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_updated_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_deleted_by=(),
)
lesson = models.ForeignKey(
Lesson, related_name="lesson_assignments", blank=False, null=False
)
collection = models.ForeignKey(
Collection, related_name="assigned_lessons", blank=False, null=False
)
assigned_by = models.ForeignKey(
FacilityUser, related_name="assigned_lessons", blank=False, null=False
)
def __str__(self):
return "Lesson Assignment {} for Collection {}".format(
db_columns = (
"username",
"id",
# "password",
"full_name",
"birth_year",
"gender",
"id_number",
"kind",
"assigned",
"enrolled",
)
# These constants must be entered vertbatim in the CSV
roles_map = {
role_kinds.ADMIN: "ADMIN",
role_kinds.COACH: "FACILITY_COACH",
role_kinds.ASSIGNABLE_COACH: "CLASS_COACH",
}
def not_specified(field, obj):
val = obj[field]
return None if (val == "NOT_SPECIFIED" or val == DEFERRED) else val
def kind_of_roles(field, obj):
val = obj[field]
return "LEARNER" if val is None else roles_map[val.lower()]
output_mappings = {
def log_permissions(user_field):
return (
AnyoneCanWriteAnonymousLogs(field_name=user_field + "_id")
| IsOwn(field_name=user_field + "_id")
| RoleBasedPermissions(
target_field=user_field,
can_be_created_by=(role_kinds.ADMIN,),
can_be_read_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_updated_by=(role_kinds.ADMIN,),
can_be_deleted_by=(role_kinds.ADMIN,),
)
def _user_is_admin_for_own_facility(self, user, obj=None):
# import here to avoid circular imports
from ..models import Facility
if not hasattr(user, "dataset"):
return False
# if we've been given an object, make sure it too is from the same dataset (facility)
if obj:
if not hasattr(obj, "dataset") or not user.dataset == obj.dataset:
return False
facility = Facility.objects.get(dataset=user.dataset)
return user.has_role_for_collection(role_kinds.ADMIN, facility)
"FULL_NAME",
"USER_TYPE",
"IDENTIFIER",
"BIRTH_YEAR",
"GENDER",
"ENROLLED_IN",
"ASSIGNED_TO",
)
# These constants must be entered vertbatim in the CSV
roles_map = {
"LEARNER": None,
"ADMIN": role_kinds.ADMIN,
"FACILITY_COACH": role_kinds.COACH,
"CLASS_COACH": role_kinds.ASSIGNABLE_COACH,
}
# Error messages ###
UNEXPECTED_EXCEPTION = 0
TOO_LONG = 1
INVALID = 2
DUPLICATED_USERNAME = 3
INVALID_USERNAME = 4
REQUIRED_COLUMN = 5
INVALID_HEADER = 6
NO_FACILITY = 7
FILE_READ_ERROR = 8
FILE_WRITE_ERROR = 9
REQUIRED_PASSWORD = 10
NON_EXISTENT_UUID = 11
INVALID_UUID = 12
return self.cached_related_dataset_lookup("created_by")
def calculate_partition(self):
return self.dataset_id
class LessonAssignment(AbstractFacilityDataModel):
"""
Links LearnerGroup- or Classroom-type Collections to a Lesson
"""
permissions = RoleBasedPermissions(
target_field="collection",
can_be_created_by=(),
can_be_read_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_updated_by=(role_kinds.ADMIN, role_kinds.COACH),
can_be_deleted_by=(),
)
lesson = models.ForeignKey(
Lesson, related_name="lesson_assignments", blank=False, null=False
)
collection = models.ForeignKey(
Collection, related_name="assigned_lessons", blank=False, null=False
)
assigned_by = models.ForeignKey(
FacilityUser, related_name="assigned_lessons", blank=False, null=False
)
def __str__(self):
return "Lesson Assignment {} for Collection {}".format(
self.lesson.title, self.collection.name