Commit 193d5149 by Bridger Maxwell

Merge branch 'master' of git://github.com/benjaoming/django-wiki

parents a7a5f5e4 afce7d82
from django.db import models
from django.db.models import Q
from django.db.models.query import QuerySet
class PermissionArticleManagerMixin(object):
class ArticleQuerySet(QuerySet):
def can_read(self, user):
"""Filter objects so only the ones with a user's reading access
are included"""
if user.has_perm('wiki.moderator'):
return self.get_query_set()
return self
if user.is_anonymous():
q = self.get_query_set().filter(other_read=True)
q = self.filter(other_read=True)
else:
q = self.get_query_set().filter(Q(other_read=True) |
Q(owner=user) |
(Q(group__user=user) & Q(group_read=True))
)
q = self.filter(Q(other_read=True) |
Q(owner=user) |
(Q(group__user=user) & Q(group_read=True))
)
return q
def can_write(self, user):
"""Filter objects so only the ones with a user's writing access
are included"""
if user.has_perm('wiki.moderator'):
return self.get_query_set()
return self
if user.is_anonymous():
q = self.get_query_set().filter(other_write=True)
q = self.filter(other_write=True)
else:
q = self.get_query_set().filter(Q(other_write=True) |
Q(owner=user) |
(Q(group__user=user) & Q(group_write=True))
)
q = self.filter(Q(other_write=True) |
Q(owner=user) |
(Q(group__user=user) & Q(group_write=True))
)
return q
def active(self):
return self.filter(current_revision__deleted=False)
class PermissionArticleManager(PermissionArticleManagerMixin, models.Manager):
pass
class PermissionArticleFkManagerMixin(object):
"""A manager like the above but for objects that have a ForeignKey to
an article object and inherits its permissions."""
class ArticleFkQuerySet(QuerySet):
def can_read(self, user):
"""Filter objects so only the ones with a user's reading access
are included"""
if user.has_perm('wiki.moderator'):
return self.get_query_set()
q = self.get_query_set().filter(Q(article__other_read=True) |
Q(article__owner=user) |
(Q(article__group__user=user) & Q(article__group_read=True))
)
if user.is_anonymous():
q = self.filter(article__other_read=True)
else:
q = self.filter(Q(article__other_read=True) |
Q(article__owner=user) |
(Q(article__group__user=user) & Q(article__group_read=True))
)
return q
def can_write(self, user):
......@@ -54,22 +57,35 @@ class PermissionArticleFkManagerMixin(object):
are included"""
if user.has_perm('wiki.moderator'):
return self.get_query_set()
q = self.get_query_set().filter(Q(article__other_write=True) |
Q(article__owner=user) |
(Q(article__group__user=user) & Q(article__group_write=True))
)
if user.is_anonymous():
q = self.filter(article__other_write=True)
else:
q = self.filter(Q(article__other_write=True) |
Q(article__owner=user) |
(Q(article__group__user=user) & Q(article__group_write=True))
)
return q
class PermissionArticleFkManager(models.Manager, PermissionArticleFkManagerMixin):
pass
def active(self):
return self.filter(article__current_revision__deleted=False)
class ActiveObjectsManager(models.Manager, PermissionArticleManagerMixin):
"""A manager for objects that have a ForeignKey named 'current_revision'
(ie. a BaseRevision inheritor)."""
class ArticleManager(models.Manager):
def get_query_set(self):
return super(ActiveObjectsManager, self).get_query_set().filter(current_revision__deleted=False)
return ArticleQuerySet(self.model, using=self._db)
def active(self):
return self.get_query_set().active()
def can_read(self, user):
return self.get_query_set().can_read(user)
def can_write(self, user):
return self.get_query_set().can_write(user)
class ActiveObjectsFkManager(ActiveObjectsManager, PermissionArticleFkManagerMixin):
pass
class ArticleFkManager(models.Manager):
def get_query_set(self):
return ArticleFkQuerySet(self.model, using=self._db)
def active(self):
return self.get_query_set().active()
def can_read(self, user):
return self.get_query_set().can_read(user)
def can_write(self, user):
return self.get_query_set().can_write(user)
......@@ -12,8 +12,7 @@ from wiki import managers
class Article(models.Model):
objects = managers.PermissionArticleManager()
active_objects = managers.ActiveObjectsManager()
objects = managers.ArticleManager()
title = models.CharField(max_length=512, verbose_name=_(u'title'),
null=False, blank=False, help_text=_(u'Initial title of the article. '
......
......@@ -14,8 +14,7 @@ class IllegalFileExtension(Exception):
class Attachment(ReusablePlugin):
objects = managers.PermissionArticleFkManager()
active_objects = managers.ActiveObjectsFkManager()
objects = managers.ArticleFkManager()
current_revision = models.OneToOneField('AttachmentRevision',
verbose_name=_(u'current revision'),
......
......@@ -26,7 +26,7 @@ class AttachmentView(ArticleMixin, FormView):
if request.user.has_perm('wiki.moderator'):
self.attachments = models.Attachment.objects.filter(articles=article).order_by('current_revision__deleted', 'original_filename')
else:
self.attachments = models.Attachment.active_objects.filter(articles=article)
self.attachments = models.Attachment.objects.active().filter(articles=article)
# Fixing some weird transaction issue caused by adding commit_manually to form_valid
return super(AttachmentView, self).dispatch(request, article, *args, **kwargs)
......@@ -72,7 +72,7 @@ class AttachmentHistoryView(ArticleMixin, TemplateView):
if request.user.has_perm('wiki.moderator'):
self.attachment = get_object_or_404(models.Attachment, id=attachment_id, articles=article)
else:
self.attachment = get_object_or_404(models.Attachment.active_objects, id=attachment_id, articles=article)
self.attachment = get_object_or_404(models.Attachment.objects.active(), id=attachment_id, articles=article)
return super(AttachmentHistoryView, self).dispatch(request, article, *args, **kwargs)
def get_context_data(self, **kwargs):
......@@ -88,7 +88,7 @@ class AttachmentReplaceView(ArticleMixin, FormView):
@method_decorator(get_article(can_read=True))
def dispatch(self, request, article, attachment_id, *args, **kwargs):
self.attachment = get_object_or_404(models.Attachment.active_objects, id=attachment_id, articles=article)
self.attachment = get_object_or_404(models.Attachment.objects.active(), id=attachment_id, articles=article)
return super(AttachmentReplaceView, self).dispatch(request, article, *args, **kwargs)
def form_valid(self, form):
......@@ -148,7 +148,7 @@ class AttachmentChangeRevisionView(ArticleMixin, View):
if request.user.has_perm('wiki.moderator'):
self.attachment = get_object_or_404(models.Attachment, id=attachment_id, articles=article)
else:
self.attachment = get_object_or_404(models.Attachment.active_objects, id=attachment_id, articles=article)
self.attachment = get_object_or_404(models.Attachment.objects.active(), id=attachment_id, articles=article)
self.revision = get_object_or_404(models.AttachmentRevision, id=revision_id, attachment__articles=article)
return super(AttachmentChangeRevisionView, self).dispatch(request, article, *args, **kwargs)
......@@ -168,7 +168,7 @@ class AttachmentAddView(ArticleMixin, View):
@method_decorator(get_article(can_write=True))
def dispatch(self, request, article, attachment_id, *args, **kwargs):
self.attachment = get_object_or_404(models.Attachment.active_objects.can_write(request.user), id=attachment_id)
self.attachment = get_object_or_404(models.Attachment.objects.active().can_write(request.user), id=attachment_id)
return super(AttachmentAddView, self).dispatch(request, article, *args, **kwargs)
def post(self, request, *args, **kwargs):
......@@ -194,7 +194,7 @@ class AttachmentDeleteView(ArticleMixin, FormView):
if request.user.has_perm("wiki.moderator"):
self.attachment = get_object_or_404(models.Attachment, id=attachment_id, articles=article)
else:
self.attachment = get_object_or_404(models.Attachment.active_objects, id=attachment_id, articles=article)
self.attachment = get_object_or_404(models.Attachment.objects.active(), id=attachment_id, articles=article)
return super(AttachmentDeleteView, self).dispatch(request, article, *args, **kwargs)
def form_valid(self, form):
......@@ -237,9 +237,9 @@ class AttachmentSearchView(ArticleMixin, ListView):
def get_queryset(self):
self.query = self.request.GET.get('query', None)
if not self.query:
qs = models.Attachment.active_objects.get_empty_query_set()
qs = models.Attachment.objects.active().get_empty_query_set()
else:
qs = models.Attachment.active_objects.can_read(self.request.user)
qs = models.Attachment.objects.active().can_read(self.request.user)
qs = qs.filter(Q(original_filename__contains=self.query) |
Q(current_revision__description__contains=self.query) |
Q(article__current_revision__title__contains=self.query))
......
......@@ -11,7 +11,7 @@
</ul>
<div class="pull-left" style="margin-left: 10px;">
<div class="btn-group">
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#" style="padding: 7px;">
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#" style="padding: 7px;" title="{% trans "Sub-articles for" %} {{ article.current_revision.title }}">
<span class="icon-list"></span>
<span class="caret"></span>
</a>
......@@ -22,10 +22,12 @@
{{ child.article.current_revision.title }}
</a>
</li>
{% empty %}
<li><a href="#"><em>{% trans "No sub-articles" %}</em></a></li>
{% endfor %}
<li class="divider"></li>
<li>
<a href="">{% trans "List sub-pages" %} &raquo;</a>
<a href="" onclick="alert('TODO')">{% trans "List sub-pages" %} &raquo;</a>
</li>
</ul>
</div>
......
......@@ -69,6 +69,7 @@ class Create(FormView, ArticleMixin):
ip_address=ip_address)
messages.success(self.request, _(u"New article '%s' created.") % self.newpath.article.title)
transaction.commit()
# TODO: Handle individual exceptions better and give good feedback.
except Exception, e:
transaction.rollback()
......@@ -79,8 +80,9 @@ class Create(FormView, ArticleMixin):
transaction.commit()
return redirect('wiki:get_url', '')
url = self.get_success_url()
transaction.commit()
return self.get_success_url()
return url
def get_success_url(self):
return redirect('wiki:get_url', self.newpath.path)
......
Markdown is supported
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