refactored move_topic and signals (for set last_post and update counters)
This commit is contained in:
parent
9bf9948e7a
commit
30a7c2359c
4 changed files with 69 additions and 66 deletions
|
@ -65,7 +65,7 @@ class Category(models.Model):
|
|||
@property
|
||||
def topics(self):
|
||||
return Topic.objects.filter(forum__category=self).select_related()
|
||||
|
||||
|
||||
@property
|
||||
def posts(self):
|
||||
return Post.objects.filter(topic__forum__category=self).select_related()
|
||||
|
@ -88,7 +88,7 @@ class Forum(models.Model):
|
|||
position = models.IntegerField(_('Position'), blank=True, default=0)
|
||||
description = models.TextField(_('Description'), blank=True, default='')
|
||||
moderators = models.ManyToManyField(User, blank=True, null=True, verbose_name=_('Moderators'))
|
||||
updated = models.DateTimeField(_('Updated'), default=datetime.now)
|
||||
updated = models.DateTimeField(_('Updated'), auto_now=True)
|
||||
post_count = models.IntegerField(_('Post count'), blank=True, default=0)
|
||||
topic_count = models.IntegerField(_('Topic count'), blank=True, default=0)
|
||||
last_post = models.ForeignKey('Post', related_name='last_forum_post', blank=True, null=True)
|
||||
|
@ -113,8 +113,8 @@ class Forum(models.Model):
|
|||
class Topic(models.Model):
|
||||
forum = models.ForeignKey(Forum, related_name='topics', verbose_name=_('Forum'))
|
||||
name = models.CharField(_('Subject'), max_length=255)
|
||||
created = models.DateTimeField(_('Created'), null=True)
|
||||
updated = models.DateTimeField(_('Updated'), null=True)
|
||||
created = models.DateTimeField(_('Created'), auto_now_add=True)
|
||||
updated = models.DateTimeField(_('Updated'), auto_now=True)
|
||||
user = models.ForeignKey(User, verbose_name=_('User'))
|
||||
views = models.IntegerField(_('Views count'), blank=True, default=0)
|
||||
sticky = models.BooleanField(_('Sticky'), blank=True, default=False)
|
||||
|
@ -130,7 +130,7 @@ class Topic(models.Model):
|
|||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@property
|
||||
def head(self):
|
||||
try:
|
||||
|
@ -146,11 +146,6 @@ class Topic(models.Model):
|
|||
def get_absolute_url(self):
|
||||
return ('djangobb:topic', [self.id])
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.id is None:
|
||||
self.created = datetime.now()
|
||||
super(Topic, self).save(*args, **kwargs)
|
||||
|
||||
def update_read(self, user):
|
||||
tracking = user.posttracking
|
||||
#if last_read > last_read - don't check topics
|
||||
|
@ -175,7 +170,7 @@ class Topic(models.Model):
|
|||
class Post(models.Model):
|
||||
topic = models.ForeignKey(Topic, related_name='posts', verbose_name=_('Topic'))
|
||||
user = models.ForeignKey(User, related_name='posts', verbose_name=_('User'))
|
||||
created = models.DateTimeField(_('Created'), blank=True)
|
||||
created = models.DateTimeField(_('Created'), auto_now_add=True)
|
||||
updated = models.DateTimeField(_('Updated'), blank=True, null=True)
|
||||
markup = models.CharField(_('Markup'), max_length=15, default=forum_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES)
|
||||
body = models.TextField(_('Message'))
|
||||
|
@ -191,8 +186,6 @@ class Post(models.Model):
|
|||
verbose_name_plural = _('Posts')
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.created is None:
|
||||
self.created = datetime.now()
|
||||
if self.markup == 'bbcode':
|
||||
self.body_html = mypostmarkup.markup(self.body, auto_urls=False)
|
||||
elif self.markup == 'markdown':
|
||||
|
@ -337,7 +330,7 @@ class PrivateMessage(models.Model):
|
|||
dst_user = models.ForeignKey(User, verbose_name=_('Recipient'), related_name='dst_users')
|
||||
src_user = models.ForeignKey(User, verbose_name=_('Author'), related_name='src_users')
|
||||
read = models.BooleanField(_('Read'), blank=True, default=False)
|
||||
created = models.DateTimeField(_('Created'), blank=True)
|
||||
created = models.DateTimeField(_('Created'), auto_now_add=True)
|
||||
markup = models.CharField(_('Markup'), max_length=15, default=forum_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES)
|
||||
subject = models.CharField(_('Subject'), max_length=255)
|
||||
body = models.TextField(_('Message'))
|
||||
|
@ -353,8 +346,6 @@ class PrivateMessage(models.Model):
|
|||
return self.subject
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.created is None:
|
||||
self.created = datetime.now()
|
||||
if self.markup == 'bbcode':
|
||||
self.body_html = mypostmarkup.markup(self.body, auto_urls=False)
|
||||
elif self.markup == 'markdown':
|
||||
|
|
|
@ -1,29 +1,24 @@
|
|||
from datetime import datetime
|
||||
|
||||
from django.db.models.signals import post_save, pre_save, post_delete
|
||||
|
||||
from djangobb_forum.subscription import notify_topic_subscribers, notify_pm_recipients
|
||||
from djangobb_forum.models import Topic, Post, PrivateMessage
|
||||
|
||||
|
||||
def post_saved(instance, **kwargs):
|
||||
created = kwargs.get('created')
|
||||
post = instance
|
||||
topic = post.topic
|
||||
|
||||
if created:
|
||||
updated_time = datetime.now()
|
||||
post.topic.updated = updated_time
|
||||
post.topic.last_post = post
|
||||
post.topic.post_count = post.topic.posts.count()
|
||||
post.topic.save(force_update=True)
|
||||
|
||||
post.topic.forum.updated = updated_time
|
||||
post.topic.forum.post_count = post.topic.forum.posts.count()
|
||||
post.topic.forum.last_post = post
|
||||
post.topic.forum.save(force_update=True)
|
||||
|
||||
topic.last_post = post
|
||||
topic.post_count = topic.posts.count()
|
||||
profile = post.user.forum_profile
|
||||
profile.post_count = post.user.posts.count()
|
||||
profile.save(force_update=True)
|
||||
|
||||
notify_topic_subscribers(post)
|
||||
topic.save(force_update=True)
|
||||
|
||||
|
||||
def pm_saved(instance, **kwargs):
|
||||
|
@ -33,9 +28,12 @@ def pm_saved(instance, **kwargs):
|
|||
def topic_saved(instance, **kwargs):
|
||||
created = kwargs.get('created')
|
||||
topic = instance
|
||||
if created:
|
||||
topic.forum.topic_count = topic.forum.topics.count()
|
||||
topic.forum.save(force_update=True)
|
||||
forum = topic.forum
|
||||
forum.topic_count = forum.topics.count()
|
||||
forum.updated = topic.updated
|
||||
forum.post_count = forum.posts.count()
|
||||
forum.last_post = topic.last_post
|
||||
forum.save(force_update=True)
|
||||
|
||||
|
||||
post_save.connect(post_saved, sender=Post)
|
||||
|
|
|
@ -6,9 +6,11 @@
|
|||
<div class="blockform">
|
||||
<h2><span>{% trans "Move topic" %}</span></h2>
|
||||
<div class="box">
|
||||
<form method="get" action="{% url djangobb:move_topic %}">
|
||||
<form method="POST" action="{% url djangobb:move_topic %}">
|
||||
<div class="inform">
|
||||
<input type="hidden" value="{{ topic_id }}" name="topic_id"/>
|
||||
{% for topic_id in topic_ids %}
|
||||
<input type="hidden" value="{{ topic_id }}" name="topic_id"/>
|
||||
{% endfor %}
|
||||
<fieldset>
|
||||
<legend>{% trans "Select destination of move" %}</legend>
|
||||
<div class="infldset">
|
||||
|
@ -17,7 +19,9 @@
|
|||
{% for category in categories %}
|
||||
<optgroup label="{{ category }}">
|
||||
{% for forum in category.forums.all %}
|
||||
<option value="{{ forum.id }}">{{ forum.name }}</option>
|
||||
{% ifnotequal forum exclude_forum %}
|
||||
<option value="{{ forum.id }}">{{ forum.name }}</option>
|
||||
{% endifnotequal %}
|
||||
{% endfor %}
|
||||
</optgroup>
|
||||
{% endfor %}
|
||||
|
|
|
@ -25,6 +25,8 @@ from djangobb_forum.templatetags import forum_extras
|
|||
from djangobb_forum import settings as forum_settings
|
||||
from djangobb_forum.util import urlize, smiles
|
||||
from djangobb_forum.index import post_indexer
|
||||
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||
|
||||
|
||||
@render_to('forum/index.html')
|
||||
def index(request, full=True):
|
||||
|
@ -68,17 +70,19 @@ def index(request, full=True):
|
|||
to_return['TEMPLATE'] = 'forum/lofi/index.html'
|
||||
return to_return
|
||||
|
||||
|
||||
@render_to('forum/moderate.html')
|
||||
@paged('topics', forum_settings.FORUM_PAGE_SIZE)
|
||||
def moderate(request, forum_id):
|
||||
forum = Forum.objects.get(pk=forum_id)
|
||||
forum = get_object_or_404(Forum, pk=forum_id)
|
||||
topics = forum.topics.order_by('-sticky', '-updated').select_related()
|
||||
if request.user.is_superuser or request.user in forum.moderators.all():
|
||||
if 'move_topics' in request.POST:
|
||||
topic_ids = ','.join([topic for topic in request.POST.getlist('topic_id')])
|
||||
topic_ids = request.POST.getlist('topic_id')
|
||||
return {
|
||||
'categories': Category.objects.all(),
|
||||
'topic_id': topic_ids,
|
||||
'topic_ids': topic_ids,
|
||||
'exclude_forum': forum,
|
||||
'TEMPLATE': 'forum/move_topic.html'
|
||||
}
|
||||
elif 'delete_topics' in request.POST:
|
||||
|
@ -104,6 +108,7 @@ def moderate(request, forum_id):
|
|||
else:
|
||||
raise Http404
|
||||
|
||||
|
||||
@render_to('forum/search_topics.html')
|
||||
@paged('results', forum_settings.SEARCH_PAGE_SIZE)
|
||||
def search(request):
|
||||
|
@ -201,6 +206,7 @@ def search(request):
|
|||
'TEMPLATE': 'forum/search_form.html'
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/report.html')
|
||||
def misc(request):
|
||||
|
@ -374,6 +380,7 @@ def add_post(request, forum_id, topic_id):
|
|||
'forum': forum,
|
||||
}
|
||||
|
||||
|
||||
@render_to('forum/user.html')
|
||||
def user(request, username):
|
||||
user = get_object_or_404(User, username=username)
|
||||
|
@ -478,6 +485,7 @@ def user(request, username):
|
|||
'topic_count': topic_count,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/reputation.html')
|
||||
def reputation(request, username):
|
||||
|
@ -519,6 +527,7 @@ def reputation(request, username):
|
|||
'profile': user.forum_profile,
|
||||
}
|
||||
|
||||
|
||||
def show_post(request, post_id):
|
||||
post = get_object_or_404(Post, pk=post_id)
|
||||
count = post.topic.posts.filter(created__lt=post.created).count() + 1
|
||||
|
@ -526,6 +535,7 @@ def show_post(request, post_id):
|
|||
url = '%s?page=%d#post-%d' % (reverse('djangobb:topic', args=[post.topic.id]), page, post.id)
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/edit_post.html')
|
||||
def edit_post(request, post_id):
|
||||
|
@ -544,11 +554,11 @@ def edit_post(request, post_id):
|
|||
'post': post,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/delete_posts.html')
|
||||
@paged('posts', forum_settings.TOPIC_PAGE_SIZE)
|
||||
def delete_posts(request, topic_id):
|
||||
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||
|
||||
topic = Topic.objects.select_related().get(pk=topic_id)
|
||||
|
||||
|
@ -595,47 +605,43 @@ def delete_posts(request, topic_id):
|
|||
'paged_qs': posts,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/move_topic.html')
|
||||
def move_topic(request):
|
||||
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||
first_topic = topic_ids = list(request.GET['topic_id'])
|
||||
if len(topic_ids) > 1:
|
||||
topic_ids = [topic_id for topic_id in topic_ids if topic_id != ',']
|
||||
topic_ids = request.POST.getlist('topic_id')
|
||||
first_topic = topic_ids[0]
|
||||
topic = get_object_or_404(Topic, pk=first_topic)
|
||||
from_forum = topic.forum_id
|
||||
if 'to_forum' in request.GET:
|
||||
to_forum = int(request.GET['to_forum'])
|
||||
from_forum = topic.forum
|
||||
if 'to_forum' in request.POST:
|
||||
to_forum_id = int(request.POST['to_forum'])
|
||||
to_forum = get_object_or_404(Forum, pk=to_forum_id)
|
||||
for topic_id in topic_ids:
|
||||
topic = get_object_or_404(Topic, pk=topic_id)
|
||||
if topic.forum_id != to_forum:
|
||||
if topic.forum != to_forum:
|
||||
if forum_moderated_by(topic, request.user):
|
||||
forum = get_object_or_404(Forum, pk=topic.forum_id)
|
||||
topic.forum_id = to_forum
|
||||
forum.post_count -= topic.post_count
|
||||
topic.forum.post_count += topic.post_count
|
||||
forum.topic_count -= 1
|
||||
topic.forum.topic_count += 1
|
||||
topic.forum.save()
|
||||
forum.save()
|
||||
topic.forum = to_forum
|
||||
topic.save()
|
||||
|
||||
from_forum = get_object_or_404(Forum, pk=from_forum)
|
||||
to_forum = get_object_or_404(Forum, pk=to_forum)
|
||||
post = Post.objects.filter(topic__forum=from_forum)
|
||||
from_forum.last_post = post.latest() if post else None
|
||||
to_forum.last_post = Post.objects.filter(topic__forum=to_forum).latest()
|
||||
|
||||
#TODO: not DRY
|
||||
try:
|
||||
last_post = Post.objects.filter(topic__forum=from_forum).latest()
|
||||
except Post.DoesNotExist:
|
||||
last_post = None
|
||||
from_forum.last_post = last_post
|
||||
from_forum.topic_count = from_forum.topics.count()
|
||||
from_forum.post_count = from_forum.posts.count()
|
||||
from_forum.save()
|
||||
to_forum.save()
|
||||
return HttpResponseRedirect(to_forum.get_absolute_url())
|
||||
|
||||
return {'categories': Category.objects.all(),
|
||||
'topic_id': topic_ids[0]
|
||||
'topic_id': topic_ids[0],
|
||||
'exclude_forum': from_forum,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
def stick_topic(request, topic_id):
|
||||
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||
|
||||
topic = get_object_or_404(Topic, pk=topic_id)
|
||||
if forum_moderated_by(topic, request.user):
|
||||
|
@ -647,7 +653,6 @@ def stick_topic(request, topic_id):
|
|||
|
||||
@login_required
|
||||
def unstick_topic(request, topic_id):
|
||||
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||
|
||||
topic = get_object_or_404(Topic, pk=topic_id)
|
||||
if forum_moderated_by(topic, request.user):
|
||||
|
@ -690,7 +695,6 @@ def delete_post(request, post_id):
|
|||
|
||||
@login_required
|
||||
def close_topic(request, topic_id):
|
||||
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||
|
||||
topic = get_object_or_404(Topic, pk=topic_id)
|
||||
if forum_moderated_by(topic, request.user):
|
||||
|
@ -701,7 +705,6 @@ def close_topic(request, topic_id):
|
|||
|
||||
@login_required
|
||||
def open_topic(request, topic_id):
|
||||
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||
|
||||
topic = get_object_or_404(Topic, pk=topic_id)
|
||||
if forum_moderated_by(topic, request.user):
|
||||
|
@ -720,6 +723,7 @@ def users(request):
|
|||
'form': form,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/pm/create_pm.html')
|
||||
def create_pm(request):
|
||||
|
@ -736,6 +740,7 @@ def create_pm(request):
|
|||
'form': form,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/pm/outbox.html')
|
||||
def pm_outbox(request):
|
||||
|
@ -744,6 +749,7 @@ def pm_outbox(request):
|
|||
'messages': messages,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/pm/inbox.html')
|
||||
def pm_inbox(request):
|
||||
|
@ -752,6 +758,7 @@ def pm_inbox(request):
|
|||
'messages': messages,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
@render_to('forum/pm/message.html')
|
||||
def show_pm(request, pm_id):
|
||||
|
@ -772,6 +779,7 @@ def show_pm(request, pm_id):
|
|||
'post_user': post_user,
|
||||
}
|
||||
|
||||
|
||||
@login_required
|
||||
def delete_subscription(request, topic_id):
|
||||
topic = get_object_or_404(Topic, pk=topic_id)
|
||||
|
@ -781,12 +789,14 @@ def delete_subscription(request, topic_id):
|
|||
else:
|
||||
return HttpResponseRedirect(reverse('djangobb:edit_profile'))
|
||||
|
||||
|
||||
@login_required
|
||||
def add_subscription(request, topic_id):
|
||||
topic = get_object_or_404(Topic, pk=topic_id)
|
||||
topic.subscribers.add(request.user)
|
||||
return HttpResponseRedirect(reverse('djangobb:topic', args=[topic.id]))
|
||||
|
||||
|
||||
@login_required
|
||||
def show_attachment(request, hash):
|
||||
attachment = get_object_or_404(Attachment, hash=hash)
|
||||
|
|
Reference in a new issue