diff --git a/contentcuration/contentcuration/tests/viewsets/test_user.py b/contentcuration/contentcuration/tests/viewsets/test_user.py index e341693cc2..e88b60dd85 100644 --- a/contentcuration/contentcuration/tests/viewsets/test_user.py +++ b/contentcuration/contentcuration/tests/viewsets/test_user.py @@ -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(), []) diff --git a/contentcuration/contentcuration/viewsets/user.py b/contentcuration/contentcuration/viewsets/user.py index 093638dd35..a4d59b38f8 100644 --- a/contentcuration/contentcuration/viewsets/user.py +++ b/contentcuration/contentcuration/viewsets/user.py @@ -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 @@ -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)), diff --git a/contentcuration/locale/CSV_FILES/contentcuration/locale/ar_SA/LC_FRONTEND_MESSAGES/contentcuration-messages.json b/contentcuration/locale/CSV_FILES/contentcuration/locale/ar_SA/LC_FRONTEND_MESSAGES/contentcuration-messages.json index d514e4668a..5a4a0c9c42 100644 --- a/contentcuration/locale/CSV_FILES/contentcuration/locale/ar_SA/LC_FRONTEND_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/CSV_FILES/contentcuration/locale/ar_SA/LC_FRONTEND_MESSAGES/contentcuration-messages.json @@ -507,6 +507,7 @@ "SavedSearchesModal.editAction": "تعديل", "SavedSearchesModal.deleteAction": "حذف", "SavedSearchesModal.closeAction": "إغلاق", + "SavedSearchesModal.closeButtonLabel": "إغلاق", "SavedSearchesModal.savedSearchesTitle": "عمليات بحث محفوظة", "SavedSearchesModal.noSavedSearches": "لا توجد لديك أية عمليات بحث محفوظة", "SavedSearchesModal.searchDeletedSnackbar": "تم حذف سجلات البحث", @@ -1212,4 +1213,4 @@ "AdministrationAppError.unauthorizedDetails": "يجب أن تكون مسؤولاً في الاستوديو لتتمكن من عرض هذه الصفحة", "AdministrationIndex.channelsLabel": "القنوات", "AdministrationIndex.usersLabel": "المستخدمون" -} \ No newline at end of file +} diff --git a/contentcuration/locale/CSV_FILES/contentcuration/locale/es_ES/LC_FRONTEND_MESSAGES/contentcuration-messages.json b/contentcuration/locale/CSV_FILES/contentcuration/locale/es_ES/LC_FRONTEND_MESSAGES/contentcuration-messages.json index 160f8ed777..d8f30d677c 100644 --- a/contentcuration/locale/CSV_FILES/contentcuration/locale/es_ES/LC_FRONTEND_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/CSV_FILES/contentcuration/locale/es_ES/LC_FRONTEND_MESSAGES/contentcuration-messages.json @@ -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", @@ -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.", @@ -1212,4 +1213,4 @@ "AdministrationAppError.unauthorizedDetails": "Necesita ser administrador de Studio para ver esta página", "AdministrationIndex.channelsLabel": "Canales", "AdministrationIndex.usersLabel": "Usuarios" -} \ No newline at end of file +} diff --git a/contentcuration/locale/CSV_FILES/contentcuration/locale/fr_FR/LC_FRONTEND_MESSAGES/contentcuration-messages.json b/contentcuration/locale/CSV_FILES/contentcuration/locale/fr_FR/LC_FRONTEND_MESSAGES/contentcuration-messages.json index 8352f83e18..f10079db0f 100644 --- a/contentcuration/locale/CSV_FILES/contentcuration/locale/fr_FR/LC_FRONTEND_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/CSV_FILES/contentcuration/locale/fr_FR/LC_FRONTEND_MESSAGES/contentcuration-messages.json @@ -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", @@ -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.", @@ -1212,4 +1213,4 @@ "AdministrationAppError.unauthorizedDetails": "Il faut être administrateur de Studio pour voir cette page", "AdministrationIndex.channelsLabel": "Chaînes", "AdministrationIndex.usersLabel": "Utilisateurs" -} \ No newline at end of file +} diff --git a/contentcuration/locale/CSV_FILES/contentcuration/locale/hi_IN/LC_FRONTEND_MESSAGES/contentcuration-messages.json b/contentcuration/locale/CSV_FILES/contentcuration/locale/hi_IN/LC_FRONTEND_MESSAGES/contentcuration-messages.json index cc9232641b..58efcd4fc4 100644 --- a/contentcuration/locale/CSV_FILES/contentcuration/locale/hi_IN/LC_FRONTEND_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/CSV_FILES/contentcuration/locale/hi_IN/LC_FRONTEND_MESSAGES/contentcuration-messages.json @@ -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", @@ -1212,4 +1213,4 @@ "AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page", "AdministrationIndex.channelsLabel": "Channels", "AdministrationIndex.usersLabel": "Users" -} \ No newline at end of file +} diff --git a/contentcuration/locale/CSV_FILES/contentcuration/locale/pt_BR/LC_FRONTEND_MESSAGES/contentcuration-messages.json b/contentcuration/locale/CSV_FILES/contentcuration/locale/pt_BR/LC_FRONTEND_MESSAGES/contentcuration-messages.json index 1958ea5d52..ead91b98ff 100644 --- a/contentcuration/locale/CSV_FILES/contentcuration/locale/pt_BR/LC_FRONTEND_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/CSV_FILES/contentcuration/locale/pt_BR/LC_FRONTEND_MESSAGES/contentcuration-messages.json @@ -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", @@ -1212,4 +1213,4 @@ "AdministrationAppError.unauthorizedDetails": "You need to be an administrator of Studio to view this page", "AdministrationIndex.channelsLabel": "Channels", "AdministrationIndex.usersLabel": "Users" -} \ No newline at end of file +} diff --git a/contentcuration/locale/ar/LC_MESSAGES/contentcuration-messages.json b/contentcuration/locale/ar/LC_MESSAGES/contentcuration-messages.json index 30d90a43ba..1367991ab4 100644 --- a/contentcuration/locale/ar/LC_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/ar/LC_MESSAGES/contentcuration-messages.json @@ -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": "حذف عمليات البحث المحفوظة", diff --git a/contentcuration/locale/es_ES/LC_MESSAGES/contentcuration-messages.json b/contentcuration/locale/es_ES/LC_MESSAGES/contentcuration-messages.json index 46f0c26085..2df3350c1c 100644 --- a/contentcuration/locale/es_ES/LC_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/es_ES/LC_MESSAGES/contentcuration-messages.json @@ -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.", @@ -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", diff --git a/contentcuration/locale/fr_FR/LC_MESSAGES/contentcuration-messages.json b/contentcuration/locale/fr_FR/LC_MESSAGES/contentcuration-messages.json index 6e1a577fea..e9b4b9f594 100644 --- a/contentcuration/locale/fr_FR/LC_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/fr_FR/LC_MESSAGES/contentcuration-messages.json @@ -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é.", @@ -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", diff --git a/contentcuration/locale/hi_IN/LC_MESSAGES/contentcuration-messages.json b/contentcuration/locale/hi_IN/LC_MESSAGES/contentcuration-messages.json index e54c7242b6..0d84746e4a 100644 --- a/contentcuration/locale/hi_IN/LC_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/hi_IN/LC_MESSAGES/contentcuration-messages.json @@ -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", diff --git a/contentcuration/locale/pt_BR/LC_MESSAGES/contentcuration-messages.json b/contentcuration/locale/pt_BR/LC_MESSAGES/contentcuration-messages.json index 45b2a8bfee..64891aaa9b 100644 --- a/contentcuration/locale/pt_BR/LC_MESSAGES/contentcuration-messages.json +++ b/contentcuration/locale/pt_BR/LC_MESSAGES/contentcuration-messages.json @@ -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",