diff --git a/boards/admin.py b/boards/admin.py
--- a/boards/admin.py
+++ b/boards/admin.py
@@ -1,6 +1,7 @@
from django.contrib import admin
-from boards.models import Post, Tag, Admin
+from boards.models import Post, Tag, Admin, Ban
admin.site.register(Post)
admin.site.register(Tag)
admin.site.register(Admin)
+admin.site.register(Ban)
\ No newline at end of file
diff --git a/boards/migrations/0002_auto__add_ban__chg_field_post_poster_ip.py b/boards/migrations/0002_auto__add_ban__chg_field_post_poster_ip.py
new file mode 100644
--- /dev/null
+++ b/boards/migrations/0002_auto__add_ban__chg_field_post_poster_ip.py
@@ -0,0 +1,64 @@
+# -*- 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 'Ban'
+ db.create_table(u'boards_ban', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('ip', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39)),
+ ))
+ db.send_create_signal(u'boards', ['Ban'])
+
+
+ # Changing field 'Post.poster_ip'
+ db.alter_column(u'boards_post', 'poster_ip', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39))
+
+ def backwards(self, orm):
+ # Deleting model 'Ban'
+ db.delete_table(u'boards_ban')
+
+
+ # Changing field 'Post.poster_ip'
+ db.alter_column(u'boards_post', 'poster_ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15))
+
+ models = {
+ u'boards.admin': {
+ 'Meta': {'object_name': 'Admin'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ u'boards.ban': {
+ 'Meta': {'object_name': 'Ban'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'})
+ },
+ u'boards.post': {
+ 'Meta': {'object_name': 'Post'},
+ '_text_rendered': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('boards.thumbs.ImageWithThumbsField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
+ 'parent': ('django.db.models.fields.BigIntegerField', [], {}),
+ 'poster_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
+ 'poster_user_agent': ('django.db.models.fields.TextField', [], {}),
+ 'pub_time': ('django.db.models.fields.DateTimeField', [], {}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['boards.Tag']", 'symmetrical': 'False'}),
+ 'text': ('markupfield.fields.MarkupField', [], {'rendered_field': 'True'}),
+ 'text_markup_type': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '30'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ u'boards.tag': {
+ 'Meta': {'object_name': 'Tag'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['boards']
\ No newline at end of file
diff --git a/boards/models.py b/boards/models.py
--- a/boards/models.py
+++ b/boards/models.py
@@ -215,7 +215,7 @@ class Post(models.Model):
escape_html=False)
image = thumbs.ImageWithThumbsField(upload_to=_update_image_filename,
blank=True, sizes=(IMAGE_THUMB_SIZE,))
- poster_ip = models.IPAddressField()
+ poster_ip = models.GenericIPAddressField()
poster_user_agent = models.TextField()
parent = models.BigIntegerField()
tags = models.ManyToManyField(Tag)
@@ -287,3 +287,11 @@ class Admin(models.Model):
def __unicode__(self):
return self.name + '/' + '*' * len(self.password)
+
+
+class Ban(models.Model):
+
+ ip = models.GenericIPAddressField()
+
+ def __unicode__(self):
+ return self.ip
diff --git a/boards/templates/boards/authors.html b/boards/templates/boards/banned.html
copy from boards/templates/boards/authors.html
copy to boards/templates/boards/banned.html
--- a/boards/templates/boards/authors.html
+++ b/boards/templates/boards/banned.html
@@ -3,28 +3,11 @@
{% load i18n %}
{% block head %}
-
{% trans "Authors" %}
+ {% trans "Banned" %}
{% endblock %}
{% block content %}
-
Authors
- {% for nick, values in authors.items %}
-
- {{ nick }} ({{ values.name }}):
- {% for value in values.contacts %}
- {{ value }}
- {% endfor %} -
- {% for role in values.roles %}
- {% trans role %}
- {% endfor %}
-
- {% endfor %}
-
-
{% trans "Distributed under the" %}
- GNU GPLv3
- {% trans "license" %}
-
- {% trans "Repository" %}
+ {% trans 'Your IP address has been banned. Contact the administrator' %}
{% endblock %}
\ No newline at end of file
diff --git a/boards/urls.py b/boards/urls.py
--- a/boards/urls.py
+++ b/boards/urls.py
@@ -26,6 +26,7 @@ urlpatterns = patterns('',
url(r'^captcha/', include('captcha.urls')),
url(r'^jump/(?P\w+)/$', views.jump_to_post, name='jumper'),
url(r'^authors/$', views.authors, name='authors'),
+ url(r'^banned/$', views.you_are_banned, name='banned'),
# RSS feeds
url(r'^rss/$', AllThreadsFeed()),
diff --git a/boards/views.py b/boards/views.py
--- a/boards/views.py
+++ b/boards/views.py
@@ -9,7 +9,7 @@ from boards import utils
from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
ThreadCaptchaForm, PostCaptchaForm
-from boards.models import Post, Admin, Tag
+from boards.models import Post, Admin, Tag, Ban
from boards import authors
import neboard
@@ -46,6 +46,12 @@ def index(request, page=0):
def _new_post(request, form, thread_id=boards.models.NO_PARENT):
"""Add a new post (in thread or as a reply)."""
+ ip = _get_client_ip(request)
+ is_banned = Ban.objects.filter(ip=ip).count() > 0
+
+ if is_banned:
+ return redirect(you_are_banned)
+
data = form.cleaned_data
title = data['title']
@@ -56,8 +62,6 @@ def _new_post(request, form, thread_id=b
else:
image = None
- ip = _get_client_ip(request)
-
tags = []
new_thread = thread_id == boards.models.NO_PARENT
@@ -222,6 +226,11 @@ def authors(request):
return render(request, 'boards/authors.html', context)
+def you_are_banned(request):
+ context = _init_default_context(request)
+ return render(request, 'boards/banned.html', context)
+
+
def _get_theme(request):
"""Get user's CSS theme"""