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
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
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
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)
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