예제 #1
0
class Forum(models.Model):
    """
	Very basic outline for a Forum, or group of threads. The threads
	and posts fielsd are updated by the save() methods of their
	respective models and are used for display purposes.

	All of the parent/child recursion code here is borrowed directly from
	the Satchmo project: http://www.satchmoproject.com/
	"""
    groups = models.ManyToManyField(Group, blank=True)
    title = models.CharField(_("Title"), max_length=100)
    slug = models.SlugField(_("Slug"))
    parent = models.ForeignKey('self',
                               blank=True,
                               null=True,
                               related_name='child')
    description = models.TextField(_("Description"))
    threads = models.IntegerField(_("Threads"), default=0)
    posts = models.IntegerField(_("Posts"), default=0)
    master = models.CharField(_("Master"), max_length=100, default='admin')
    order = models.IntegerField(_("Order"), default=0)

    objects = ForumManager()

    def _get_forum_latest_post(self):
        """This gets the latest post for the forum"""
        if not hasattr(self, '__forum_latest_post'):
            try:
                self.__forum_latest_post = Post.objects.filter(
                    thread__forum__pk=self.id).latest("time")
            except Post.DoesNotExist:
                self.__forum_latest_post = None

        return self.__forum_latest_post

    forum_latest_post = property(_get_forum_latest_post)

    def _recurse_for_parents_slug(self, forum_obj):
        #This is used for the urls
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.slug)
            more = self._recurse_for_parents_slug(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        p_list = self._recurse_for_parents_slug(self)
        p_list.append(self.slug)
        return '%s%s/' % (reverse('forum_index'), '/'.join(p_list))

    def _recurse_for_parents_name(self, forum_obj):
        #This is used for the visual display & save validation
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.title)
            more = self._recurse_for_parents_name(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_separator(self):
        return ' » '

    def _parents_repr(self):
        p_list = self._recurse_for_parents_name(self)
        return self.get_separator().join(p_list)

    _parents_repr.short_description = _("Forum parents")

    def _recurse_for_parents_name_url(self, forum__obj):
        #Get all the absolute urls and names (for use in site navigation)
        p_list = []
        url_list = []
        if forum__obj.parent_id:
            p = forum__obj.parent
            p_list.append(p.title)
            url_list.append(p.get_absolute_url())
            more, url = self._recurse_for_parents_name_url(p)
            p_list.extend(more)
            url_list.extend(url)
        if forum__obj == self and p_list:
            p_list.reverse()
            url_list.reverse()
        return p_list, url_list

    def get_url_name(self):
        #Get a list of the url to display and the actual urls
        p_list, url_list = self._recurse_for_parents_name_url(self)
        p_list.append(self.title)
        url_list.append(self.get_absolute_url())
        return zip(p_list, url_list)

    def __unicode__(self):
        return u'%s' % self.title

    class Meta:
        ordering = ['parent__id', 'order']
        verbose_name = _('Forum')
        verbose_name_plural = _('Forums')

    def save(self, force_insert=False, force_update=False):
        p_list = self._recurse_for_parents_name(self)
        if (self.title) in p_list:
            raise validators.ValidationError(
                _("You must not save a forum in itself!"))
        super(Forum, self).save(force_insert, force_update)

    def _flatten(self, L):
        """
		Taken from a python newsgroup post
		"""
        if type(L) != type([]): return [L]
        if L == []: return L
        return self._flatten(L[0]) + self._flatten(L[1:])

    def _recurse_for_children(self, node):
        children = []
        children.append(node)
        for child in node.child.all():
            children_list = self._recurse_for_children(child)
            children.append(children_list)
        return children

    def get_all_children(self):
        """
		Gets a list of all of the children forums.
		"""
        children_list = self._recurse_for_children(self)
        flat_list = self._flatten(children_list[1:])
        return flat_list

    def get_children(self):
        """
		Gets a list of the children forums.
		"""
        children_list = self.child.all()
        return children_list

    def has_children(self):
        if self.get_children():
            return True
        else:
            return False

    def get_posts_on_today(self):
        """
		Gets the posts of today.
		"""
        posts = 0
        if 1:
            today = datetime.datetime.now().date()
            posts = Post.objects.filter(thread__forum__pk=self.id,
                                        time__year=today.year,
                                        time__month=today.month,
                                        time__day=today.day).count()
        return posts

    def get_threads_on_today(self):
        """
		Gets the threads on today.
		"""
        threads = 0
        if 1:
            today = datetime.datetime.now().date()
            posts = thread.objects.filter(forum__pk=self.id,
                                          time__year=today.year,
                                          time__month=today.month,
                                          time__day=today.day).count()
        return posts

    def get_latest_post(self):
        """
		Gets the  latest post of today.
		"""
        try:
            the_latest_post = Post.objects.filter(
                thread__forum__pk=self.id).latest("time")
        except Post.DoesNotExist:
            the_latest_post = None
        return the_latest_post

    def get_master_list(self):
        masters = self.master.split(",")  #['admin','huyoo']
        return masters

    def get_groups(self):
        groups = []
        try:
            groups = self.groups.all().select_related()
        except:
            groups = []
        return groups
예제 #2
0
파일: models.py 프로젝트: joskid/mldata
class Forum(models.Model):
    """Very basic outline for a Forum, or group of threads.

    The threads and posts fields are updated by the save() methods of their
    respective models and are used for display purposes.

    All of the parent/child recursion code here is borrowed directly from
    the Satchmo project: http://www.satchmoproject.com/

    @cvar groups: User groups this forum belongs to
    @type groups: list of Group / models.ManyToManyField
    @cvar title: forum's title
    @type title: string / models.CharField
    @cvar slug: forum's slug
    @type slug: string / models.CharField
    @cvar parent: parent forum
    @type parent: Forum / models.ForeignKey
    @cvar description: forum's description
    @type description: string / models.CharField
    @cvar threads: number of threads in forum
    @type threads: integer / models.IntegerField
    @cvar posts: number of posts in forum
    @type posts: integer / models.IntegerField
    @cvar ordering: ordering of forum
    @type ordering: integer / models.IntegerField
    @cvar objects: available objects managed by ForumManager
    @type objects: ForumManager
    """
    groups = models.ManyToManyField(Group, blank=True)
    title = models.CharField(_("Title"), max_length=100)
    slug = models.SlugField(_("Slug"))
    parent = models.ForeignKey('self',
                               blank=True,
                               null=True,
                               related_name='child')
    description = models.TextField(_("Description"))
    threads = models.IntegerField(_("Threads"), default=0, editable=False)
    posts = models.IntegerField(_("Posts"), default=0, editable=False)
    ordering = models.IntegerField(_("Ordering"), blank=True, null=True)
    objects = ForumManager()

    def _get_forum_latest_post(self):
        """This gets the latest post for the forum.

        @return: latest forum post
        @rtype: Post or None
        """
        if not hasattr(self, '__forum_latest_post'):
            try:
                self.__forum_latest_post = Post.objects.filter(
                    thread__forum__pk=self.id).latest("time")
            except Post.DoesNotExist:
                self.__forum_latest_post = None

        return self.__forum_latest_post

    forum_latest_post = property(_get_forum_latest_post)

    def _recurse_for_parents_slug(self, forum_obj):
        """This is used for the URLs.

        @param forum_obj: forum to recurse through
        @type forum_obj: Forum
        @return: forum slugs
        @rtype: list of strings
        """
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.slug)
            more = self._recurse_for_parents_slug(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        p_list = self._recurse_for_parents_slug(self)
        p_list.append(self.slug)
        return '%s%s/' % (reverse('forum_index'), '/'.join(p_list))

    def _recurse_for_parents_name(self, forum_obj):
        """This is used for the visual display & save validation.

        @param forum_obj: forum to recurse through
        @type forum_obj: Forum
        @return: forum slugs
        @rtype: list of strings
        """
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.title)
            more = self._recurse_for_parents_name(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_separator(self):
        """Get forum seperator.

        @return: an HTML seperator
        @rtype: string
        """
        return ' » '

    def _parents_repr(self):
        """Get parents short description.

        @return: parents' names, joined by sepertor
        @rtype: string
        """
        p_list = self._recurse_for_parents_name(self)
        return self.get_separator().join(p_list)

    _parents_repr.short_description = _("Forum parents")

    def _recurse_for_parents_name_url(self, forum_obj):
        """Get all the absolute urls and names (for use in site navigation)

        @param forum_obj: forum to recurse through
        @type forum_obj: Forum
        @return: forum slugs
        @rtype: list of strings
        """
        p_list = []
        url_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.title)
            url_list.append(p.get_absolute_url())
            more, url = self._recurse_for_parents_name_url(p)
            p_list.extend(more)
            url_list.extend(url)
        if forum_obj == self and p_list:
            p_list.reverse()
            url_list.reverse()
        return p_list, url_list

    def get_url_name(self):
        """Get a list of the url to display and the actual urls.

        @return: a list of URLs
        @rtype: list of strings
        """
        p_list, url_list = self._recurse_for_parents_name_url(self)
        p_list.append(self.title)
        url_list.append(self.get_absolute_url())
        return zip(p_list, url_list)

    def __unicode__(self):
        return u'%s' % self.title

    class Meta:
        ordering = [
            'ordering',
            'title',
        ]
        verbose_name = _('Forum')
        verbose_name_plural = _('Forums')

    def save(self, force_insert=False, force_update=False):
        p_list = self._recurse_for_parents_name(self)
        if (self.title) in p_list:
            raise validators.ValidationError(
                _("You must not save a forum in itself!"))
        super(Forum, self).save(force_insert, force_update)

    def _flatten(self, L):
        """Taken from a python newsgroup post to flatten a list.

        @param L: list to flatten
        @type L: list
        @return: flattened list
        @rtype: list
        """
        if type(L) != type([]): return [L]
        if L == []: return L
        return self._flatten(L[0]) + self._flatten(L[1:])

    def _recurse_for_children(self, node):
        """Get all children for given node.

        @param node: node to find children of
        @type node: generic
        @return: list of children nodes
        @rtype: generic
        """
        children = []
        children.append(node)
        for child in node.child.all():
            children_list = self._recurse_for_children(child)
            children.append(children_list)
        return children

    def get_all_children(self):
        """Gets a list of all of the child forums.

        @return: list of all child forums.
        @rtype: list of Forum
        """
        children_list = self._recurse_for_children(self)
        flat_list = self._flatten(children_list[1:])
        return flat_list
예제 #3
0
class Forum(models.Model):
    """
    Very basic outline for a Forum, or group of threads. The threads
    and posts fielsd are updated by the save() methods of their
    respective models and are used for display purposes.

    All of the parent/child recursion code here is borrowed directly from
    the Satchmo project: http://www.satchmoproject.com/
    """
    groups = models.ManyToManyField(Group, verbose_name=_("Group"), blank=True)
    title = models.CharField(_("Title"), max_length=100)
    slug = models.SlugField(_("Slug"), unique=True)
    parent = models.ForeignKey('self',
                               verbose_name=_("Parent"),
                               blank=True,
                               null=True,
                               related_name='child')
    description = models.TextField(_("Description"))
    threads = models.IntegerField(_("Threads"), default=0, editable=False)
    posts = models.IntegerField(_("Posts"), default=0, editable=False)
    ordering = models.IntegerField(_("Ordering"), blank=True, null=True)
    for_partner = models.BooleanField(verbose_name=u'только для партнеров',
                                      default=False)

    objects = ForumManager()

    def get_children_forum(self):
        return Forum.objects.filter(parent=self)

    def get_children_thread(self):
        return Thread.objects.filter(forum=self)

    def _get_forum_latest_post(self):
        """This gets the latest post for the forum"""
        if not hasattr(self, '__forum_latest_post'):
            try:
                al_ch = self.get_all_children()
                al_ch.append(self)
                self.__forum_latest_post = Post.objects.filter(
                    thread__forum__in=al_ch).latest("time")
            except Post.DoesNotExist:
                self.__forum_latest_post = None

        return self.__forum_latest_post

    forum_latest_post = property(_get_forum_latest_post)

    def _recurse_for_parents_slug(self, forum_obj):
        #This is used for the urls
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.slug)
            more = self._recurse_for_parents_slug(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        p_list = self._recurse_for_parents_slug(self)
        p_list.append(self.slug)
        if self.for_partner:
            return '%s%s/' % (reverse('forum_index_partner'), '/'.join(p_list))
        else:
            return '%s%s/' % (reverse('forum_index'), '/'.join(p_list))

    def _recurse_for_parents_name(self, forum_obj):
        #This is used for the visual display & save validation
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.title)
            more = self._recurse_for_parents_name(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_separator(self):
        return ' » '

    def _parents_repr(self):
        p_list = self._recurse_for_parents_name(self)
        return self.get_separator().join(p_list)

    _parents_repr.short_description = _("Forum parents")

    def _recurse_for_parents_name_url(self, forum__obj):
        #Get all the absolute urls and names (for use in site navigation)
        p_list = []
        url_list = []
        if forum__obj.parent_id:
            p = forum__obj.parent
            p_list.append(p.title)
            url_list.append(p.get_absolute_url())
            more, url = self._recurse_for_parents_name_url(p)
            p_list.extend(more)
            url_list.extend(url)
        if forum__obj == self and p_list:
            p_list.reverse()
            url_list.reverse()
        return p_list, url_list

    def get_url_name(self):
        #Get a list of the url to display and the actual urls
        p_list, url_list = self._recurse_for_parents_name_url(self)
        p_list.append(self.title)
        url_list.append(self.get_absolute_url())
        return zip(p_list, url_list)

    def __unicode__(self):
        return u'%s' % self.title

    class Meta:
        ordering = [
            'ordering',
            'title',
        ]
        verbose_name = _('Forum')
        verbose_name_plural = _('Forums')

    def save(self, force_insert=False, force_update=False):
        p_list = self._recurse_for_parents_name(self)
        if (self.title) in p_list:
            raise validators.ValidationError(
                _("You must not save a forum in itself!"))
        super(Forum, self).save(force_insert, force_update)

    def _flatten(self, L):
        """
        Taken from a python newsgroup post
        """
        if type(L) != type([]): return [L]
        if L == []: return L
        return self._flatten(L[0]) + self._flatten(L[1:])

    def _recurse_for_children(self, node):
        children = []
        children.append(node)
        for child in node.child.all():
            children_list = self._recurse_for_children(child)
            children.append(children_list)
        return children

    def get_all_children(self):
        """
        Gets a list of all of the children forums.
        """
        children_list = self._recurse_for_children(self)
        flat_list = self._flatten(children_list[1:])
        return flat_list

    def get_statistic(self):
        u'''
            Возвращает список [Кол-во тем, Кол-во сообщений, Кол-во просмотров].
            Учитывает данные всех уровней вложенности.
        '''
        data = {'threads': 0, 'posts': 0, 'views': 0, 'latest_post': None}
        treads_ids = []
        children_list = self._recurse_for_children(self)
        flat_list = self._flatten(children_list)
        for child in flat_list:
            data['threads'] += child.thread_set.count()
            data['posts'] += Post.objects.filter(
                thread__forum__pk=child.id).count()
            try:
                tmp = child.thread_set.all().aggregate(
                    s=Sum('views'))['s'] or 0
            except:
                tmp = 0
            data['views'] += tmp
            treads_ids += child.thread_set.all().values_list('pk', flat=True)
        data['latest_post'] = Post.objects.filter(
            thread__pk__in=treads_ids).latest("time")
        return data
예제 #4
0
class Forum(models.Model):
    """
    论坛版块
    """
    groups = models.ManyToManyField(Group, verbose_name="隶属组", blank=True)
    title = models.CharField("标题", max_length=100)
    slug = models.SlugField("地址", unique=True)  # 访问地址
    parent = models.ForeignKey('self',
                               verbose_name="上级论坛",
                               blank=True,
                               null=True,
                               related_name='child')  # 上级话题
    description = models.TextField("介绍")
    threads = models.IntegerField("帖子数目", default=0, editable=False)  # 帖子数目
    posts = models.IntegerField("回复数量", default=0, editable=False)  # 回复数目
    ordering = models.IntegerField("排序", blank=True, null=True)  # 当前版块的序号

    objects = ForumManager()

    def __unicode__(self):
        return u'%s' % self.title

    class Meta:
        ordering = [
            'ordering',
            'title',
        ]  # 默认取数据与存储的排序
        # verbose_name = '论坛'

    def _get_forum_latest_post(self):
        """获取本论坛版块最后发表的帖子
        """
        if not hasattr(self, '__forum_latest_post'):
            try:
                self.__forum_latest_post = Post.objects.filter(
                    thread__forum__pk=self.id).latest("time")
                # filter里面的下划线表示继续深入表(外键)
            except Post.DoesNotExist:
                self.__forum_latest_post = None

        return self.__forum_latest_post

    forum_latest_post = property(_get_forum_latest_post)

    def _recurse_for_parents_slug(self, forum_obj):
        """
        递归获得上级论坛的显示url(不完整)
        """
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.slug)
            more = self._recurse_for_parents_slug(p)
            p_list.extend(more)

        if forum_obj == self and p_list:
            p_list.reverse()

        return p_list

    def get_absolute_url(self):
        """获得完整的url路径
        """
        from django.core.urlresolvers import reverse
        p_list = self._recurse_for_parents_slug(self)
        p_list.append(self.slug)
        return '%s%s/' % (reverse('forum_index'), '/'.join(p_list))

    def _recurse_for_parents_name(self, forum_obj):
        """递归获取上级论坛的名字,
        用途:1、后台显示上级论坛
        2、验证是否当前论坛的上级论坛是自身
        """
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.title)
            more = self._recurse_for_parents_name(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_separator(self):
        """返回一个分隔符
        """
        return ' » '

    def _parents_repr(self):
        """返回所有上级论坛的字符串表示
        """
        p_list = self._recurse_for_parents_name(self)
        return self.get_separator().join(p_list)

    _parents_repr.short_description = "上级论坛"

    def _recurse_for_parents_name_url(self, forum__obj):
        """获取所有上级论坛的绝对路径和名字
        """
        p_list = []
        url_list = []

        if forum__obj.parent_id:
            p = forum__obj.parent
            p_list.append(p.title)
            url_list.append(p.get_absolute_url())
            more, url = self._recurse_for_parents_name_url(p)
            p_list.extend(more)
            url_list.extend(url)
        if forum__obj == self and p_list:
            p_list.reverse()
            url_list.reverse()
        return p_list, url_list

    def get_url_name(self):
        """递归获取上级论坛及自身的名字,url地址
        用途:显示论坛导航地址及链接
        返回:一个相对应的两个元组组成的一个列表
        """
        p_list, url_list = self._recurse_for_parents_name_url(self)

        # 添加自身
        p_list.append(self.title)
        url_list.append(self.get_absolute_url())

        return zip(p_list, url_list)
예제 #5
0
class Forum(models.Model):
    """
    Very basic outline for a Forum, or group of threads. The threads
    and posts fielsd are updated by the save() methods of their
    respective models and are used for display purposes.

    All of the parent/child recursion code here is borrowed directly from
    the Satchmo project: http://www.satchmoproject.com/
    """

    title = models.CharField(_("Title"), max_length=100)
    slug = models.SlugField(_("Slug"))
    parent = models.ForeignKey('self',
                               blank=True,
                               null=True,
                               related_name='child')
    description = models.TextField(_("Description"), blank=True, default='')
    threads = models.IntegerField(_("Threads"), default=0, editable=False)
    posts = models.IntegerField(_("Posts"), default=0, editable=False)
    ordering = models.IntegerField(_("Ordering"), blank=True, null=True)
    groups = models.ManyToManyField(Group, blank=True)
    allowed_users = models.ManyToManyField(
        'auth.User',
        blank=True,
        related_name="allowed_forums",
        help_text="Ignore if non-restricted")

    objects = ForumManager()

    def _get_forum_latest_post(self):
        """This gets the latest post for the forum"""
        if not hasattr(self, '__forum_latest_post'):
            try:
                self.__forum_latest_post = Post.objects.filter(
                    thread__forum__pk=self.id).latest("time")
            except Post.DoesNotExist:
                self.__forum_latest_post = None

        return self.__forum_latest_post

    forum_latest_post = property(_get_forum_latest_post)

    def _get_forum_today_posts(self):
        """This gets the  post count of today for the forum"""
        if not hasattr(self, '__forum_today_posts'):
            try:
                self.__forum_today_posts = Post.objects.filter(
                    thread__forum__pk=self.id).count()
            except Post.DoesNotExist:
                self.__forum_today_posts = 0

        return self.__forum_today_posts

    forum_today_posts = property(_get_forum_today_posts)

    def _recurse_for_parents_slug(self, forum_obj):
        #This is used for the urls
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.slug)
            more = self._recurse_for_parents_slug(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_absolute_url(self):
        p_list = self._recurse_for_parents_slug(self)
        p_list.append(self.slug)
        return '%s%s/' % (reverse('forum_index'), '/'.join(p_list))

    def _recurse_for_parents_name(self, forum_obj):
        #This is used for the visual display & save validation
        p_list = []
        if forum_obj.parent_id:
            p = forum_obj.parent
            p_list.append(p.title)
            more = self._recurse_for_parents_name(p)
            p_list.extend(more)
        if forum_obj == self and p_list:
            p_list.reverse()
        return p_list

    def get_separator(self):
        return ' » '

    def _parents_repr(self):
        p_list = self._recurse_for_parents_name(self)
        return self.get_separator().join(p_list)

    _parents_repr.short_description = _("Forum parents")

    def _recurse_for_parents_name_url(self, forum__obj):
        #Get all the absolute urls and names (for use in site navigation)
        p_list = []
        url_list = []
        if forum__obj.parent_id:
            p = forum__obj.parent
            p_list.append(p.title)
            url_list.append(p.get_absolute_url())
            more, url = self._recurse_for_parents_name_url(p)
            p_list.extend(more)
            url_list.extend(url)
        if forum__obj == self and p_list:
            p_list.reverse()
            url_list.reverse()
        return p_list, url_list

    def get_url_name(self):
        #Get a list of the url to display and the actual urls
        p_list, url_list = self._recurse_for_parents_name_url(self)
        p_list.append(self.title)
        url_list.append(self.get_absolute_url())
        return zip(p_list, url_list)

    def __unicode__(self):
        return u'%s' % self.title

    class Meta:
        ordering = [
            'ordering',
            'title',
        ]
        verbose_name = _('Forum')
        verbose_name_plural = _('Forums')

    def save(self, force_insert=False, force_update=False):
        p_list = self._recurse_for_parents_name(self)
        if (self.title) in p_list:
            raise validators.ValidationError(
                _("You must not save a forum in itself!"))

        if not self.slug:
            self.slug = slugify(self.title)

        super(Forum, self).save(force_insert, force_update)

    def _flatten(self, L):
        """
        Taken from a python newsgroup post
        """
        if type(L) != type([]): return [L]
        if L == []: return L
        return self._flatten(L[0]) + self._flatten(L[1:])

    def _recurse_for_children(self, node):
        children = []
        children.append(node)
        for child in node.child.all():
            children_list = self._recurse_for_children(child)
            children.append(children_list)
        return children

    def get_all_children(self):
        """
        Gets a list of all of the children forums.
        """
        children_list = self._recurse_for_children(self)
        flat_list = self._flatten(children_list[1:])
        return flat_list