Skip to content
Snippets Groups Projects
Unverified Commit 92e833d5 authored by Jansen Kantor's avatar Jansen Kantor Committed by GitHub
Browse files

add api function and teams service (#22515)

* add api function and teams service
parent 652b49c5
No related merge requests found
......@@ -13,6 +13,7 @@ from edx_django_utils.cache import DEFAULT_REQUEST_CACHE
from badges.service import BadgingService
from badges.utils import badges_enabled
from lms.djangoapps.lms_xblock.models import XBlockAsidesConfig
from lms.djangoapps.teams.services import TeamsService
from openedx.core.djangoapps.user_api.course_tag import api as user_course_tag_api
from openedx.core.lib.url_utils import quote_slashes
from openedx.core.lib.xblock_utils import wrap_xblock_aside, xblock_local_resource_url
......@@ -155,6 +156,7 @@ class LmsModuleSystem(ModuleSystem): # pylint: disable=abstract-method
if badges_enabled():
services['badging'] = BadgingService(course_id=kwargs.get('course_id'), modulestore=store)
self.request_token = kwargs.pop('request_token', None)
services['teams'] = TeamsService()
super(LmsModuleSystem, self).__init__(**kwargs)
def handler_url(self, *args, **kwargs):
......
......@@ -7,6 +7,8 @@ import logging
from enum import Enum
from django.db.models import Count
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
from course_modes.models import CourseMode
from lms.djangoapps.discussion.django_comment_client.utils import has_discussion_privileges
......@@ -241,3 +243,22 @@ def can_user_create_team_in_topic(user, course_id, topic_id):
(not is_instructor_managed_topic(topic_id)) or
has_course_staff_privileges(user, course_id)
)
def get_team_for_user_and_course(user, course_id):
"""
Returns the team that the given user is on in the course, or None
If course_id does not exist, a ValueError is raised
"""
try:
course_key = CourseKey.from_string(course_id)
except InvalidKeyError:
raise ValueError(u"The supplied course id {course_id} is not valid.".format(
course_id=course_id
))
return CourseTeam.objects.filter(
course_id=course_key,
membership__user__username=user.username,
).first()
""" Services to expose the Teams API to XBlocks """
from __future__ import absolute_import
from django.urls import reverse
class TeamsService(object):
""" Functions to provide teams functionality to XBlocks"""
def get_team(self, user, course_id):
from . import api
return api.get_team_for_user_and_course(user, course_id)
def get_team_detail_url(self, team):
""" Returns the url to the detail view for the given team """
teams_dashboard_url = reverse('teams_dashboard', kwargs={'course_id': team.course_id})
# Unfortunately required since this URL resolution is done in a Backbone view
return "{teams_dashboard_url}#teams/{topic_id}/{team_id}".format(
teams_dashboard_url=teams_dashboard_url,
topic_id=team.topic_id,
team_id=team.team_id,
)
......@@ -25,6 +25,7 @@ class CourseTeamFactory(DjangoModelFactory):
django_get_or_create = ('team_id',)
team_id = factory.Sequence('team-{0}'.format)
topic_id = factory.Sequence('topic-{0}'.format)
discussion_topic_id = factory.LazyAttribute(lambda a: uuid4().hex)
name = factory.Sequence(u"Awesome Team {0}".format)
description = "A simple description"
......
......@@ -81,6 +81,35 @@ class PythonAPITests(SharedModuleStoreTestCase):
self.assertTrue(teams_api.discussion_visible_by_user(self.team2.discussion_topic_id, self.user2))
self.assertTrue(teams_api.discussion_visible_by_user('DO_NOT_EXISTS', self.user3))
def test_get_team(self):
# Course 1
user1_team = teams_api.get_team_for_user_and_course(self.user1, str(COURSE_KEY1))
user2_team = teams_api.get_team_for_user_and_course(self.user2, str(COURSE_KEY1))
user3_team = teams_api.get_team_for_user_and_course(self.user3, str(COURSE_KEY1))
self.assertEqual(user1_team, self.team1)
self.assertEqual(user2_team, self.team1)
self.assertEqual(user3_team, None)
# Course 2
user1_team = teams_api.get_team_for_user_and_course(self.user1, str(COURSE_KEY2))
user2_team = teams_api.get_team_for_user_and_course(self.user2, str(COURSE_KEY2))
user3_team = teams_api.get_team_for_user_and_course(self.user3, str(COURSE_KEY2))
self.assertEqual(user1_team, None)
self.assertEqual(user2_team, None)
self.assertEqual(user3_team, self.team2)
def test_get_team_invalid_course(self):
invalid_course_id = 'lol!()#^$&course'
message = 'The supplied course id lol!()#^$&course is not valid'
with self.assertRaisesMessage(ValueError, message):
teams_api.get_team_for_user_and_course(self.user1, invalid_course_id)
def test_get_team_course_not_found(self):
team = teams_api.get_team_for_user_and_course(self.user1, 'nonsense/garbage/nonexistant')
self.assertIsNone(team)
@ddt.ddt
class TeamAccessTests(SharedModuleStoreTestCase):
......
# -*- coding: utf-8 -*-
"""
Tests for any Teams app services
"""
from __future__ import absolute_import, unicode_literals
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from openedx.core.djangoapps.catalog.tests.factories import CourseRunFactory
from lms.djangoapps.teams.services import TeamsService
from lms.djangoapps.teams.tests.factories import CourseTeamFactory
class TeamsServiceTests(ModuleStoreTestCase):
""" Tests for the TeamsService """
def setUp(self):
super(TeamsServiceTests, self).setUp()
self.course_run = CourseRunFactory.create()
self.team = CourseTeamFactory.create(course_id=self.course_run['key'])
self.service = TeamsService()
def test_get_team_detail_url(self):
# edx.org/courses/blah/teams/#teams/topic_id/team_id
team_detail_url = self.service.get_team_detail_url(self.team)
split_url = team_detail_url.split('/')
self.assertEqual(
split_url[1:],
[
'courses',
str(self.course_run['key']),
'teams',
'#teams',
self.team.topic_id,
self.team.team_id,
]
)
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment