refactored move_topic and signals (for set last_post and update counters)

This commit is contained in:
slav0nic 2009-12-24 17:24:39 +02:00
parent 9bf9948e7a
commit 30a7c2359c
4 changed files with 69 additions and 66 deletions

View file

@ -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':

View file

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

View file

@ -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 %}

View file

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