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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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
24 changes: 24 additions & 0 deletions contentcuration/contentcuration/tests/viewsets/test_user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -91,3 +91,27 @@ def test_no_delete_user(self):
reverse("user-detail", kwargs={"pk": self.user.id})
)
self.assertEqual(response.status_code, 405, response.content)


class ChannelUserCRUDTestCase(StudioAPITestCase):
def setUp(self):
super(ChannelUserCRUDTestCase, self).setUp()
self.channel = testdata.channel()
self.user = testdata.user()
self.channel.editors.add(self.user)

def test_fetch_users(self):
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": self.channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)

def test_fetch_users_no_permissions(self):
new_channel = testdata.channel()
self.client.force_authenticate(user=self.user)
response = self.client.get(
reverse("user-list"), data={"channel": new_channel.id}, format="json",
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response.json(), [])
3 changes: 2 additions & 1 deletion contentcuration/contentcuration/viewsets/user.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,6 +24,7 @@
from rest_framework.response import Response

from contentcuration.constants import feature_flags
from contentcuration.models import boolean_val
from contentcuration.models import Channel
from contentcuration.models import User
from contentcuration.utils.pagination import get_order_queryset
Expand DownExpand Up@@ -163,7 +164,7 @@ class ChannelUserFilter(RequiredFilterSet):
def filter_channel(self, queryset, name, value):
# Check permissions
if not self.request.user.can_edit(value):
return queryset.none()
return queryset.none().annotate(can_edit=boolean_val(False), can_view=boolean_val(False))
user_queryset = User.objects.filter(id=OuterRef("id"))
queryset = queryset.annotate(
can_edit=Exists(user_queryset.filter(editable_channels=value)),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "تعديل",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.closeAction": "إغلاق",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة",
"SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة",
"SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة",
"AdministrationIndex.channelsLabel": "القنوات",
"AdministrationIndex.usersLabel": "المستخدمون"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Editar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.closeAction": "Cerrar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.savedSearchesTitle": "Búsquedas guardadas",
"SavedSearchesModal.noSavedSearches": "No tiene ninguna búsqueda guardada",
"SavedSearchesModal.searchDeletedSnackbar": "Búsqueda guardada eliminada",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "¿Es Learning Equality quien añade nuevos recursos a los canales?",
"CatalogFAQ.newContentAnswer": "Nuestro equipo de contenidos añade nuevas fuentes y canales a la biblioteca y actualiza los canales existentes a medida que los creadores de contenido ponen a disposición nuevos materiales.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "Acerca del uso de estos recursos",
"CatalogFAQ.usingContentQuestion": "He encontrado algo que me interesa y me gustaría empezar a usar. ¿Qué debo hacer?",
"CatalogFAQ.usingContentAnswer": "¡Genial! Todos estos recursos han sido especialmente empaquetados para su uso en Kolibri, nuestra plataforma de Código Abierto para aprender sin conexión, así que por favor revise cómo empezar con Kolibri primero, luego siga las instrucciones para importar materiales.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página",
"AdministrationIndex.channelsLabel": "Canales",
"AdministrationIndex.usersLabel": "Usuarios"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Modifier",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.closeAction": "Fermer",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.savedSearchesTitle": "Recherches enregistrées",
"SavedSearchesModal.noSavedSearches": "Vous n'avez aucune recherche enregistrée",
"SavedSearchesModal.searchDeletedSnackbar": "Recherche enregistrée supprimée",
Expand DownExpand Up@@ -673,7 +674,7 @@
"CatalogFAQ.newContentQuestion": "Learning Equality ajoute-t-il de nouveaux supports ?",
"CatalogFAQ.newContentAnswer": "Notre équipe chargée des contenus ajoute régulièrement de nouvelles sources et chaînes à la bibliothèque, et met à jour les chaînes existantes au fur et à mesure que les créateurs de contenus mettent à disposition de nouveaux supports.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.usingResourcesHeader": "À propos de l'utilisation de ces ressources",
"CatalogFAQ.usingContentQuestion": "J'ai trouvé quelque chose qui m'intéresse et j'aimerais commencer à l'utiliser. Que dois-je faire ?",
"CatalogFAQ.usingContentAnswer": "Formidable ! Toutes ces ressources ont été spécifiquement traitées pour permettre leur utilisation sur Kolibri, notre plateforme open source destinée à l'apprentissage hors ligne. Pour commencer, découvrez comment lancer Kolibri, puis suivez les instructions pour y importer des ressources.",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page",
"AdministrationIndex.channelsLabel": "Chaînes",
"AdministrationIndex.usersLabel": "Utilisateurs"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -507,6 +507,7 @@
"SavedSearchesModal.editAction": "Edit",
"SavedSearchesModal.deleteAction": "Delete",
"SavedSearchesModal.closeAction": "Close",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.savedSearchesTitle": "Saved searches",
"SavedSearchesModal.noSavedSearches": "You do not have any saved searches",
"SavedSearchesModal.searchDeletedSnackbar": "Saved search deleted",
Expand DownExpand Up@@ -1212,4 +1213,4 @@
"AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page",
"AdministrationIndex.channelsLabel": "Channels",
"AdministrationIndex.usersLabel": "Users"
}
}
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, zero {} one {مصدر} two {مصدرين} few {مصادر} many {مصدراً} other {مصادر}}",
"ReviewSelectionsPage.reviewSelectionHeader": "مراجعة الإختيارات",
"SavedSearchesModal.cancelAction": "إلغاء",
"SavedSearchesModal.closeButtonLabel": "إغلاق",
"SavedSearchesModal.deleteAction": "حذف",
"SavedSearchesModal.deleteConfirmation": "هل أنت متأكد من أنك تريد حذف عملية البحث المحفوظة؟",
"SavedSearchesModal.deleteSearchTitle": "حذف عمليات البحث المحفوظة",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "¿Qué es un canal?",
"CatalogFAQ.coachContentAnswer": "La mayoría de los recursos están dirigidos a los estudiantes, pero algunos, como planes de clase, actualizaciones temáticas, guías de aprendizaje profesional y similares, están dirigidos a profesores y tutores. En Kolibri, marcamos este contenido como \"apoyo para tutores\" y limitamos su visibilidad a aquellos usuarios con las cuentas de tutor. Si ves materiales para tutores en el canal, indican que posiblemente se requiere menos planificación por parte de facilitadores que usen esos recursos.",
"CatalogFAQ.coachContentQuestion": "¿Qué son los 'recursos para tutores'?",
"CatalogFAQ.customContentAnswer": "Nos encantaría que se ponga en contacto con nosotros acerca de sus propios materiales o sus recomendaciones. Escribanos a content@learningequality.org.",
"CatalogFAQ.customContentAnswer": "Para añadir sus propios materiales, cree una cuenta de Kolibri Studio en https://studio.learningequality.org. Si desea recomendar materiales educativos públicos para incuir a la Biblioteca de Contenidos de Kolibri envíenos un correo electrónico a content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "¿Cómo puedo añadir mis propios materiales o recomendar materiales de otros creadores para esta biblioteca?",
"CatalogFAQ.descriptionP1": "Aquí puede aprender más sobre los recursos educativos disponibles para uso público en Kolibri, que están organizados en \"canales\". Utilice los filtros para navegar por los canales por palabra clave, idioma o formatos de los materiales dentro.",
"CatalogFAQ.descriptionP2": "Haga clic en un canal para obtener una vista previa de los temas y temas que cubre, aprender más sobre su creador, ver cuántos recursos contiene el canal y aprender a importarlo en Kolibri. También puede encontrar contenido específico para tutores (planes de clase, guías profesionales de profesores y otros materiales complementarios de facilitación), evaluaciones y ejercicios y subtítulos para la accesibilidad.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {material} other {materiales}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Revisar seleccionado",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Cerrar",
"SavedSearchesModal.deleteAction": "Eliminar",
"SavedSearchesModal.deleteConfirmation": "Confirme que desea eliminar esta búsqueda guardada",
"SavedSearchesModal.deleteSearchTitle": "Borrar búsqueda guardada",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -111,7 +111,7 @@
"CatalogFAQ.channelQuestion": "Qu'est-ce qu'une chaîne ?",
"CatalogFAQ.coachContentAnswer": "La plupart des ressources sont destinées aux apprenants, mais certaines, telles que les plans de leçon, les remises à niveau sur telle ou telle matière, les guides d'apprentissage professionnel et autres, sont destinées aux enseignants et aux facilitateurs. Dans Kolibri, nous marquons ce contenu comme étant « pour les éducateurs », les seuls à y avoir accès. Alors avis aux planificateurs ! Si vous trouvez ce type de ressource, vous pourriez vous épargner du temps de planification !",
"CatalogFAQ.coachContentQuestion": "En quoi consistent les « ressources pour les éducateurs » ?",
"CatalogFAQ.customContentAnswer": "Nous serions ravis d'échanger avec vous au sujet de vos propres supports ou de vos recommandations. Merci de nous contacter à l'adresse content@learningequality.org !",
"CatalogFAQ.customContentAnswer": "Pour ajouter vos propres matériaux, créez un compte sur Kolibri Studio en allant sur https://studio.learningequality.org. Des recommandations au sujet des types de matériels éducatifs à ajouter à la bibliothèque de contenu de Kolibri peuvent être obtenues en contactant content@learningequality.org.",
"CatalogFAQ.customContentQuestion": "Comment puis-je ajouter mes propres supports ou recommander des supports d'autres créateurs pour cette bibliothèque ?",
"CatalogFAQ.descriptionP1": "Découvrez dans cette section les ressources pédagogiques, organisées en « chaînes », disponibles en libres accès sur Kolibri. Servez-vous des filtres pour explorer les chaînes par mot-clé, langue ou format de média.",
"CatalogFAQ.descriptionP2": "Cliquez sur une chaîne pour un aperçu des matières et des thèmes qui y sont abordés, en savoir plus sur son créateur, voir combien de ressources elle regroupe et apprendre comment les importer dans Kolibri. Vous pouvez également y trouver des contenus destinés spécifiquement aux éducateurs (plans de leçons, guides professionnels pour les enseignants et autres supports d'animation supplémentaires), des évaluations et des exercices, et des légendes pour assurer leur accessibilité.",
Expand DownExpand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {ressource} other {ressources}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Passer en revue la sélection",
"SavedSearchesModal.cancelAction": "Annuler",
"SavedSearchesModal.closeButtonLabel": "Fermer",
"SavedSearchesModal.deleteAction": "Supprimer",
"SavedSearchesModal.deleteConfirmation": "Êtes-vous sûr de vouloir supprimer cette recherche enregistrée ?",
"SavedSearchesModal.deleteSearchTitle": "Supprimer la recherche enregistrée",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {संसाधन} other {संसाधन}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "रद्द करें",
"SavedSearchesModal.closeButtonLabel": "बंद (close)",
"SavedSearchesModal.deleteAction": "मिटाएँ",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -1105,6 +1105,7 @@
"ReviewSelectionsPage.resourcesInTopic": "{count, number} {count, plural, one {recurso} other {recursos}}",
"ReviewSelectionsPage.reviewSelectionHeader": "Review selections",
"SavedSearchesModal.cancelAction": "Cancelar",
"SavedSearchesModal.closeButtonLabel": "Fechar",
"SavedSearchesModal.deleteAction": "Excluir",
"SavedSearchesModal.deleteConfirmation": "Are you sure you want to delete this saved search?",
"SavedSearchesModal.deleteSearchTitle": "Delete saved search",
Expand Down