Commits

Sergey Maranchuk  committed 90b4e73 Merge

merge with default

  • Participants
  • Parent commits 70805f2, 791457f
  • Branches stable

Comments (0)

Files changed (32)

+*.py[co]
+*.egg-info
+.pydevproject
+.project
+.settings
+*.db
+*.json
+*.log
+*~
+local_settings.py
+.env
+build/
+dist/
-07a9dad465bbd8654713e8d9d0479b83a1097be6 projects
+548e4081d215fe2fd37253eb7465905cd6f47288 projects

File djangobb_forum/admin.py

-# -*- coding: utf-8 -*-
+# coding: utf-8
+
 from django.contrib import admin
 from django.contrib.auth import admin as auth_admin
 from django.contrib.auth.models import User
+from django.utils.translation import ugettext_lazy as _
 
-from djangobb_forum.models import Category, Forum, Topic, Post, Profile, Reputation,\
-    Report, Ban
+from djangobb_forum.models import Category, Forum, Topic, Post, Profile, Reputation, \
+    Report, Ban, Attachment, Poll, PollChoice, PostTracking
 
 
-class CategoryAdmin(admin.ModelAdmin):
+class BaseModelAdmin(admin.ModelAdmin):
+    def get_actions(self, request):
+        # disabled, because delete_selected ignoring delete model method
+        actions = super(BaseModelAdmin, self).get_actions(request)
+        if 'delete_selected' in actions:
+            del actions['delete_selected']
+        return actions
+
+
+class CategoryAdmin(BaseModelAdmin):
     list_display = ['name', 'position', 'forum_count']
 
-class ForumAdmin(admin.ModelAdmin):
+class ForumAdmin(BaseModelAdmin):
     list_display = ['name', 'category', 'position', 'topic_count']
     raw_id_fields = ['moderators', 'last_post']
 
-class TopicAdmin(admin.ModelAdmin):
-    list_display = ['name', 'forum', 'created', 'head', 'post_count']
+class TopicAdmin(BaseModelAdmin):
+    def subscribers2(self, obj):
+        return ", ".join([user.username for user in obj.subscribers.all()])
+    subscribers2.short_description = _("subscribers")
+
+    list_display = ['name', 'forum', 'created', 'head', 'post_count', 'subscribers2']
     search_fields = ['name']
     raw_id_fields = ['user', 'subscribers', 'last_post']
 
-class PostAdmin(admin.ModelAdmin):
+class PostAdmin(BaseModelAdmin):
     list_display = ['topic', 'user', 'created', 'updated', 'summary']
     search_fields = ['body']
     raw_id_fields = ['topic', 'user', 'updated_by']
 
-class ProfileAdmin(admin.ModelAdmin):
+class ProfileAdmin(BaseModelAdmin):
     list_display = ['user', 'status', 'time_zone', 'location', 'language']
     raw_id_fields = ['user']
 
-class ReputationAdmin(admin.ModelAdmin):
+class PostTrackingAdmin(BaseModelAdmin):
+    list_display = ['user', 'last_read', 'topics']
+    raw_id_fields = ['user']
+
+class ReputationAdmin(BaseModelAdmin):
     list_display = ['from_user', 'to_user', 'post', 'sign', 'time', 'reason']
     raw_id_fields = ['from_user', 'to_user', 'post']
 
-class ReportAdmin(admin.ModelAdmin):
+class ReportAdmin(BaseModelAdmin):
     list_display = ['reported_by', 'post', 'zapped', 'zapped_by', 'created', 'reason']
     raw_id_fields = ['reported_by', 'post']
 
-class BanAdmin(admin.ModelAdmin):
+class BanAdmin(BaseModelAdmin):
     list_display = ['user', 'ban_start', 'ban_end', 'reason']
     raw_id_fields = ['user']
 
 class UserAdmin(auth_admin.UserAdmin):
     list_display = ['username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active']
-    
+
     def get_urls(self):
         from django.conf.urls.defaults import patterns, url
         return patterns('',
                         url(r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password), name='user_change_password'),
                         ) + super(auth_admin.UserAdmin, self).get_urls()
 
+class AttachmentAdmin(BaseModelAdmin):
+    list_display = ['id', 'name', 'size', 'path', 'hash', ]
+    search_fields = ['name']
+    list_display_links = ('name',)
+    list_filter = ("content_type",)
+
+
+class PollChoiceInline(admin.TabularInline):
+    model = PollChoice
+    extra = 3
+
+class PollAdmin(admin.ModelAdmin):
+    list_display = ("question", "active",)
+    list_display_links = ("question",)
+    list_editable = ("active",)
+    list_filter = ("active",)
+    inlines = [PollChoiceInline]
+
 
 admin.site.unregister(User)
+admin.site.register(User, UserAdmin)
 
-admin.site.register(User, UserAdmin)
 admin.site.register(Category, CategoryAdmin)
 admin.site.register(Forum, ForumAdmin)
 admin.site.register(Topic, TopicAdmin)
 admin.site.register(Post, PostAdmin)
 admin.site.register(Profile, ProfileAdmin)
+admin.site.register(PostTracking, PostTrackingAdmin)
 admin.site.register(Reputation, ReputationAdmin)
 admin.site.register(Report, ReportAdmin)
 admin.site.register(Ban, BanAdmin)
+admin.site.register(Attachment, AttachmentAdmin)
+admin.site.register(Poll, PollAdmin)
 
-admin.site.disable_action('delete_selected')  #disabled, because delete_selected ignoring delete model method

File djangobb_forum/context_processors.py

-from djangobb_forum import settings
+# coding: utf-8
 
-def forum_settings(context):
-    return {'forum_settings': settings}
+
+from django.conf import settings
+
+from djangobb_forum import settings as djangobb_settings
+
+
+def forum_settings(request):
+    return {
+        'forum_settings': djangobb_settings,
+        'DEBUG': settings.DEBUG,
+    }

File djangobb_forum/feeds.py

     def item_pubdate(self, obj):
         return obj.created
 
+    def item_author_name(self, item):
+        return item.user.username
+
 
 class LastPosts(ForumFeed):
     title = _('Latest posts on forum')
     description = _('Latest posts on forum')
     title_template = 'djangobb_forum/feeds/posts_title.html'
-    description_template = 'djangobb_forumfeeds/posts_description.html'
+    description_template = 'djangobb_forum/feeds/posts_description.html'
 
     def get_object(self, request):
         user_groups = request.user.groups.all()

File djangobb_forum/forms.py

-# -*- coding: utf-8 -*-
+# coding: utf-8
+
 import os.path
-from datetime import datetime
+from datetime import datetime, timedelta
 
 from django import forms
 from django.conf import settings
 from django.contrib.auth.models import User
+from django.db.models.expressions import F
 from django.utils.translation import ugettext_lazy as _
 
 from djangobb_forum.models import Topic, Post, Profile, Reputation, Report, \
-    Attachment
+    Attachment, Poll, PollChoice
 from djangobb_forum import settings as forum_settings
 from djangobb_forum.util import convert_text_to_html, set_language
 
 
 
 class AddPostForm(forms.ModelForm):
+    FORM_NAME = "AddPostForm" # used in view and template submit button
+
     name = forms.CharField(label=_('Subject'), max_length=255,
                            widget=forms.TextInput(attrs={'size':'115'}))
     attachment = forms.FileField(label=_('Attachment'), required=False)
+    subscribe = forms.BooleanField(label=_('Subscribe'), help_text=_("Subscribe this topic."), required=False)
 
     class Meta:
         model = Post
         else:
             topic = self.topic
 
+        if self.cleaned_data['subscribe']:
+            # User would like to subscripe to this topic
+            topic.subscribers.add(self.user)
+
         post = Post(topic=topic, user=self.user, user_ip=self.ip,
                     markup=self.user.forum_profile.markup,
                     body=self.cleaned_data['body'])
 
     class Meta:
         model = Profile
-        fields = ['time_zone', 'language']
+        fields = ['auto_subscribe', 'time_zone', 'language']
 
     def __init__(self, *args, **kwargs):
         extra_args = kwargs.pop('extra_args', {})
     class Meta:
         model = Profile
         fields = ['show_avatar', 'signature']
-        
+
     def __init__(self, *args, **kwargs):
         extra_args = kwargs.pop('extra_args', {})
         self.profile = kwargs['instance']
     def __init__(self, *args, **kwargs):
         extra_args = kwargs.pop('extra_args', {})
         super(PrivacyProfileForm, self).__init__(*args, **kwargs)
-        self.fields['privacy_permission'].widget = forms.RadioSelect(  
+        self.fields['privacy_permission'].widget = forms.RadioSelect(
                                                     choices=self.fields['privacy_permission'].choices
                                                     )
 
             sort_by = self.cleaned_data['sort_by']
             sort_dir = self.cleaned_data['sort_dir']
             qs = qs.filter(username__contains=username, forum_profile__post_count__gte=forum_settings.POST_USER_SEARCH)
-            if sort_by=='username':
-                if sort_dir=='ASC':
+            if sort_by == 'username':
+                if sort_dir == 'ASC':
                     return qs.order_by('username')
-                elif sort_dir=='DESC':
+                elif sort_dir == 'DESC':
                     return qs.order_by('-username')
-            elif sort_by=='registered':
-                if sort_dir=='ASC':
+            elif sort_by == 'registered':
+                if sort_dir == 'ASC':
                     return qs.order_by('date_joined')
-                elif sort_dir=='DESC':
+                elif sort_dir == 'DESC':
                     return qs.order_by('-date_joined')
-            elif sort_by=='num_posts':
-                if sort_dir=='ASC':
+            elif sort_by == 'num_posts':
+                if sort_dir == 'ASC':
                     return qs.order_by('forum_profile__post_count')
-                elif sort_dir=='DESC':
+                elif sort_dir == 'DESC':
                     return qs.order_by('-forum_profile__post_count')
         else:
             return qs
 
 
 class PostSearchForm(forms.Form):
-    keywords = forms.CharField(required=False, label=_('Keyword search'), 
+    keywords = forms.CharField(required=False, label=_('Keyword search'),
                                widget=forms.TextInput(attrs={'size':'40', 'maxlength':'100'}))
     author = forms.CharField(required=False, label=_('Author search'),
                              widget=forms.TextInput(attrs={'size':'25', 'maxlength':'25'}))
             pass
         else:
             raise forms.ValidationError(_('You already voted for this post'))
-        
+
         # check if this post really belong to `from_user`
         if not Post.objects.filter(pk=self.cleaned_data['post'].id, user=self.to_user).exists():
             raise forms.ValidationError(_('This post does\'t belong to this user'))
 class MailToForm(forms.Form):
     subject = forms.CharField(label=_('Subject'),
                               widget=forms.TextInput(attrs={'size':'75', 'maxlength':'70', 'class':'longinput'}))
-    body = forms.CharField(required=False, label=_('Message'), 
+    body = forms.CharField(required=False, label=_('Message'),
                                widget=forms.Textarea(attrs={'rows':'10', 'cols':'75'}))
 
 
         if commit:
             report.save()
         return report
+
+
+class VotePollForm(forms.Form):
+    """
+    Dynamic form for the poll.
+    """
+    FORM_NAME = "VotePollForm" # used in view and template submit button
+
+    choice = forms.MultipleChoiceField()
+    def __init__(self, poll, *args, **kwargs):
+        self.poll = poll
+        super(VotePollForm, self).__init__(*args, **kwargs)
+
+        choices = self.poll.choices.all().values_list("id", "choice")
+        if self.poll.choice_count == 1:
+            self.fields["choice"] = forms.ChoiceField(
+                choices=choices, widget=forms.RadioSelect
+            )
+        else:
+            self.fields["choice"] = forms.MultipleChoiceField(
+                choices=choices, widget=forms.CheckboxSelectMultiple
+            )
+
+    def clean_choice(self):
+        ids = self.cleaned_data["choice"]
+        count = len(ids)
+        if count > self.poll.choice_count:
+            raise forms.ValidationError(
+                _(u'You have selected too many choices! (Only %i allowed.)') % self.poll.choice_count
+            )
+        return ids
+
+
+class PollForm(forms.ModelForm):
+    answers = forms.CharField(min_length=2, widget=forms.Textarea,
+        help_text=_("Write each answer on a new line.")
+    )
+    days = forms.IntegerField(required=False, min_value=1,
+        help_text=_("Number of days for this poll to run. Leave empty for never ending poll.")
+    )
+    class Meta:
+        model = Poll
+        fields = ['question', 'choice_count']
+
+    def create_poll(self):
+        """
+        return True if one field filled with data -> the user wants to create a poll
+        """
+        return any(self.data.get(key) for key in ('question', 'answers', 'days'))
+
+    def clean_answers(self):
+        # validate if there is more than whitespaces ;)
+        raw_answers = self.cleaned_data["answers"]
+        answers = [answer.strip() for answer in raw_answers.splitlines() if answer.strip()]
+        if len(answers) == 0:
+            raise forms.ValidationError(_(u"There is no valid answer!"))
+
+        # validate length of all answers
+        is_max_length = max([len(answer) for answer in answers])
+        should_max_length = PollChoice._meta.get_field("choice").max_length
+        if is_max_length > should_max_length:
+            raise forms.ValidationError(_(u"One of this answers are too long!"))
+
+        return answers
+
+    def save(self, post):
+        """
+        Create poll and all answers in PollChoice model.
+        """
+        poll = super(PollForm, self).save(commit=False)
+        poll.topic = post.topic
+        days = self.cleaned_data["days"]
+        if days:
+            now = datetime.now()
+            poll.deactivate_date = now + timedelta(days=days)
+        poll.save()
+        answers = self.cleaned_data["answers"]
+        for answer in answers:
+            PollChoice.objects.create(poll=poll, choice=answer)
+

File djangobb_forum/locale/en/LC_MESSAGES/django.po

 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-06-07 12:24+0300\n"
+"POT-Creation-Date: 2012-09-25 23:01+0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: feeds.py:24 feeds.py:25 templates/djangobb_forum/base.html:14
+#: admin.py:31
+msgid "subscribers"
+msgstr ""
+
+#: feeds.py:27 feeds.py:28 templates/djangobb_forum/base.html:14
 msgid "Latest posts on forum"
 msgstr ""
 
-#: feeds.py:43 feeds.py:44 templates/djangobb_forum/base.html:15
+#: feeds.py:46 feeds.py:47 templates/djangobb_forum/base.html:15
 msgid "Latest topics on forum"
 msgstr ""
 
-#: feeds.py:72 feeds.py:80
+#: feeds.py:75 feeds.py:83
 #, python-format
 msgid "Latest posts on %s topic"
 msgstr ""
 
-#: feeds.py:97 feeds.py:105
+#: feeds.py:100 feeds.py:108
 #, python-format
 msgid "Latest posts on %s forum"
 msgstr ""
 
-#: feeds.py:122 feeds.py:125
+#: feeds.py:125 feeds.py:128
 #, python-format
 msgid "Latest posts on %s category"
 msgstr ""
 
-#: forms.py:17 forms.py:155 forms.py:279
+#: forms.py:19 forms.py:164 forms.py:288
 #: templates/djangobb_forum/users.html:47
 msgid "Username"
 msgstr ""
 
-#: forms.py:18 templates/djangobb_forum/users.html:50
+#: forms.py:20 templates/djangobb_forum/users.html:50
 msgid "Registered"
 msgstr ""
 
-#: forms.py:19
+#: forms.py:21
 msgid "No. of posts"
 msgstr ""
 
-#: forms.py:23
+#: forms.py:25
 msgid "Post time"
 msgstr ""
 
-#: forms.py:24
+#: forms.py:26
 msgid "Author"
 msgstr ""
 
-#: forms.py:25 forms.py:47 forms.py:129 forms.py:367 models.py:123
-#: templates/djangobb_forum/add_post.html:27
+#: forms.py:27 forms.py:51 forms.py:138 forms.py:381 models.py:127
 #: templates/djangobb_forum/edit_post.html:24
+#: templates/djangobb_forum/includes/post_form.html:35
 msgid "Subject"
 msgstr ""
 
-#: forms.py:26 forms.py:315 models.py:106 models.py:122
+#: forms.py:28 forms.py:324 models.py:110 models.py:126
 #: templates/djangobb_forum/index.html:53
-#: templates/djangobb_forum/search_topics.html:23
+#: templates/djangobb_forum/search_topics.html:32
 msgid "Forum"
 msgstr ""
 
-#: forms.py:30
+#: forms.py:32
 msgid "Ascending"
 msgstr ""
 
-#: forms.py:31
+#: forms.py:33
 msgid "Descending"
 msgstr ""
 
-#: forms.py:35 models.py:138 templates/djangobb_forum/index.html:54
+#: forms.py:37 models.py:142 templates/djangobb_forum/index.html:54
 msgid "Topics"
 msgstr ""
 
-#: forms.py:36 models.py:213 templates/djangobb_forum/index.html:55
+#: forms.py:38 models.py:217 templates/djangobb_forum/index.html:55
 #: templates/djangobb_forum/users.html:49
 msgid "Posts"
 msgstr ""
 
-#: forms.py:40
+#: forms.py:42
 msgid "Message text and topic subject"
 msgstr ""
 
-#: forms.py:41
+#: forms.py:43
 msgid "Message text only"
 msgstr ""
 
-#: forms.py:42
+#: forms.py:44
 msgid "Topic subject only"
 msgstr ""
 
-#: forms.py:49 templates/djangobb_forum/add_post.html:36
-#: templates/djangobb_forum/topic.html:173
+#: forms.py:53 templates/djangobb_forum/includes/post_form.html:48
 msgid "Attachment"
 msgstr ""
 
-#: forms.py:76
+#: forms.py:54 templates/djangobb_forum/topic.html:180
+msgid "Subscribe"
+msgstr ""
+
+#: forms.py:54
+msgid "Subscribe this topic."
+msgstr ""
+
+#: forms.py:81
 msgid "Can't be empty nor contain only whitespace characters"
 msgstr ""
 
-#: forms.py:94
+#: forms.py:99
 msgid "Attachment is too big"
 msgstr ""
 
-#: forms.py:156 templates/djangobb_forum/topic.html:73
+#: forms.py:165 templates/djangobb_forum/topic.html:101
 msgid "E-mail"
 msgstr ""
 
-#: forms.py:187
+#: forms.py:196
 msgid "Real name"
 msgstr ""
 
-#: forms.py:281 forms.py:317
+#: forms.py:290 forms.py:326
 msgid "Sort by"
 msgstr ""
 
-#: forms.py:282 forms.py:318
+#: forms.py:291 forms.py:327
 msgid "Sort order"
 msgstr ""
 
-#: forms.py:311
+#: forms.py:320
 msgid "Keyword search"
 msgstr ""
 
-#: forms.py:313
+#: forms.py:322
 msgid "Author search"
 msgstr ""
 
-#: forms.py:316
+#: forms.py:325
 msgid "Search in"
 msgstr ""
 
-#: forms.py:319
+#: forms.py:328
 msgid "Show results as"
 msgstr ""
 
-#: forms.py:344
+#: forms.py:353
 #, python-format
 msgid "User with login %s does not exist"
 msgstr ""
 
-#: forms.py:354
+#: forms.py:363
 msgid "You already voted for this post"
 msgstr ""
 
-#: forms.py:369 models.py:204 templates/djangobb_forum/add_post.html:29
-#: templates/djangobb_forum/edit_post.html:27
+#: forms.py:367
+msgid "This post does't belong to this user"
+msgstr ""
+
+#: forms.py:383 models.py:208 templates/djangobb_forum/edit_post.html:27
+#: templates/djangobb_forum/includes/post_form.html:37
 msgid "Message"
 msgstr ""
 
-#: models.py:39
+#: forms.py:436
+#, python-format
+msgid "You have selected too many choices! (Only %i allowed.)"
+msgstr ""
+
+#: forms.py:443
+msgid "Write each answer on a new line."
+msgstr ""
+
+#: forms.py:446
+msgid "Number of days for this poll to run. Leave empty for never ending poll."
+msgstr ""
+
+#: forms.py:463
+msgid "There is no valid answer!"
+msgstr ""
+
+#: forms.py:469
+msgid "One of this answers are too long!"
+msgstr ""
+
+#: models.py:41
 msgid "Display your e-mail address."
 msgstr ""
 
-#: models.py:40
+#: models.py:42
 msgid "Hide your e-mail address but allow form e-mail."
 msgstr ""
 
-#: models.py:41
+#: models.py:43
 msgid "Hide your e-mail address and disallow form e-mail."
 msgstr ""
 
-#: models.py:60 models.py:95 models.py:391
+#: models.py:62 models.py:99 models.py:396
 msgid "Name"
 msgstr ""
 
-#: models.py:61
+#: models.py:63
 msgid "Groups"
 msgstr ""
 
-#: models.py:61
+#: models.py:63
 msgid "Only users from these groups can see this category"
 msgstr ""
 
-#: models.py:62 models.py:96
+#: models.py:64 models.py:100
 msgid "Position"
 msgstr ""
 
-#: models.py:66 models.py:94
+#: models.py:68 models.py:98
 msgid "Category"
 msgstr ""
 
-#: models.py:67
+#: models.py:69
 msgid "Categories"
 msgstr ""
 
-#: models.py:97
+#: models.py:101
 msgid "Description"
 msgstr ""
 
-#: models.py:98
+#: models.py:102
 msgid "Moderators"
 msgstr ""
 
-#: models.py:99 models.py:125 models.py:201
+#: models.py:103 models.py:129 models.py:205
 msgid "Updated"
 msgstr ""
 
-#: models.py:100 models.py:131 models.py:314
+#: models.py:104 models.py:135 models.py:319
 msgid "Post count"
 msgstr ""
 
-#: models.py:101
+#: models.py:105
 msgid "Topic count"
 msgstr ""
 
-#: models.py:107
+#: models.py:111
 msgid "Forums"
 msgstr ""
 
-#: models.py:124 models.py:200 models.py:352
+#: models.py:128 models.py:204 models.py:357
 msgid "Created"
 msgstr ""
 
-#: models.py:126 models.py:199 models.py:294
+#: models.py:130 models.py:203 models.py:298
 msgid "User"
 msgstr ""
 
-#: models.py:127
+#: models.py:131
 msgid "Views count"
 msgstr ""
 
-#: models.py:128
+#: models.py:132
 msgid "Sticky"
 msgstr ""
 
-#: models.py:129
+#: models.py:133
 msgid "Closed"
 msgstr ""
 
-#: models.py:130
+#: models.py:134
 msgid "Subscribers"
 msgstr ""
 
-#: models.py:137 models.py:198 templates/djangobb_forum/forum.html:29
+#: models.py:141 models.py:202 templates/djangobb_forum/forum.html:29
 #: templates/djangobb_forum/moderate.html:25
-#: templates/djangobb_forum/search_topics.html:22
+#: templates/djangobb_forum/search_topics.html:31
 msgid "Topic"
 msgstr ""
 
-#: models.py:202
+#: models.py:206
 msgid "Updated by"
 msgstr ""
 
-#: models.py:203 templates/djangobb_forum/profile/profile_display.html:25
+#: models.py:207 templates/djangobb_forum/profile/profile_display.html:25
 msgid "Markup"
 msgstr ""
 
-#: models.py:205
+#: models.py:209
 msgid "HTML version"
 msgstr ""
 
-#: models.py:206
+#: models.py:210
 msgid "User IP"
 msgstr ""
 
-#: models.py:212 models.py:267 models.py:349 models.py:387
+#: models.py:216 models.py:271 models.py:354 models.py:392
 msgid "Post"
 msgstr ""
 
-#: models.py:265
+#: models.py:269
 msgid "From"
 msgstr ""
 
-#: models.py:266
+#: models.py:270
 msgid "To"
 msgstr ""
 
-#: models.py:268
+#: models.py:272
 msgid "Time"
 msgstr ""
 
-#: models.py:269
+#: models.py:273
 msgid "Sign"
 msgstr ""
 
-#: models.py:270 models.py:353 models.py:366
+#: models.py:274 models.py:358 models.py:371
 #: templates/djangobb_forum/report.html:16
 #: templates/djangobb_forum/reputation.html:24
 msgid "Reason"
 msgstr ""
 
-#: models.py:273 templates/djangobb_forum/topic.html:63
+#: models.py:277 templates/djangobb_forum/topic.html:91
 msgid "Reputation"
 msgstr ""
 
-#: models.py:274
+#: models.py:278
 msgid "Reputations"
 msgstr ""
 
-#: models.py:295
+#: models.py:299
 msgid "Status"
 msgstr ""
 
-#: models.py:296
+#: models.py:300
 msgid "Site"
 msgstr ""
 
-#: models.py:297
+#: models.py:301
 msgid "Jabber"
 msgstr ""
 
-#: models.py:298
+#: models.py:302
 msgid "ICQ"
 msgstr ""
 
-#: models.py:299
+#: models.py:303
 msgid "MSN"
 msgstr ""
 
-#: models.py:300
+#: models.py:304
 msgid "AIM"
 msgstr ""
 
-#: models.py:301
+#: models.py:305
 msgid "Yahoo"
 msgstr ""
 
-#: models.py:302 templates/djangobb_forum/user.html:25
+#: models.py:306 templates/djangobb_forum/user.html:25
 msgid "Location"
 msgstr ""
 
-#: models.py:303 models.py:304
+#: models.py:307 models.py:308
 msgid "Signature"
 msgstr ""
 
-#: models.py:305
+#: models.py:309
 msgid "Time zone"
 msgstr ""
 
-#: models.py:306
+#: models.py:310
 msgid "Language"
 msgstr ""
 
-#: models.py:307
+#: models.py:311
 msgid "Avatar"
 msgstr ""
 
-#: models.py:308
+#: models.py:312
 msgid "Theme"
 msgstr ""
 
-#: models.py:309
+#: models.py:313
 msgid "Show avatar"
 msgstr ""
 
-#: models.py:310
+#: models.py:314
 msgid "Show signatures"
 msgstr ""
 
-#: models.py:311 templates/djangobb_forum/profile/profile_display.html:40
+#: models.py:315 templates/djangobb_forum/profile/profile_display.html:40
 msgid "Show smilies"
 msgstr ""
 
-#: models.py:312
+#: models.py:316
 msgid "Privacy permission"
 msgstr ""
 
-#: models.py:313
+#: models.py:317
+msgid "Auto subscribe"
+msgstr ""
+
+#: models.py:317
+msgid "Auto subscribe all topics you have created or reply."
+msgstr ""
+
+#: models.py:318
 msgid "Default markup"
 msgstr ""
 
-#: models.py:319 templates/djangobb_forum/header.html:22
-#: templates/djangobb_forum/topic.html:71 templates/djangobb_forum/user.html:7
+#: models.py:324 templates/djangobb_forum/header.html:22
+#: templates/djangobb_forum/topic.html:99 templates/djangobb_forum/user.html:7
 msgid "Profile"
 msgstr ""
 
-#: models.py:320
+#: models.py:325
 msgid "Profiles"
 msgstr ""
 
-#: models.py:340 models.py:341
+#: models.py:345 models.py:346
 msgid "Post tracking"
 msgstr ""
 
-#: models.py:348
+#: models.py:353
 msgid "Reported by"
 msgstr ""
 
-#: models.py:350
+#: models.py:355
 msgid "Zapped"
 msgstr ""
 
-#: models.py:351
+#: models.py:356
 msgid "Zapped by"
 msgstr ""
 
-#: models.py:356 templates/djangobb_forum/topic.html:120
+#: models.py:361 templates/djangobb_forum/topic.html:148
 msgid "Report"
 msgstr ""
 
-#: models.py:357
+#: models.py:362
 msgid "Reports"
 msgstr ""
 
-#: models.py:363
+#: models.py:368
 msgid "Banned user"
 msgstr ""
 
-#: models.py:364
+#: models.py:369
 msgid "Ban start"
 msgstr ""
 
-#: models.py:365
+#: models.py:370
 msgid "Ban end"
 msgstr ""
 
-#: models.py:369
+#: models.py:374
 msgid "Ban"
 msgstr ""
 
-#: models.py:370
+#: models.py:375
 msgid "Bans"
 msgstr ""
 
-#: models.py:388
+#: models.py:393
 msgid "Size"
 msgstr ""
 
-#: models.py:389
+#: models.py:394
 msgid "Content type"
 msgstr ""
 
-#: models.py:390
+#: models.py:395
 msgid "Path"
 msgstr ""
 
-#: models.py:392
+#: models.py:397
 msgid "Hash"
 msgstr ""
 
-#: templates/djangobb_forum/add_post.html:9
-#: templates/djangobb_forum/add_post.html:11
+#: models.py:424
+msgid "How many choices are allowed simultaneously."
+msgstr ""
+
+#: models.py:427
+msgid "Can users vote to this poll or just see the result?"
+msgstr ""
+
+#: models.py:430
+msgid "Point of time after this poll would be automatic deactivated"
+msgstr ""
+
+#: models.py:433
+msgid "Users who has voted this poll."
+msgstr ""
+
+#: views.py:92
+msgid "Topics deleted"
+msgstr ""
+
+#: views.py:97
+msgid "Topics opened"
+msgstr ""
+
+#: views.py:102
+msgid "Topics closed"
+msgstr ""
+
+#: views.py:266
+#, python-format
+msgid "Found %i posts."
+msgstr ""
+
+#: views.py:270
+#, python-format
+msgid "Found %i topics."
+msgstr ""
+
+#: views.py:284
+msgid "All topics marked as read."
+msgstr ""
+
+#: views.py:294
+msgid "Post reported."
+msgstr ""
+
+#: views.py:308
+msgid "Email send."
+msgstr ""
+
+#: views.py:310
+msgid "Email could not be sent."
+msgstr ""
+
+#: views.py:385
+msgid "Your reply saved."
+msgstr ""
+
+#: views.py:412
+msgid "This poll is not active!"
+msgstr ""
+
+#: views.py:415
+msgid "You have already vote to this poll in the past!"
+msgstr ""
+
+#: views.py:424
+msgid "Your votes are saved."
+msgstr ""
+
+#: views.py:484
+msgid "Topic with poll saved."
+msgstr ""
+
+#: views.py:486
+msgid "Topic saved."
+msgstr ""
+
+#: views.py:516
+msgid "Your avatar uploaded."
+msgstr ""
+
+#: views.py:525 views.py:550
+msgid "Please sign in."
+msgstr ""
+
+#: views.py:540
+msgid "User profile saved."
+msgstr ""
+
+#: views.py:584
+msgid "Reputation deleted."
+msgstr ""
+
+#: views.py:590
+msgid "Reputation saved."
+msgstr ""
+
+#: views.py:617
+msgid "No permissions to edit this post."
+msgstr ""
+
+#: views.py:624
+msgid "Post updated."
+msgstr ""
+
+#: views.py:646 views.py:746
+msgid "Post deleted."
+msgstr ""
+
+#: views.py:707
+msgid "Topic moved."
+msgstr ""
+
+#: views.py:723
+msgid "Topic marked as sticky."
+msgstr ""
+
+#: views.py:725
+msgid "Sticky flag removed from topic."
+msgstr ""
+
+#: views.py:742
+msgid "You haven't the permission to delete this post."
+msgstr ""
+
+#: views.py:764
+msgid "Topic closed."
+msgstr ""
+
+#: views.py:767
+msgid "Topic opened."
+msgstr ""
+
+#: views.py:786
+msgid "Topic subscription removed."
+msgstr ""
+
+#: views.py:798
+msgid "Topic subscribed."
+msgstr ""
+
+#: templates/djangobb_forum/add_topic.html:9
+#: templates/djangobb_forum/add_topic.html:11
 #: templates/djangobb_forum/delete_posts.html:11
 #: templates/djangobb_forum/edit_post.html:8
 #: templates/djangobb_forum/forum.html:15
 #: templates/djangobb_forum/forum.html:73
 #: templates/djangobb_forum/moderate.html:11
-#: templates/djangobb_forum/topic.html:17
-#: templates/djangobb_forum/topic.html:143
+#: templates/djangobb_forum/topic.html:14
+#: templates/djangobb_forum/topic.html:170
 #: templates/djangobb_forum/lofi/forum.html:9
 #: templates/djangobb_forum/lofi/index.html:6
 #: templates/djangobb_forum/lofi/index.html:8
 msgid "Root"
 msgstr ""
 
-#: templates/djangobb_forum/add_post.html:18
-#: templates/djangobb_forum/forum.html:13
-#: templates/djangobb_forum/forum.html:71
-msgid "New topic"
+#: templates/djangobb_forum/base.html:62
+#: templates/djangobb_forum/header.html:58
+msgid "Notice"
 msgstr ""
 
-#: templates/djangobb_forum/add_post.html:18
-msgid "New reply"
-msgstr ""
-
-#: templates/djangobb_forum/add_post.html:24
-#: templates/djangobb_forum/topic.html:164
-msgid "Write your message and submit"
-msgstr ""
-
-#: templates/djangobb_forum/add_post.html:47
-#: templates/djangobb_forum/mail_to.html:23
-#: templates/djangobb_forum/report.html:22
-#: templates/djangobb_forum/reputation_form.html:41
-#: templates/djangobb_forum/search_form.html:70
-#: templates/djangobb_forum/topic.html:182
-#: templates/djangobb_forum/profile/profile_display.html:45
-#: templates/djangobb_forum/profile/profile_essentials.html:81
-#: templates/djangobb_forum/profile/profile_messaging.html:30
-#: templates/djangobb_forum/profile/profile_personal.html:30
-#: templates/djangobb_forum/profile/profile_personality.html:49
-#: templates/djangobb_forum/profile/profile_privacy.html:25
-msgid "Submit"
-msgstr ""
-
-#: templates/djangobb_forum/add_post.html:47
-#: templates/djangobb_forum/edit_post.html:34
-#: templates/djangobb_forum/mail_to.html:23
-#: templates/djangobb_forum/move_topic.html:34
-#: templates/djangobb_forum/report.html:22
-#: templates/djangobb_forum/reputation.html:65
-#: templates/djangobb_forum/reputation_form.html:41
-#: templates/djangobb_forum/search_posts.html:46
-#: templates/djangobb_forum/search_topics.html:60
-#: templates/djangobb_forum/upload_avatar.html:23
-msgid "Go back"
-msgstr ""
-
-#: templates/djangobb_forum/add_post.html:55
-msgid "Topic review (newest first)"
-msgstr ""
-
-#: templates/djangobb_forum/add_post.html:71
-#: templates/djangobb_forum/topic.html:131
-msgid "Quote"
-msgstr ""
-
-#: templates/djangobb_forum/base.html:52
+#: templates/djangobb_forum/base.html:78
 msgid "Board footer"
 msgstr ""
 
+#: templates/djangobb_forum/base.html:83
+#: templates/djangobb_forum/search_posts.html:55
+msgid "Search links"
+msgstr ""
+
+#: templates/djangobb_forum/base.html:84
+#: templates/djangobb_forum/search_posts.html:56
+msgid "Show recent posts"
+msgstr ""
+
+#: templates/djangobb_forum/base.html:85
+#: templates/djangobb_forum/search_posts.html:57
+msgid "Show unanswered posts"
+msgstr ""
+
+#: templates/djangobb_forum/base.html:87
+#: templates/djangobb_forum/search_posts.html:59
+msgid "Show your subscribed topics"
+msgstr ""
+
+#: templates/djangobb_forum/base.html:88
+msgid "Show your"
+msgstr ""
+
+#: templates/djangobb_forum/base.html:88
+msgid "topics"
+msgstr ""
+
+#: templates/djangobb_forum/base.html:88
+#: templates/djangobb_forum/lofi/index.html:18
+msgid "posts"
+msgstr ""
+
 #: templates/djangobb_forum/delete_posts.html:37
-#: templates/djangobb_forum/topic.html:99
+#: templates/djangobb_forum/topic.html:127
 msgid "Edited"
 msgstr ""
 
 #: templates/djangobb_forum/delete_posts.html:53
 #: templates/djangobb_forum/moderate.html:70
 #: templates/djangobb_forum/reputation.html:28
-#: templates/djangobb_forum/topic.html:123
+#: templates/djangobb_forum/topic.html:151
 msgid "Delete"
 msgstr ""
 
 msgid "Save"
 msgstr ""
 
+#: templates/djangobb_forum/edit_post.html:34
+#: templates/djangobb_forum/mail_to.html:23
+#: templates/djangobb_forum/move_topic.html:34
+#: templates/djangobb_forum/report.html:22
+#: templates/djangobb_forum/reputation.html:65
+#: templates/djangobb_forum/reputation_form.html:41
+#: templates/djangobb_forum/search_posts.html:38
+#: templates/djangobb_forum/upload_avatar.html:23
+#: templates/djangobb_forum/includes/post_form.html:58
+msgid "Go back"
+msgstr ""
+
+#: templates/djangobb_forum/forum.html:13
+#: templates/djangobb_forum/forum.html:71
+#: templates/djangobb_forum/includes/post_form.html:3
+msgid "New topic"
+msgstr ""
+
 #: templates/djangobb_forum/forum.html:30
 #: templates/djangobb_forum/moderate.html:26
-#: templates/djangobb_forum/search_topics.html:24
+#: templates/djangobb_forum/search_topics.html:33
 msgid "Replies"
 msgstr ""
 
 #: templates/djangobb_forum/forum.html:32
 #: templates/djangobb_forum/index.html:56
 #: templates/djangobb_forum/moderate.html:28
-#: templates/djangobb_forum/search_topics.html:25
+#: templates/djangobb_forum/search_topics.html:34
 msgid "Last post"
 msgstr ""
 
 #: templates/djangobb_forum/moderate.html:44
 #: templates/djangobb_forum/moderate.html:46
 #: templates/djangobb_forum/moderate.html:53
-#: templates/djangobb_forum/search_topics.html:36
-#: templates/djangobb_forum/search_topics.html:38
 #: templates/djangobb_forum/search_topics.html:45
+#: templates/djangobb_forum/search_topics.html:47
+#: templates/djangobb_forum/search_topics.html:54
 msgid "by"
 msgstr ""
 
 msgstr ""
 
 #: templates/djangobb_forum/forum.html:92
-#: templates/djangobb_forum/topic.html:203
+#: templates/djangobb_forum/topic.html:209
 msgid "Go"
 msgstr ""
 
 msgstr ""
 
 #: templates/djangobb_forum/header.html:24
-#: templates/djangobb_forum/topic.html:81
+#: templates/djangobb_forum/topic.html:109
 msgid "PM"
 msgstr ""
 
 msgid "Mark all topics as read"
 msgstr ""
 
-#: templates/djangobb_forum/header.html:58
-msgid "Notice"
-msgstr ""
-
 #: templates/djangobb_forum/index.html:71
 msgid "Board information"
 msgstr ""
 msgid "Online:"
 msgstr ""
 
-#: templates/djangobb_forum/index.html:101
-#: templates/djangobb_forum/search_posts.html:63
-#: templates/djangobb_forum/search_topics.html:75
-msgid "Search links"
-msgstr ""
-
-#: templates/djangobb_forum/index.html:102
-#: templates/djangobb_forum/search_posts.html:64
-#: templates/djangobb_forum/search_topics.html:76
-msgid "Show recent posts"
-msgstr ""
-
-#: templates/djangobb_forum/index.html:103
-#: templates/djangobb_forum/search_posts.html:65
-#: templates/djangobb_forum/search_topics.html:77
-msgid "Show unanswered posts"
-msgstr ""
-
-#: templates/djangobb_forum/index.html:105
-#: templates/djangobb_forum/search_posts.html:67
-#: templates/djangobb_forum/search_topics.html:79
-msgid "Show your subscribed topics"
-msgstr ""
-
-#: templates/djangobb_forum/index.html:106
-#: templates/djangobb_forum/search_posts.html:68
-#: templates/djangobb_forum/search_topics.html:80
-msgid "Show your posts"
-msgstr ""
-
 #: templates/djangobb_forum/mail_to.html:7
 msgid "Send e-mail to"
 msgstr ""
 "to the recipient."
 msgstr ""
 
+#: templates/djangobb_forum/mail_to.html:23
+#: templates/djangobb_forum/report.html:22
+#: templates/djangobb_forum/reputation_form.html:41
+#: templates/djangobb_forum/search_form.html:70
+#: templates/djangobb_forum/includes/post_form.html:58
+#: templates/djangobb_forum/profile/profile_display.html:45
+#: templates/djangobb_forum/profile/profile_essentials.html:89
+#: templates/djangobb_forum/profile/profile_messaging.html:30
+#: templates/djangobb_forum/profile/profile_personal.html:30
+#: templates/djangobb_forum/profile/profile_personality.html:49
+#: templates/djangobb_forum/profile/profile_privacy.html:25
+msgid "Submit"
+msgstr ""
+
 #: templates/djangobb_forum/moderate.html:69
 #: templates/djangobb_forum/move_topic.html:34
 msgid "Move"
 msgstr ""
 
 #: templates/djangobb_forum/move_topic.html:7
-#: templates/djangobb_forum/topic.html:209
+#: templates/djangobb_forum/topic.html:215
 msgid "Move topic"
 msgstr ""
 
 msgid "You can choose how you wish to sort and show your results."
 msgstr ""
 
-#: templates/djangobb_forum/search_posts.html:25
-msgid "Replies:"
+#: templates/djangobb_forum/search_posts.html:16
+#: templates/djangobb_forum/search_topics.html:16
+msgid "Search type"
 msgstr ""
 
-#: templates/djangobb_forum/search_posts.html:27
-msgid "Go to post"
+#: templates/djangobb_forum/search_posts.html:19
+msgid "Show results as topic list."
 msgstr ""
 
-#: templates/djangobb_forum/search_posts.html:42
-#: templates/djangobb_forum/search_topics.html:56
+#: templates/djangobb_forum/search_posts.html:34
 msgid "Info"
 msgstr ""
 
-#: templates/djangobb_forum/search_posts.html:45
-#: templates/djangobb_forum/search_topics.html:59
+#: templates/djangobb_forum/search_posts.html:37
+#: templates/djangobb_forum/search_topics.html:58
 msgid "Your search returned no hits."
 msgstr ""
 
-#: templates/djangobb_forum/search_topics.html:16
+#: templates/djangobb_forum/search_posts.html:60
+msgid "Show your topics"
+msgstr ""
+
+#: templates/djangobb_forum/search_topics.html:19
+msgid "Show results as post list."
+msgstr ""
+
+#: templates/djangobb_forum/search_topics.html:25
 msgid "Search results"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:13
-#: templates/djangobb_forum/topic.html:129
-#: templates/djangobb_forum/topic.html:142
-msgid "Reply"
+#: templates/djangobb_forum/topic.html:24
+msgid "Poll"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:55
+#: templates/djangobb_forum/topic.html:32
+#, python-format
+msgid "(%(count)s answers allows.)"
+msgstr ""
+
+#: templates/djangobb_forum/topic.html:35
+msgid "Vote"
+msgstr ""
+
+#: templates/djangobb_forum/topic.html:83
 msgid "From:"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:57
+#: templates/djangobb_forum/topic.html:85
 #: templates/djangobb_forum/user.html:127
-#: templates/djangobb_forum/profile/profile_essentials.html:73
+#: templates/djangobb_forum/profile/profile_essentials.html:81
 msgid "Registered:"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:58
+#: templates/djangobb_forum/topic.html:86
 #: templates/djangobb_forum/user.html:119
-#: templates/djangobb_forum/profile/profile_essentials.html:75
+#: templates/djangobb_forum/profile/profile_essentials.html:83
 msgid "Posts:"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:60
+#: templates/djangobb_forum/topic.html:88
 msgid "IP:"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:76
+#: templates/djangobb_forum/topic.html:104
 #: templates/djangobb_forum/user.html:42
-#: templates/djangobb_forum/profile/profile_essentials.html:43
+#: templates/djangobb_forum/profile/profile_essentials.html:42
 msgid "Send e-mail"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:104
+#: templates/djangobb_forum/topic.html:132
 msgid "Attachments:"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:113
+#: templates/djangobb_forum/topic.html:141
 msgid "Online"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:115
+#: templates/djangobb_forum/topic.html:143
 msgid "Offline"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:123
+#: templates/djangobb_forum/topic.html:151
 msgid "Are you sure you want to delete this post?"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:127
+#: templates/djangobb_forum/topic.html:155
 msgid "Edit"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:148
+#: templates/djangobb_forum/topic.html:158
+msgid "Full quote or quote selected text form this post."
+msgstr ""
+
+#: templates/djangobb_forum/topic.html:158
+msgid "Quote"
+msgstr ""
+
+#: templates/djangobb_forum/topic.html:178
 msgid "Unsubscribe"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:150
-msgid "Subscribe"
-msgstr ""
-
-#: templates/djangobb_forum/topic.html:158
-msgid "Quick post"
-msgstr ""
-
-#: templates/djangobb_forum/topic.html:192
+#: templates/djangobb_forum/topic.html:198
 msgid "Jump to "
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:206
+#: templates/djangobb_forum/topic.html:212
 msgid "Moderator control"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:208
+#: templates/djangobb_forum/topic.html:214
 msgid "Delete multiple posts"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:211
+#: templates/djangobb_forum/topic.html:217
 msgid "Open topic"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:213
+#: templates/djangobb_forum/topic.html:219
 msgid "Close topic"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:216
+#: templates/djangobb_forum/topic.html:222
 msgid "Unstick topic"
 msgstr ""
 
-#: templates/djangobb_forum/topic.html:218
+#: templates/djangobb_forum/topic.html:224
 msgid "Stick topic"
 msgstr ""
 
 msgstr ""
 
 #: templates/djangobb_forum/user.html:116
-#: templates/djangobb_forum/profile/profile_essentials.html:71
+#: templates/djangobb_forum/profile/profile_essentials.html:79
 msgid "User activity"
 msgstr ""
 
 #: templates/djangobb_forum/user.html:120
-#: templates/djangobb_forum/profile/profile_essentials.html:76
+#: templates/djangobb_forum/profile/profile_essentials.html:84
 msgid "Show all posts"
 msgstr ""
 
 #: templates/djangobb_forum/user.html:121
-#: templates/djangobb_forum/profile/profile_essentials.html:74
+#: templates/djangobb_forum/profile/profile_essentials.html:82
 msgid "Last post:"
 msgstr ""
 
 "descending order."
 msgstr ""
 
+#: templates/djangobb_forum/include/post_in_search_page.html:12
+msgid "Replies:"
+msgstr ""
+
+#: templates/djangobb_forum/include/post_in_search_page.html:14
+msgid "Go to post"
+msgstr ""
+
+#: templates/djangobb_forum/includes/post_form.html:3
+msgid "New reply"
+msgstr ""
+
+#: templates/djangobb_forum/includes/post_form.html:19
+msgid "Create a poll"
+msgstr ""
+
+#: templates/djangobb_forum/includes/post_form.html:31
+msgid "Write your message and submit"
+msgstr ""
+
+#: templates/djangobb_forum/includes/post_form.html:41
+msgid "Subscribe this topic"
+msgstr ""
+
 #: templates/djangobb_forum/lofi/forum.html:7
 #: templates/djangobb_forum/lofi/index.html:6
 #: templates/djangobb_forum/lofi/topic.html:7
 msgid "replies"
 msgstr ""
 
-#: templates/djangobb_forum/lofi/index.html:18
-msgid "posts"
-msgstr ""
-
 #: templates/djangobb_forum/profile/profile_admin.html:16
 msgid "Delete (administrators only) or ban user"
 msgstr ""
 msgstr ""
 
 #: templates/djangobb_forum/profile/profile_display.html:45
-#: templates/djangobb_forum/profile/profile_essentials.html:81
+#: templates/djangobb_forum/profile/profile_essentials.html:89
 #: templates/djangobb_forum/profile/profile_messaging.html:30
 #: templates/djangobb_forum/profile/profile_personal.html:30
 #: templates/djangobb_forum/profile/profile_personality.html:49
 msgid "Change password"
 msgstr ""
 
-#: templates/djangobb_forum/profile/profile_essentials.html:37
+#: templates/djangobb_forum/profile/profile_essentials.html:36
 msgid "Enter a valid e-mail address"
 msgstr ""
 
-#: templates/djangobb_forum/profile/profile_essentials.html:51
+#: templates/djangobb_forum/profile/profile_essentials.html:59
 msgid "Set your localisation options"
 msgstr ""
 
-#: templates/djangobb_forum/profile/profile_essentials.html:55
+#: templates/djangobb_forum/profile/profile_essentials.html:63
 msgid ""
 "Timezone: For the forum to display times correctly you must select your "
 "local timezone."
 msgstr ""
 
-#: templates/djangobb_forum/profile/profile_essentials.html:61
+#: templates/djangobb_forum/profile/profile_essentials.html:69
 msgid ""
 "Language: You can choose which language you wish to use to view the forum"
 msgstr ""

File djangobb_forum/migrations/0004_auto__add_field_profile_auto_subscribe.py

+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding field 'Profile.auto_subscribe'
+        db.add_column('djangobb_forum_profile', 'auto_subscribe',
+                      self.gf('django.db.models.fields.BooleanField')(default=False),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Deleting field 'Profile.auto_subscribe'
+        db.delete_column('djangobb_forum_profile', 'auto_subscribe')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'djangobb_forum.attachment': {
+            'Meta': {'object_name': 'Attachment'},
+            'content_type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hash': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'db_index': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.TextField', [], {}),
+            'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'post': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'attachments'", 'to': "orm['djangobb_forum.Post']"}),
+            'size': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'djangobb_forum.ban': {
+            'Meta': {'object_name': 'Ban'},
+            'ban_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'ban_start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'reason': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'ban_users'", 'unique': 'True', 'to': "orm['auth.User']"})
+        },
+        'djangobb_forum.category': {
+            'Meta': {'ordering': "['position']", 'object_name': 'Category'},
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+            'position': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'})
+        },
+        'djangobb_forum.forum': {
+            'Meta': {'ordering': "['position']", 'object_name': 'Forum'},
+            'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'forums'", 'to': "orm['djangobb_forum.Category']"}),
+            'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_post': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_forum_post'", 'null': 'True', 'to': "orm['djangobb_forum.Post']"}),
+            'moderators': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+            'position': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'post_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'topic_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+        },
+        'djangobb_forum.post': {
+            'Meta': {'ordering': "['created']", 'object_name': 'Post'},
+            'body': ('django.db.models.fields.TextField', [], {}),
+            'body_html': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'markup': ('django.db.models.fields.CharField', [], {'default': "'bbcode'", 'max_length': '15'}),
+            'topic': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'posts'", 'to': "orm['djangobb_forum.Topic']"}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'updated_by': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'posts'", 'to': "orm['auth.User']"}),
+            'user_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'})
+        },
+        'djangobb_forum.posttracking': {
+            'Meta': {'object_name': 'PostTracking'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_read': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
+            'topics': ('djangobb_forum.fields.JSONField', [], {'null': 'True'}),
+            'user': ('djangobb_forum.fields.AutoOneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
+        },
+        'djangobb_forum.profile': {
+            'Meta': {'object_name': 'Profile'},
+            'aim': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+            'auto_subscribe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'avatar': ('djangobb_forum.fields.ExtendedImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}),
+            'icq': ('django.db.models.fields.CharField', [], {'max_length': '12', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'jabber': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+            'language': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '5'}),
+            'location': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'markup': ('django.db.models.fields.CharField', [], {'default': "'bbcode'", 'max_length': '15'}),
+            'msn': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+            'post_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'privacy_permission': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+            'show_avatar': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'show_signatures': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'show_smilies': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'signature': ('django.db.models.fields.TextField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}),
+            'signature_html': ('django.db.models.fields.TextField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}),
+            'site': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+            'status': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'theme': ('django.db.models.fields.CharField', [], {'default': "'default'", 'max_length': '80'}),
+            'time_zone': ('django.db.models.fields.FloatField', [], {'default': '3.0'}),
+            'user': ('djangobb_forum.fields.AutoOneToOneField', [], {'related_name': "'forum_profile'", 'unique': 'True', 'to': "orm['auth.User']"}),
+            'yahoo': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'})
+        },
+        'djangobb_forum.report': {
+            'Meta': {'object_name': 'Report'},
+            'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'post': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['djangobb_forum.Post']"}),
+            'reason': ('django.db.models.fields.TextField', [], {'default': "''", 'max_length': "'1000'", 'blank': 'True'}),
+            'reported_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reported_by'", 'to': "orm['auth.User']"}),
+            'zapped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'zapped_by': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'zapped_by'", 'null': 'True', 'to': "orm['auth.User']"})
+        },
+        'djangobb_forum.reputation': {
+            'Meta': {'unique_together': "(('from_user', 'post'),)", 'object_name': 'Reputation'},
+            'from_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reputations_from'", 'to': "orm['auth.User']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'post': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'post'", 'to': "orm['djangobb_forum.Post']"}),
+            'reason': ('django.db.models.fields.TextField', [], {'max_length': '1000'}),
+            'sign': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'time': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reputations_to'", 'to': "orm['auth.User']"})
+        },
+        'djangobb_forum.topic': {
+            'Meta': {'ordering': "['-updated']", 'object_name': 'Topic'},
+            'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'topics'", 'to': "orm['djangobb_forum.Forum']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_post': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_topic_post'", 'null': 'True', 'to': "orm['djangobb_forum.Post']"}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'post_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+            'sticky': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'subscribers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'subscriptions'", 'blank': 'True', 'to': "orm['auth.User']"}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+            'views': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['djangobb_forum']

File djangobb_forum/migrations/0005_auto__add_pollchoice__add_poll.py

+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'PollChoice'
+        db.create_table('djangobb_forum_pollchoice', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('poll', self.gf('django.db.models.fields.related.ForeignKey')(related_name='choices', to=orm['djangobb_forum.Poll'])),
+            ('choice', self.gf('django.db.models.fields.CharField')(max_length=200)),
+            ('votes', self.gf('django.db.models.fields.IntegerField')(default=0)),
+        ))