class CourseTeam(models.Model): """This model represents team related info.""" team_id = models.CharField(max_length=255, unique=True) name = models.CharField(max_length=255) is_active = models.BooleanField(default=True) course_id = CourseKeyField(max_length=255, db_index=True) topic_id = models.CharField(max_length=255, db_index=True, blank=True) date_created = models.DateTimeField(auto_now_add=True) # last_activity is computed through a query description = models.CharField(max_length=300) country = CountryField(blank=True) language = LanguageField( blank=True, help_text=ugettext_lazy("Optional language the team uses as ISO 639-1 code."), ) users = models.ManyToManyField(User, db_index=True, related_name='teams', through='CourseTeamMembership') @classmethod def create(cls, name, course_id, description, topic_id=None, country=None, language=None): """Create a complete CourseTeam object. Args: name (str): The name of the team to be created. course_id (str): The ID string of the course associated with this team. description (str): A description of the team. topic_id (str): An optional identifier for the topic the team formed around. country (str, optional): An optional country where the team is based, as ISO 3166-1 code. language (str, optional): An optional language which the team uses, as ISO 639-1 code. """ team_id = generate_unique_readable_id(name, cls.objects.all(), 'team_id') course_team = cls( team_id=team_id, name=name, course_id=course_id, topic_id=topic_id if topic_id else '', description=description, country=country if country else '', language=language if language else '', ) return course_team def add_user(self, user): """Adds the given user to the CourseTeam.""" if not CourseEnrollment.is_enrolled(user, self.course_id): raise NotEnrolledInCourseForTeam if CourseTeamMembership.objects.filter(user=user, team__course_id=self.course_id).exists(): raise AlreadyOnTeamInCourse return CourseTeamMembership.objects.create( user=user, team=self )
class CourseTeam(models.Model): """ This model represents team related info. .. no_pii: """ def __str__(self): return "{} in {}".format(self.name, self.course_id) def __repr__(self): return ("<CourseTeam" " id={0.id}" " team_id={0.team_id}" " team_size={0.team_size}" " topic_id={0.topic_id}" " course_id={0.course_id}" ">").format(self) class Meta(object): app_label = "teams" team_id = models.SlugField(max_length=255, unique=True) discussion_topic_id = models.SlugField(max_length=255, unique=True) name = models.CharField(max_length=255, db_index=True) course_id = CourseKeyField(max_length=255, db_index=True) topic_id = models.CharField(max_length=255, db_index=True, blank=True) date_created = models.DateTimeField(auto_now_add=True) description = models.CharField(max_length=300) country = CountryField(blank=True) language = LanguageField( blank=True, help_text=ugettext_lazy( "Optional language the team uses as ISO 639-1 code."), ) last_activity_at = models.DateTimeField( db_index=True) # indexed for ordering users = models.ManyToManyField(User, db_index=True, related_name='teams', through='CourseTeamMembership') team_size = models.IntegerField(default=0, db_index=True) # indexed for ordering field_tracker = FieldTracker() # Don't emit changed events when these fields change. FIELD_BLACKLIST = ['last_activity_at', 'team_size'] @classmethod def create(cls, name, course_id, description, topic_id=None, country=None, language=None): """Create a complete CourseTeam object. Args: name (str): The name of the team to be created. course_id (str): The ID string of the course associated with this team. description (str): A description of the team. topic_id (str): An optional identifier for the topic the team formed around. country (str, optional): An optional country where the team is based, as ISO 3166-1 code. language (str, optional): An optional language which the team uses, as ISO 639-1 code. """ unique_id = uuid4().hex team_id = slugify(name)[0:20] + '-' + unique_id discussion_topic_id = unique_id course_team = cls( team_id=team_id, discussion_topic_id=discussion_topic_id, name=name, course_id=course_id, topic_id=topic_id if topic_id else '', description=description, country=country if country else '', language=language if language else '', last_activity_at=datetime.utcnow().replace(tzinfo=pytz.utc)) return course_team def add_user(self, user): """Adds the given user to the CourseTeam.""" if not CourseEnrollment.is_enrolled(user, self.course_id): raise NotEnrolledInCourseForTeam if CourseTeamMembership.user_in_team_for_course(user, self.course_id): raise AlreadyOnTeamInCourse return CourseTeamMembership.objects.create(user=user, team=self) def reset_team_size(self): """Reset team_size to reflect the current membership count.""" self.team_size = CourseTeamMembership.objects.filter(team=self).count() self.save()
class CourseTeam(models.Model): """ This model represents team related info. .. no_pii: """ def __str__(self): return "{} in {}".format(self.name, self.course_id) def __repr__(self): return ("<CourseTeam" " id={0.id}" " team_id={0.team_id}" " team_size={0.team_size}" " topic_id={0.topic_id}" " course_id={0.course_id}" ">").format(self) class Meta(object): app_label = "teams" team_id = models.SlugField(max_length=255, unique=True) discussion_topic_id = models.SlugField(max_length=255, unique=True) name = models.CharField(max_length=255, db_index=True) course_id = CourseKeyField(max_length=255, db_index=True) topic_id = models.CharField(default='', max_length=255, db_index=True, blank=True) date_created = models.DateTimeField(auto_now_add=True) description = models.CharField(max_length=300) country = CountryField(default='', blank=True) language = LanguageField( default='', blank=True, help_text=ugettext_lazy( "Optional language the team uses as ISO 639-1 code."), ) # indexed for ordering last_activity_at = models.DateTimeField(default=utc_now, db_index=True) users = models.ManyToManyField(User, db_index=True, related_name='teams', through='CourseTeamMembership') team_size = models.IntegerField(default=0, db_index=True) # indexed for ordering field_tracker = FieldTracker() # This field would divide the teams into two mutually exclusive groups # If the team is org protected, the members in a team is enrolled into a degree bearing institution # If the team is not org protected, the members in a team is part of the general edX learning community # We need this exclusion for learner privacy protection organization_protected = models.BooleanField(default=False) # Don't emit changed events when these fields change. FIELD_BLACKLIST = ['last_activity_at', 'team_size'] @classmethod def create(cls, name, course_id, description, topic_id='', country='', language='', organization_protected=False): """Create a complete CourseTeam object. Args: name (str): The name of the team to be created. course_id (str): The ID string of the course associated with this team. description (str): A description of the team. topic_id (str): An optional identifier for the topic the team formed around. country (str, optional): An optional country where the team is based, as ISO 3166-1 code. language (str, optional): An optional language which the team uses, as ISO 639-1 code. organization_protected (bool, optional): specifies whether the team should only contain members who are in a organization context, or not """ unique_id = uuid4().hex team_id = slugify(name)[0:20] + '-' + unique_id discussion_topic_id = unique_id course_team = cls(team_id=team_id, discussion_topic_id=discussion_topic_id, name=name, course_id=course_id, topic_id=topic_id, description=description, country=country, language=language, organization_protected=organization_protected) return course_team def add_user(self, user): """Adds the given user to the CourseTeam.""" from lms.djangoapps.teams.api import user_protection_status_matches_team if not CourseEnrollment.is_enrolled(user, self.course_id): raise NotEnrolledInCourseForTeam if CourseTeamMembership.user_in_team_for_course( user, self.course_id, self.topic_id): raise AlreadyOnTeamInCourse if not user_protection_status_matches_team(user, self): raise AddToIncompatibleTeamError return CourseTeamMembership.objects.create(user=user, team=self) def reset_team_size(self): """Reset team_size to reflect the current membership count.""" self.team_size = CourseTeamMembership.objects.filter(team=self).count() self.save()