Browse Source

- Updated fixtures
- Added forum tree cache

Ralfp 12 years ago
parent
commit
97243bcda4

+ 112 - 0
misago/forumroles/fixtures.py

@@ -0,0 +1,112 @@
+from misago.utils import ugettext_lazy as _
+from misago.utils import get_msgid
+from misago.forumroles.models import ForumRole
+
+
+def load_fixtures():
+    role = ForumRole()
+    role.name(get_msgid(_('Full Access')))
+    role.set_permissions({
+                          'can_see_forum': True,
+                          'can_see_forum_contents': True,
+                          'can_read_threads': 2,
+                          'can_start_threads': 2,
+                          'can_edit_own_threads': True,
+                          'can_soft_delete_own_threads': True,
+                          'can_write_posts': 2,
+                          'can_edit_own_posts': True,
+                          'can_soft_delete_own_posts': True,
+                          'can_upvote_posts': True,
+                          'can_downvote_posts': True,
+                          'can_see_posts_scores': True,
+                          'can_see_votes': True,
+                          'can_make_polls': True,
+                          'can_vote_in_polls': True,
+                          'can_see_poll_votes': True,
+                          'can_see_attachments': True,
+                          'can_upload_attachments': True,
+                          'can_download_attachments': True,
+                          'attachment_size': 5000,
+                          'attachment_limit': 15,
+                          'can_approve': True,
+                          'can_edit_labels': True,
+                          'can_see_changelog': True,
+                          'can_pin_threads': 2,
+                          'can_edit_threads_posts': True,
+                          'can_move_threads_posts': True,
+                          'can_close_threads': True,
+                          'can_protect_posts': True,
+                          'can_delete_threads': 2,
+                          'can_delete_posts': 2,
+                          'can_delete_polls': 2,
+                          'can_delete_attachments': True,
+                          })
+    role.save(force_insert=True)
+    
+    role = ForumRole()
+    role.name(get_msgid(_('Standard Access and Upload')))
+    role.set_permissions({
+                          'can_see_forum': True,
+                          'can_see_forum_contents': True,
+                          'can_read_threads': 2,
+                          'can_start_threads': 2,
+                          'can_edit_own_threads': True,
+                          'can_write_posts': 2,
+                          'can_edit_own_posts': True,
+                          'can_soft_delete_own_posts': True,
+                          'can_upvote_posts': True,
+                          'can_downvote_posts': True,
+                          'can_make_polls': True,
+                          'can_vote_in_polls': True,
+                          'can_upload_attachments': True,
+                          'can_download_attachments': True,
+                          'attachment_size': 100,
+                          'attachment_limit': 3,
+                          })
+    role.save(force_insert=True)
+    
+    role = ForumRole()
+    role.name(get_msgid(_('Standard Access')))
+    role.set_permissions({
+                          'can_see_forum': True,
+                          'can_see_forum_contents': True,
+                          'can_read_threads': 2,
+                          'can_start_threads': 2,
+                          'can_edit_own_threads': True,
+                          'can_write_posts': 2,
+                          'can_edit_own_posts': True,
+                          'can_soft_delete_own_posts': True,
+                          'can_upvote_posts': True,
+                          'can_downvote_posts': True,
+                          'can_make_polls': True,
+                          'can_vote_in_polls': True,
+                          'can_download_attachments': True,
+                          })
+    role.save(force_insert=True)
+    
+    role = ForumRole()
+    role.name(get_msgid(_('Read and Download')))
+    role.set_permissions({
+                          'can_see_forum': True,
+                          'can_see_forum_contents': True,
+                          'can_read_threads': 2,
+                          'can_download_attachments': True,
+                          })
+    role.save(force_insert=True)
+    
+    role = ForumRole()
+    role.name(get_msgid(_('Threads list only')))
+    role.set_permissions({
+                          'can_see_forum': True,
+                          'can_see_forum_contents': True,
+                          })
+    role.save(force_insert=True)
+    
+    role = ForumRole()
+    role.name(get_msgid(_('Read only')))
+    role.set_permissions({
+                          'can_see_forum': True,
+                          'can_see_forum_contents': True,
+                          'can_read_threads': 2,
+                          })
+    role.save(force_insert=True)

+ 1 - 0
misago/forumroles/models.py

@@ -6,6 +6,7 @@ try:
 except ImportError:
 except ImportError:
     import pickle
     import pickle
 
 
+
 class ForumRole(models.Model):
 class ForumRole(models.Model):
     """
     """
     Misago User Role model
     Misago User Role model

+ 47 - 5
misago/forums/fixtures.py

@@ -1,14 +1,56 @@
+from django.utils import timezone
 from misago.monitor.fixtures import load_monitor_fixture
 from misago.monitor.fixtures import load_monitor_fixture
 from misago.forums.models import Forum
 from misago.forums.models import Forum
+from misago.markdown import post_markdown
+from misago.threads.models import Thread, Post
+from misago.utils import slugify
 
 
 def load_fixtures():
 def load_fixtures():
-    anno = Forum(token='annoucements', name='annoucements', slug='annoucements', type='forum').insert_at(target=None,save=True)
+    Forum(token='annoucements', name='annoucements', slug='annoucements', type='forum').insert_at(target=None,save=True)
     Forum(token='private', name='private', slug='private', type='forum').insert_at(target=None,save=True)
     Forum(token='private', name='private', slug='private', type='forum').insert_at(target=None,save=True)
     Forum(token='reports', name='reports', slug='reports', type='forum').insert_at(target=None,save=True)
     Forum(token='reports', name='reports', slug='reports', type='forum').insert_at(target=None,save=True)
-    Forum(token='root', name='root', slug='root').insert_at(target=None,save=True)
+    
+    root = Forum(token='root', name='root', slug='root').insert_at(target=None,save=True)
+    cat = Forum(type='category', name='First Category', slug='first-category').insert_at(target=root,save=True)
+    forum = Forum(type='forum', name='First Forum', slug='first-forum', threads=1, posts=1).insert_at(target=cat,save=True)
+    Forum(type='redirect', name='Project Homepage', slug='project-homepage', redirect='http://misago-project.org').insert_at(target=cat,save=True)
+    Forum.objects.populate_tree(True)
+       
+    now = timezone.now()
+    thread = Thread.create(
+                           forum=forum,
+                           name='Welcome to Misago!',
+                           slug=slugify('Welcome to Misago!'),
+                           start=now,
+                           last=now,
+                           )
+    post = Post.create(
+                       forum=forum,
+                       thread=thread,
+                       user_name='Misago Project',
+                       ip='127.0.0.1',
+                       agent='',
+                       post='Welcome to Misago!',
+                       post_preparsed='Welcome to Misago!',
+                       date=now,
+                       )
+    thread.start_post = post
+    thread.start_poster_name = 'Misago Project'
+    thread.start_poster_slug = 'misago-project'
+    thread.last_post = post
+    thread.last_poster_name = 'Misago Project'
+    thread.last_poster_slug = 'misago-project'
+    thread.save(force_update=True)
+    forum.last_thread = thread
+    forum.last_thread_name = thread.name
+    forum.last_thread_slug = thread.slug
+    forum.last_thread_date = thread.last
+    forum.last_poster = thread.last_poster
+    forum.last_poster_name = thread.last_poster_name
+    forum.last_poster_slug = thread.last_poster_slug
+    forum.save(force_update=True)    
     
     
     load_monitor_fixture({
     load_monitor_fixture({
-                          'threads': 0,
-                          'posts': 0,
-                          'anno': anno.pk
+                          'threads': 1,
+                          'posts': 1,
                           })
                           })

+ 33 - 1
misago/forums/models.py

@@ -1,10 +1,42 @@
 from django.conf import settings
 from django.conf import settings
+from django.core.cache import cache
 from django.db import models
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 from mptt.models import MPTTModel,TreeForeignKey
 from mptt.models import MPTTModel,TreeForeignKey
 from misago.roles.models import Role
 from misago.roles.models import Role
 
 
 class ForumManager(models.Manager):
 class ForumManager(models.Manager):
+    forums_tree = None
+    
+    def token_to_pk(self, token):
+        self.populate_tree()
+        try:
+            return self.forums_tree[token].pk
+        except KeyError:
+            return 0
+    
+    def populate_tree(self, force=False):
+        if not self.forums_tree:
+            self.forums_tree = cache.get('forums_tree')
+        if not self.forums_tree or force:
+            self.forums_tree = {}
+            for forum in Forum.objects.order_by('lft'):
+                self.forums_tree[forum.pk] = forum
+                if forum.token:
+                    self.forums_tree[forum.token] = forum
+            cache.set('forums_tree', self.forums_tree)
+    
+    def forum_parents(self, forum, include_self):
+        self.populate_tree()
+        parents = []
+        parent = self.forums_tree[forum]
+        if include_self:
+            parents.append(parent)
+        while parent.level > 1:
+            parent = self.forums_tree[parent.pk]
+            parents.append(parent)
+        return reversed(parents)
+        
     def treelist(self, acl, parent=None, tracker=None):
     def treelist(self, acl, parent=None, tracker=None):
         complete_list = []
         complete_list = []
         forums_list = []
         forums_list = []
@@ -86,7 +118,7 @@ class Forum(MPTTModel):
         if self.token == 'root':
         if self.token == 'root':
            return unicode(_('Root Category')) 
            return unicode(_('Root Category')) 
         return unicode(self.name)
         return unicode(self.name)
-    
+        
     def set_description(self, description):
     def set_description(self, description):
         self.description = description.strip()
         self.description = description.strip()
         self.description_preparsed = ''
         self.description_preparsed = ''

+ 5 - 0
misago/forums/views.py

@@ -91,6 +91,7 @@ class NewCategory(FormWidget):
                      )
                      )
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
+        Forum.objects.populate_tree(True)
         
         
         if form.cleaned_data['perms']:
         if form.cleaned_data['perms']:
             new_forum.copy_permissions(form.cleaned_data['perms'])
             new_forum.copy_permissions(form.cleaned_data['perms'])
@@ -125,6 +126,7 @@ class NewForum(FormWidget):
                      )
                      )
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
+        Forum.objects.populate_tree(True)
         
         
         if form.cleaned_data['perms']:
         if form.cleaned_data['perms']:
             new_forum.copy_permissions(form.cleaned_data['perms'])
             new_forum.copy_permissions(form.cleaned_data['perms'])
@@ -162,6 +164,7 @@ class NewRedirect(FormWidget):
                      )
                      )
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.set_description(form.cleaned_data['description'])
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
         new_forum.insert_at(form.cleaned_data['parent'], position='last-child', save=True)
+        Forum.objects.populate_tree(True)
         
         
         if form.cleaned_data['perms']:
         if form.cleaned_data['perms']:
             new_forum.copy_permissions(form.cleaned_data['perms'])
             new_forum.copy_permissions(form.cleaned_data['perms'])
@@ -274,6 +277,7 @@ class Edit(FormWidget):
             self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
             self.request.monitor['acl_version'] = int(self.request.monitor['acl_version']) + 1
             
             
         target.save(force_update=True)
         target.save(force_update=True)
+        Forum.objects.populate_tree(True)
             
             
         if form.cleaned_data['perms']:
         if form.cleaned_data['perms']:
             target.copy_permissions(form.cleaned_data['perms'])
             target.copy_permissions(form.cleaned_data['perms'])
@@ -322,4 +326,5 @@ class Delete(FormWidget):
             for child in target.get_descendants():
             for child in target.get_descendants():
                 child.delete()
                 child.delete()
         target.delete()
         target.delete()
+        Forum.objects.populate_tree(True)
         return target, Message(_('Forum "%(name)s" has been deleted.') % {'name': self.original_name}, 'success')
         return target, Message(_('Forum "%(name)s" has been deleted.') % {'name': self.original_name}, 'success')

+ 32 - 32
misago/roles/fixtures.py

@@ -2,38 +2,38 @@ from misago.roles.models import Role
 from misago.utils import ugettext_lazy as _
 from misago.utils import ugettext_lazy as _
 
 
 def load_fixtures():
 def load_fixtures():
-    role_admin = Role(
-                      name=_("Administrator").message,
-                      token='admin',
-                      protected=True,
-                      )
-    role_admin.set_permissions({
-                                'can_use_acp': True,
-                                'can_use_signature': True,
-                                })
+    role = Role(name=_("Administrator").message, token='admin', protected=True)
+    role.set_permissions({
+                          'name_changes_allowed': 5,
+                          'changes_expire': 7,
+                          'can_use_acp': True,
+                          'can_use_signature': True,
+                          'allow_signature_links': True,
+                          'allow_signature_images': True,
+                          'forums': {5: 1, 6: 1, 7: 1},
+                          })
+    role.save(force_insert=True)
     
     
-    role_mod = Role(
-                    name=_("Moderator").message,
-                    token='mod',
-                    protected=True,
-                    )
-    role_admin.set_permissions({
-                                'can_use_signature': True,
-                                })
+    role = Role(name=_("Moderator").message, token='mod', protected=True)
+    role.set_permissions({
+                          'name_changes_allowed': 3,
+                          'changes_expire': 14,
+                          'can_use_signature': True,
+                          'allow_signature_links': True,
+                          'forums': {5: 1, 6: 1, 7: 1},
+                          })
+    role.save(force_insert=True)
     
     
-    role_registered = Role(
-                           name=_("Registered").message,
-                           token='registered',
-                           )
-    role_registered.set_permissions({})
+    role = Role(name=_("Registered").message, token='registered')
+    role.set_permissions({
+                          'name_changes_allowed': 2,
+                          'can_use_signature': False,
+                          'forums': {5: 3, 6: 3, 7: 3},
+                          })
+    role.save(force_insert=True)
     
     
-    role_guest = Role(
-                      name=_("Guest").message,
-                      token='guest',
-                      )
-    role_guest.set_permissions({})
-    
-    role_admin.save(force_insert=True)
-    role_mod.save(force_insert=True)
-    role_registered.save(force_insert=True)
-    role_guest.save(force_insert=True)    
+    role = Role(name=_("Guest").message, token='guest')
+    role.set_permissions({
+                          'forums': {5: 6, 6: 6, 7: 6},
+                          })
+    role.save(force_insert=True)

+ 3 - 3
misago/threads/acl.py

@@ -36,7 +36,7 @@ def make_forum_form(request, role, form):
     form.base_fields['can_see_votes'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_see_votes'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_make_polls'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_make_polls'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_vote_in_polls'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_vote_in_polls'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
-    form.base_fields['can_see_votes'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
+    form.base_fields['can_see_poll_votes'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_see_attachments'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_see_attachments'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_upload_attachments'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_upload_attachments'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_download_attachments'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
     form.base_fields['can_download_attachments'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
@@ -102,7 +102,7 @@ def make_forum_form(request, role, form):
                         (
                         (
                          ('can_make_polls', {'label': _("Can make polls")}),
                          ('can_make_polls', {'label': _("Can make polls")}),
                          ('can_vote_in_polls', {'label': _("Can vote in polls")}),
                          ('can_vote_in_polls', {'label': _("Can vote in polls")}),
-                         ('can_see_votes', {'label': _("Can see who voted in poll")}),
+                         ('can_see_poll_votes', {'label': _("Can see who voted in poll")}),
                         ),
                         ),
                        ),)
                        ),)
     form.layout.append((
     form.layout.append((
@@ -275,7 +275,7 @@ def build_forums(acl, perms, forums, forum_roles):
                      'can_see_votes': False,
                      'can_see_votes': False,
                      'can_make_polls': False,
                      'can_make_polls': False,
                      'can_vote_in_polls': False,
                      'can_vote_in_polls': False,
-                     'can_see_votes': False,
+                     'can_see_poll_votes': False,
                      'can_see_attachments': False,
                      'can_see_attachments': False,
                      'can_upload_attachments': False,
                      'can_upload_attachments': False,
                      'can_download_attachments': False,
                      'can_download_attachments': False,

+ 0 - 7
misago/threads/fixtures.py

@@ -1,14 +1,7 @@
-from misago.monitor.fixtures import load_monitor_fixture
 from misago.settings.fixtures import load_settings_fixture, update_settings_fixture
 from misago.settings.fixtures import load_settings_fixture, update_settings_fixture
 from misago.utils import ugettext_lazy as _
 from misago.utils import ugettext_lazy as _
 from misago.utils import get_msgid
 from misago.utils import get_msgid
 
 
-monitor_fixtures = {
-                  'threads': 0,
-                  'posts': 0,
-                  }
-
-
 settings_fixtures = (
 settings_fixtures = (
     # Threads Settings
     # Threads Settings
     ('threads', {
     ('threads', {

+ 2 - 2
misago/threads/views/list.py

@@ -21,7 +21,7 @@ class ThreadsView(BaseView, ThreadsFormMixin):
     def fetch_forum(self, forum):
     def fetch_forum(self, forum):
         self.forum = Forum.objects.get(pk=forum, type='forum')
         self.forum = Forum.objects.get(pk=forum, type='forum')
         self.request.acl.forums.allow_forum_view(self.forum)
         self.request.acl.forums.allow_forum_view(self.forum)
-        self.parents = self.forum.get_ancestors().filter(level__gt=1)
+        self.parents = Forum.objects.forum_parents(forum.pk)
         if self.forum.lft + 1 != self.forum.rght:
         if self.forum.lft + 1 != self.forum.rght:
             self.forum.subforums = Forum.objects.treelist(self.request.acl.forums, self.forum, tracker=ForumsTracker(self.request.user))
             self.forum.subforums = Forum.objects.treelist(self.request.acl.forums, self.forum, tracker=ForumsTracker(self.request.user))
         self.tracker = ThreadsTracker(self.request.user, self.forum)
         self.tracker = ThreadsTracker(self.request.user, self.forum)
@@ -30,7 +30,7 @@ class ThreadsView(BaseView, ThreadsFormMixin):
         self.count = self.request.acl.threads.filter_threads(self.request, self.forum, Thread.objects.filter(forum=self.forum).filter(weight__lt=2)).count()
         self.count = self.request.acl.threads.filter_threads(self.request, self.forum, Thread.objects.filter(forum=self.forum).filter(weight__lt=2)).count()
         self.pagination = make_pagination(page, self.count, self.request.settings.threads_per_page)
         self.pagination = make_pagination(page, self.count, self.request.settings.threads_per_page)
         self.threads = []
         self.threads = []
-        queryset_anno = Thread.objects.filter(Q(forum=self.request.monitor['anno']) | (Q(forum=self.forum) & Q(weight=2)))
+        queryset_anno = Thread.objects.filter(Q(forum=Forum.objects.token_to_pk('annoucements')) | (Q(forum=self.forum) & Q(weight=2)))
         queryset_threads = self.request.acl.threads.filter_threads(self.request, self.forum, Thread.objects.filter(forum=self.forum).filter(weight__lt=2)).order_by('-weight', '-last')
         queryset_threads = self.request.acl.threads.filter_threads(self.request, self.forum, Thread.objects.filter(forum=self.forum).filter(weight__lt=2)).order_by('-weight', '-last')
         if self.request.settings.avatars_on_threads_list:
         if self.request.settings.avatars_on_threads_list:
             queryset_anno = queryset_anno.prefetch_related('start_poster', 'last_post')
             queryset_anno = queryset_anno.prefetch_related('start_poster', 'last_post')

+ 2 - 2
misago/threads/views/posting.py

@@ -25,7 +25,7 @@ class PostingView(BaseView):
         self.forum = Forum.objects.get(pk=kwargs['forum'], type='forum')
         self.forum = Forum.objects.get(pk=kwargs['forum'], type='forum')
         self.request.acl.forums.allow_forum_view(self.forum)
         self.request.acl.forums.allow_forum_view(self.forum)
         self.request.acl.threads.allow_new_threads(self.forum)
         self.request.acl.threads.allow_new_threads(self.forum)
-        self.parents = self.forum.get_ancestors(include_self=True).filter(level__gt=1)
+        self.parents = Forum.objects.forum_parents(self.forum.pk, True)
     
     
     def fetch_thread(self, kwargs):
     def fetch_thread(self, kwargs):
         self.thread = Thread.objects.get(pk=kwargs['thread'])
         self.thread = Thread.objects.get(pk=kwargs['thread'])
@@ -33,7 +33,7 @@ class PostingView(BaseView):
         self.request.acl.forums.allow_forum_view(self.forum)
         self.request.acl.forums.allow_forum_view(self.forum)
         self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
         self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
         self.request.acl.threads.allow_reply(self.thread)
         self.request.acl.threads.allow_reply(self.thread)
-        self.parents = self.forum.get_ancestors(include_self=True).filter(level__gt=1)
+        self.parents = Forum.objects.forum_parents(self.forum.pk, True)
         if kwargs.get('quote'):
         if kwargs.get('quote'):
             self.quote = Post.objects.select_related('user').get(pk=kwargs['quote'], thread=self.thread.pk)
             self.quote = Post.objects.select_related('user').get(pk=kwargs['quote'], thread=self.thread.pk)
         
         

+ 1 - 1
misago/threads/views/thread.py

@@ -18,7 +18,7 @@ class ThreadView(BaseView):
         self.forum = self.thread.forum
         self.forum = self.thread.forum
         self.request.acl.forums.allow_forum_view(self.forum)
         self.request.acl.forums.allow_forum_view(self.forum)
         self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
         self.request.acl.threads.allow_thread_view(self.request.user, self.thread)
-        self.parents = self.forum.get_ancestors(include_self=True).filter(level__gt=1)
+        self.parents = Forum.objects.forum_parents(self.forum.pk)
         self.tracker = ThreadsTracker(self.request.user, self.forum)
         self.tracker = ThreadsTracker(self.request.user, self.forum)
     
     
     def fetch_posts(self, page):
     def fetch_posts(self, page):

+ 1 - 1
misago/views.py

@@ -36,7 +36,7 @@ def category(request, forum, slug):
     return request.theme.render_to_response('category.html',
     return request.theme.render_to_response('category.html',
                                             {
                                             {
                                              'category': forum,
                                              'category': forum,
-                                             'parents': forum.get_ancestors().filter(level__gt=1),
+                                             'parents': Forum.objects.forum_parents(forum.pk),
                                              },
                                              },
                                             context_instance=RequestContext(request));
                                             context_instance=RequestContext(request));