Ralfp 12 лет назад
Родитель
Сommit
85b83e0024

+ 101 - 0
misago/fixtures/accountssetings.py

@@ -0,0 +1,101 @@
+from misago.utils.fixtures import load_settings_fixture, update_settings_fixture
+from misago.utils.translation import ugettext_lazy as _
+
+settings_fixture = (
+    # Register and Sign-In Settings
+    ('accounts', {
+        'name': _("Users Accounts Settings"),
+        'description': _("Those settings allow you to increase security of your members accounts."),
+        'settings': (
+            ('account_activation', {
+                'type':         "string",
+                'input':        "choice",
+                'extra':        {'choices': [('', _("No validation required")), ('user', _("Activation Token sent to User")), ('admin', _("Activation by Administrator")), ('block', _("Dont allow new registrations"))]},
+                'separator':    _("Users Registrations"),
+                'name':         _("New accounts validation"),
+            }),
+            ('default_timezone', {
+                'value':        "utc",
+                'type':         "string",
+                'input':        "select",
+                'extra':        {'choices': '#TZ#'},
+                'name':         _("Default Timezone"),
+                'description':  _("Used by guests, crawlers and newly registered users."),
+            }),
+            ('username_length_min', {
+                'value':        3,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 3},
+                'separator':    _("Users Names"),
+                'name':         _("Minimum allowed username length"),
+            }),
+            ('username_length_max', {
+                'value':        16,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 3},
+                'name':         _("Maxim allowed username length"),
+            }),
+            ('password_length', {
+                'value':        4,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 1},
+                'separator':    _("Users Passwords"),
+                'name':         _("Minimum user password length"),
+            }),
+            ('password_complexity', {
+                'value':        [],
+                'type':         "array",
+                'input':        "mlist",
+                'extra':        {'choices': [('case', _("Require mixed Case")), ('digits', _("Require digits")), ('special', _("Require special characters"))]},
+                'name':         _("Password Complexity"),
+            }),
+            ('password_lifetime', {
+                'value':        0,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _("Password Lifetime"),
+                'description':  _("Enter number of days since password was set to force member to change it with new one, or 0 to dont force your members to change their passwords."),
+            }),
+            ('password_in_email', {
+                'value':        False,
+                'type':         "boolean",
+                'input':        "yesno",
+                'name':         _("Include User Password in Welcoming E-mail"),
+                'description':  _("If you want to, Misago can include new user password in welcoming e-mail that is sent to new users after successful account creation."),
+            }),
+            ('subscribe_start', {
+                'value':        2,
+                'type':         "integer",
+                'input':        "select",
+                'extra':        {'choices': ((0, _("Don't watch")),
+                                             (1, _("Put on watched threads list")),
+                                             (2, _("Put on watched threads list and e-mail user when somebody replies")),
+                                             )},
+                'separator':    _("Default Watching Preferences"),
+                'name':         _("Watch threads user started"),
+            }),
+            ('subscribe_reply', {
+                'value':        2,
+                'type':         "integer",
+                'input':        "select",
+                'extra':        {'choices': ((0, _("Don't watch")),
+                                             (1, _("Put on watched threads list")),
+                                             (2, _("Put on watched threads list and e-mail user when somebody replies")),
+                                             )},
+                'name':         _("Watch threads user replied in"),
+            }),
+        ),
+    }),
+)
+
+
+def load():
+    load_settings_fixture(settings_fixture)
+    
+    
+def update():
+    update_settings_fixture(settings_fixture)

+ 4 - 0
misago/fixtures/aclmonitor.py

@@ -0,0 +1,4 @@
+from misago.utils.fixtures import load_monitor_fixture
+
+def load():
+    load_monitor_fixture({'acl_version': 0})

+ 46 - 0
misago/fixtures/avatarssettings.py

@@ -0,0 +1,46 @@
+from misago.utils.fixtures import load_settings_fixture, update_settings_fixture
+from misago.utils.translation import ugettext_lazy as _
+
+settings_fixture = (
+    # Avatars Settings
+    ('avatars', {
+         'name': _("Users Avatars Settings"),
+         'description': _("Those settings allow you to control your users avatars."),
+         'settings': (
+            ('avatars_types', {
+                'value':        ['gravatar', 'gallery'],
+                'type':         "array",
+                'input':        "mlist",
+                'extra':        {'choices': [('gravatar', _("Gravatar")), ('upload', _("Uploaded Avatar")), ('gallery', _("Avatars Gallery"))]},
+                'separator':    _("General Settings"),
+                'name':         _("Allowed Avatars"),
+                'description':  _("Select Avatar types allowed on your forum."),
+            }),
+            ('default_avatar', {
+                'value':        "gravatar",
+                'type':         "string",
+                'input':        "select",
+                'extra':        {'choices': [('gravatar', _("Gravatar")), ('gallery', _("Random Avatar from Gallery"))]},
+                'name':         _("Default Avatar"),
+                'description':  _("Default Avatar assigned to new members. If you creade directory and name it \"_default\", forum will select random avatar from that directory instead of regular gallery. If no avatar can be picked from gallery, Gravatar will be used."),
+            }),
+            ('upload_limit', {
+                'value':        128,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'separator':    _("Avatar Upload Settings"),
+                'name':         _("Maxmimum size of uploaded file"),
+                'description':  _("Select maximum allowed file size (in KB) for Avatar uploads."),
+            }),
+       ),
+    }),
+)
+
+
+def load():
+    load_settings_fixture(settings_fixture)
+
+
+def update():
+    update_settings_fixture(settings_fixture)

+ 4 - 0
misago/fixtures/bansmonitor.py

@@ -0,0 +1,4 @@
+from misago.utils.fixtures import load_monitor_fixture
+
+def load():
+    load_monitor_fixture({'bans_version': 0})

+ 45 - 0
misago/fixtures/bruteforcesettings.py

@@ -0,0 +1,45 @@
+from misago.utils.fixtures import load_settings_fixture, update_settings_fixture
+from misago.utils.translation import ugettext_lazy as _
+
+settings_fixture = (
+    # Register and Sign-In Settings
+    ('brute-force', {
+        'name': _("Brute-force Countermeasures"),
+        'description': _("Those settings allow you to protect your forum from brute-force attacks."),
+        'settings': (
+            ('attempts_limit', {
+                'value':        3,
+                'default':      3,
+                'type':         "integer",
+                'input':        "text",
+                'separator':    _("Brute-force Countermeasures"),
+                'name':         _("IP invalid attempts limit"),
+                'description':  _('Enter maximal number of allowed attempts before IP address "jams". Defautly forum records only failed sign-in attempts.'),
+            }),
+            ('registrations_jams', {
+                'value':        False,
+                'default':      False,
+                'type':         "boolean",
+                'input':        "yesno",
+                'name':         _("Protect register form"),
+                'description':  _("Set this setting to yes if you want failed register attempts to count into limit. Majority of failed register attempts are caused by CAPTCHA protection against spam-bots, however same protection may cause problems for users with disabilities or ones that have problems understanding Q&A challenge."),
+            }),
+            ('jams_lifetime', {
+                'value':        15,
+                'default':      15,
+                'type':         "integer",
+                'input':        "text",
+                'name':         _("Automaticaly unlock jammed IPs"),
+                'description':  _('Enter number of minutes since IP address "jams" to automatically unlock it, or 0 to never unlock jammed IP adresses. Jams don\'t count as bans.'),
+            }),
+        ),
+    }),
+)
+
+
+def load():
+    load_settings_fixture(settings_fixture)
+
+
+def update():
+    update_settings_fixture(settings_fixture)

+ 1 - 1
misago/fixtures/captchasettings.py

@@ -3,7 +3,7 @@ from misago.utils.translation import ugettext_lazy as _
 
 settings_fixture = (
    # Spam Countermeasures
-   ('spam', {
+   ('captcha', {
         'name': _("Spam Countermeasures"),
         'description': _("Those settings allow you to combat automatic registrations and spam messages on your forum."),
         'settings': (

+ 54 - 0
misago/fixtures/forums.py

@@ -0,0 +1,54 @@
+from django.utils import timezone
+from misago.models import Forum, Thread, Post 
+from misago.utils.fixtures import load_monitor_fixture
+from misago.utils.strings import slugify
+
+def load():
+    Forum(token='annoucements', name='annoucements', slug='annoucements', type='forum').insert_at(None, save=True)
+    Forum(token='private', name='private', slug='private', type='forum').insert_at(None, save=True)
+    Forum(token='reports', name='reports', slug='reports', type='forum').insert_at(None, save=True)
+
+    root = Forum(token='root', name='root', slug='root')
+    root.insert_at(None, save=True)
+    cat = Forum(type='category', name='First Category', slug='first-category')
+    cat.insert_at(root, save=True)
+    forum = Forum(type='forum', name='First Forum', slug='first-forum', threads=1, posts=1)
+    forum.insert_at(cat, save=True)
+    Forum(type='redirect', name='Project Homepage', slug='project-homepage', redirect='http://misago-project.org').insert_at(cat, position='last-child', save=True)
+    Forum.objects.populate_tree(True)
+
+    now = timezone.now()
+    thread = Thread.objects.create(
+                                   forum=forum,
+                                   name='Welcome to Misago!',
+                                   slug=slugify('Welcome to Misago!'),
+                                   start=now,
+                                   last=now,
+                                   )
+    post = Post.objects.create(
+                               forum=forum,
+                               thread=thread,
+                               user_name='MisagoProject',
+                               ip='127.0.0.1',
+                               agent='',
+                               post='Welcome to Misago!',
+                               post_preparsed='Welcome to Misago!',
+                               date=now,
+                               )
+    thread.start_post = post
+    thread.start_poster_name = 'MisagoProject'
+    thread.start_poster_slug = 'misagoproject'
+    thread.last_post = post
+    thread.last_poster_name = 'MisagoProject'
+    thread.last_poster_slug = 'misagoproject'
+    thread.save(force_update=True)
+    forum.last_thread = thread
+    forum.last_thread_name = thread.name
+    forum.last_thread_slug = thread.slug
+    forum.last_thread_date = thread.last
+    forum.last_poster = thread.last_poster
+    forum.last_poster_name = thread.last_poster_name
+    forum.last_poster_slug = thread.last_poster_slug
+    forum.save(force_update=True)
+
+    load_monitor_fixture({'threads': 1, 'posts': 1})

+ 114 - 0
misago/fixtures/forumsroles.py

@@ -0,0 +1,114 @@
+from misago.models import ForumRole
+from misago.utils.translation import ugettext_lazy as _
+
+def load():
+    role = ForumRole()
+    role.name = _('Full Access').message
+    role.permissions = {
+                        'can_see_forum': True,
+                        'can_see_forum_contents': True,
+                        'can_read_threads': 2,
+                        'can_start_threads': 2,
+                        'can_edit_own_threads': True,
+                        'can_soft_delete_own_threads': True,
+                        'can_write_posts': 2,
+                        'can_edit_own_posts': True,
+                        'can_soft_delete_own_posts': True,
+                        'can_upvote_posts': True,
+                        'can_downvote_posts': True,
+                        'can_see_posts_scores': 2,
+                        'can_see_votes': True,
+                        'can_make_polls': True,
+                        'can_vote_in_polls': True,
+                        'can_see_poll_votes': True,
+                        'can_see_attachments': True,
+                        'can_upload_attachments': True,
+                        'can_download_attachments': True,
+                        'attachment_size': 5000,
+                        'attachment_limit': 15,
+                        'can_approve': True,
+                        'can_edit_labels': True,
+                        'can_see_changelog': True,
+                        'can_pin_threads': 2,
+                        'can_edit_threads_posts': True,
+                        'can_move_threads_posts': True,
+                        'can_close_threads': True,
+                        'can_protect_posts': True,
+                        'can_delete_threads': 2,
+                        'can_delete_posts': 2,
+                        'can_delete_polls': 2,
+                        'can_delete_attachments': True,
+                       }
+    role.save(force_insert=True)
+
+    role = ForumRole()
+    role.name = _('Standard Access and Upload').message
+    role.permissions = {
+                        'can_see_forum': True,
+                        'can_see_forum_contents': True,
+                        'can_read_threads': 2,
+                        'can_start_threads': 2,
+                        'can_edit_own_threads': True,
+                        'can_write_posts': 2,
+                        'can_edit_own_posts': True,
+                        'can_soft_delete_own_posts': True,
+                        'can_upvote_posts': True,
+                        'can_downvote_posts': True,
+                        'can_see_posts_scores': 2,
+                        'can_make_polls': True,
+                        'can_vote_in_polls': True,
+                        'can_upload_attachments': True,
+                        'can_download_attachments': True,
+                        'attachment_size': 100,
+                        'attachment_limit': 3,
+                       }
+    role.save(force_insert=True)
+
+    role = ForumRole()
+    role.name = _('Standard Access').message
+    role.permissions = {
+                        'can_see_forum': True,
+                        'can_see_forum_contents': True,
+                        'can_read_threads': 2,
+                        'can_start_threads': 2,
+                        'can_edit_own_threads': True,
+                        'can_write_posts': 2,
+                        'can_edit_own_posts': True,
+                        'can_soft_delete_own_posts': True,
+                        'can_upvote_posts': True,
+                        'can_downvote_posts': True,
+                        'can_see_posts_scores': 2,
+                        'can_make_polls': True,
+                        'can_vote_in_polls': True,
+                        'can_download_attachments': True,
+                       }
+    role.save(force_insert=True)
+
+    role = ForumRole()
+    role.name = _('Read and Download').message
+    role.permissions = {
+                        'can_see_forum': True,
+                        'can_see_forum_contents': True,
+                        'can_read_threads': 2,
+                        'can_download_attachments': True,
+                        'can_see_posts_scores': 2,
+                       }
+    role.save(force_insert=True)
+
+    role = ForumRole()
+    role.name = _('Threads list only').message
+    role.permissions = {
+                        'can_see_forum': True,
+                        'can_see_forum_contents': True,
+                       }
+    role.save(force_insert=True)
+
+    role = ForumRole()
+    role.name = _('Read only').message
+    role.permissions = {
+                        'can_see_forum': True,
+                        'can_see_forum_contents': True,
+                        'can_read_threads': 2,
+                        'can_see_posts_scores': 2,
+                       }
+    role.save(force_insert=True)

+ 83 - 0
misago/fixtures/rankingsettings.py

@@ -0,0 +1,83 @@
+from misago.utils.fixtures import load_settings_fixture, update_settings_fixture
+from misago.utils.translation import ugettext_lazy as _
+
+settings_fixture = (
+    # Users Ranking Settings
+    ('ranking', {
+        'name': _("Members Ranking"),
+        'description': _("Those settings control mechanisms of members activity ranking which allows you to gamificate your forum."),
+        'settings': (
+            ('ranking_inflation', {
+                'value':        5,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0, 'max': 99},
+                'separator':    _("Basic Ranking Settings"),
+                'name':         _("Ranking Inflation"),
+                'description':  _("Enter size of ranking scores inflation in percent. Scores inflation is important mechanism that allows ranking self-regulation, punishing inactivity and requiring users to remain active in order to remain high in ranking."),
+            }),
+            ('ranking_positions_visible', {
+                'value':        True,
+                'type':         "boolean",
+                'input':        "yesno",
+                'name':         _("Don't Keep Users Ranking Positions Secret"),
+                'description':  _("Changing this to yes will cause forum to display user position in ranking on his profile page."),
+            }),
+            ('ranking_scores_visible', {
+                'value':        True,
+                'type':         "boolean",
+                'input':        "yesno",
+                'name':         _("Don't Keep Users Scores Secret"),
+                'description':  _("Changing this to yes will cause forum to display user score on his profile page."),
+            }),
+            ('score_reward_new_thread', {
+                'value':        50,
+                'type':         "integer",
+                'input':        "text",
+                'separator':    _("Posting Rewards"),
+                'name':         _("New Thread Reward"),
+                'description':  _("Score user will receive (or lose) whenever he posts new thread."),
+            }),
+            ('score_reward_new_post', {
+                'value':        100,
+                'type':         "integer",
+                'input':        "text",
+                'name':         _("New Reply Reward"),
+                'description':  _("Score user will receive (or lose) whenever he posts new reply in thread."),
+            }),
+            ('score_reward_new_post_cooldown', {
+                'value':        180,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _("Reward Cooldown"),
+                'description':  _("Minimal time (in seconds) that has to pass between postings for new message to receive karma vote. This is useful to combat flood."),
+            }),
+            ('score_reward_karma_positive', {
+                'value':        20,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'separator':    _("Karma System"),
+                'name':         _("Upvote Reward"),
+                'description':  _("Score user will receive every time his post receives upvote."),
+            }),
+            ('score_reward_karma_negative', {
+                'value':        10,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _("Downvote Punishment"),
+                'description':  _("Score user will lose every time his post receives downvote."),
+            }),
+        ),
+    }),
+)
+
+
+def load():
+    load_settings_fixture(settings_fixture)
+
+
+def update():
+    update_settings_fixture(settings_fixture)

+ 47 - 0
misago/fixtures/ranks.py

@@ -0,0 +1,47 @@
+from misago.models import Rank
+from misago.utils.translation import ugettext_lazy as _
+
+def load():
+    Rank.objects.create(
+                        name=_("Forum Team").message,
+                        name_slug='forum-team',
+                        title=_("Forum Team").message,
+                        style='team',
+                        special=True,
+                        order=0,
+                        as_tab=True,
+                        on_index=True,
+                        )
+
+    Rank.objects.create(
+                        name=_("Most Valuable Posters").message,
+                        name_slug='most-valuable-posters',
+                        title=_("MVP").message,
+                        style='mvp',
+                        special=True,
+                        order=1,
+                        as_tab=True,
+                        )
+
+    Rank.objects.create(
+                        name=_("Lurkers").message,
+                        name_slug='lurkers',
+                        order=1,
+                        criteria="100%"
+                        )
+
+    Rank.objects.create(
+                        name=_("Members").message,
+                        name_slug='members',
+                        order=2,
+                        criteria="75%"
+                        )
+
+    Rank.objects.create(
+                        name=_("Active Members").message,
+                        name_slug='active-members',
+                        style='active',
+                        order=3,
+                        criteria="10%",
+                        as_tab=True,
+                        )

+ 50 - 0
misago/fixtures/signingsettings.py

@@ -0,0 +1,50 @@
+from misago.utils.fixtures import load_settings_fixture, update_settings_fixture
+from misago.utils.translation import ugettext_lazy as _
+
+settings_fixture = (
+    # Register and Sign-In Settings
+    ('signin', {
+        'name': _("Sign-In and Sessions Settings"),
+        'description': _("Those settings control behaviour of signed-in accounts."),
+        'settings': (
+            ('sessions_validate_ip', {
+                'value':        True,
+                'type':         "boolean",
+                'input':        "yesno",
+                'separator':    _("Sessions Settings"),
+                'name':         _("Check IP on session authorization"),
+                'description':  _("Makes sessions more secure, but can cause problems with proxies and VPN's."),
+            }),
+            ('remember_me_allow', {
+                'value':        True,
+                'type':         "boolean",
+                'input':        "yesno",
+                'separator':    _('"Remember Me" Feature'),
+                'name':         _('Enable "Remember Me" feature'),
+                'description':  _("Turning this option on allows users to sign in on to your board using cookie-based tokens. This may result in account compromisation when user fails to sign out on shared computer or his cookie is stolen."),
+            }),
+            ('remember_me_lifetime', {
+                'value':        90,
+                'type':         "integer",
+                'input':        "text",
+                'name':         _('"Remember Me" token lifetime'),
+                'description':  _('Number of days since either last use or creation of "Remember Me" token to its expiration.'),
+            }),
+            ('remember_me_extensible', {
+                'value':        1,
+                'type':         "boolean",
+                'input':        "yesno",
+                'name':         _('Allow "Remember Me" tokens refreshing'),
+                'description':  _('Set this setting to off if you want to force your users to periodically update their "Remember Me" tokens by signing in. If this option is on, Tokens are updated when they are used to open new session.'),
+            }),
+        ),
+    }),
+)
+
+
+def load():
+    load_settings_fixture(settings_fixture)
+
+
+def update():
+    update_settings_fixture(settings_fixture)

+ 126 - 0
misago/fixtures/threadssettings.py

@@ -0,0 +1,126 @@
+from misago.utils.fixtures import load_settings_fixture, update_settings_fixture
+from misago.utils.translation import ugettext_lazy as _
+
+settings_fixture = (
+    # Threads Settings
+    ('threads', {
+         'name': _("Threads and Posts Settings"),
+         'description': _("Those settings control your forum's threads and posts."),
+         'settings': (
+            ('thread_name_min', {
+                'value':        4,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 1},
+                'separator':    _("Threads"),
+                'name':         _("Min. Thread Name Length"),
+                'description':  _('Minimal allowed thread name length.'),
+            }),
+            ('thread_name_max', {
+                'value':        60,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 5, 'max': 100},
+                'name':         _("Max. Thread Name Length"),
+                'description':  _('Maximum allowed thread name length.'),
+            }),
+            ('threads_per_page', {
+                'value':        40,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 5},
+                'name':         _("Threads per page"),
+                'description':  _("Number of threads displayed on page in forum view."),
+            }),
+            ('avatars_on_threads_list', {
+                'value':        False,
+                'type':         "boolean",
+                'input':        "yesno",
+                'name':         _("Display avatars on threads list"),
+                'description':  _("Unlike basic user data, avatars are not cached - turning this option on will cause one extra query on threads lists."),
+            }),
+            ('thread_ranking_size', {
+                'value':        6,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0, 'max': 30},
+                'separator':    _("Thread Popularity Ranking"),
+                'name':         _('Threads on "Popular Threads" list'),
+                'description':  _('Enter number of threads to be displayed on "Popular Threads" list on board index or 0 to don\'t display any threads there.'),
+            }),
+            ('thread_ranking_refresh', {
+                'value':        60,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _('Ranking Update Frequency'),
+                'description':  _('Enter minimum of number of minutes between ranking updates or zero to update ranking on every request - strongly discouraged for active forums.'),
+            }),
+            ('thread_ranking_initial_score', {
+                'value':        30,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _('Initial Thread Score'),
+                'description':  _("Initial Thread Score helps new threads overtake old threads in ranking."),
+            }),
+            ('thread_ranking_reply_score', {
+                'value':        5,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _('New Reply Score'),
+                'description':  _("Only replies visible to all members increase thread inflation."),
+            }),
+            ('thread_ranking_inflation', {
+                'value':        20,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0, 'max': 99},
+                'name':         _('Score inflation'),
+                'description':  _("Thread popularity system requires inflation to be defined in order to be effective. updatethreadranking task will lower thread scores by percent defined here on every launch. For example, yf you enter 5, thread scores will be lowered by 5% on every update. Enter zero to disable inflation."),
+            }),
+            ('post_length_min', {
+                'value':        5,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 5},
+                'separator':    _("Posts"),
+                'name':         _("Min. Post Length"),
+                'description':  _("Minimal allowed post length."),
+            }),
+            ('post_merge_time', {
+                'value':        5,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _("Automatic Post Merge timespan"),
+                'description':  _("Forum can automatically merge member posts if interval between postings is shorter than specified number of minutes."),
+            }),
+            ('posts_per_page', {
+                'value':        15,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 5},
+                'name':         _("Posts per page"),
+                'description':  _("Number of posts per page in thread view."),
+            }),
+            ('thread_length', {
+                'value':        300,
+                'type':         "integer",
+                'input':        "text",
+                'extra':        {'min': 0},
+                'name':         _("Thread Length Limit"),
+                'description':  _('Long threads are hard to follow and search. You can force users to create few shorter threads instead of one long by setting thread lenght limits. Users with "Can close threads" permission will still be able to post in threads that have reached posts limit.'),
+            }),
+       ),
+    }),
+)
+
+
+def load():
+    load_settings_fixture(settings_fixture)
+
+
+def update():
+    update_settings_fixture(settings_fixture)

+ 42 - 0
misago/fixtures/tossettings.py

@@ -0,0 +1,42 @@
+from misago.utils.fixtures import load_settings_fixture, update_settings_fixture
+from misago.utils.translation import ugettext_lazy as _
+
+settings_fixture = (
+    # Avatars Settings
+    ('tos', {
+         'name': _("Forum Terms of Service"),
+         'description': _("Those settings allow you to set up forum terms of service."),
+         'settings': (
+            ('tos_title', {
+                'value':        "Terms of Service",
+                'type':         "string",
+                'input':        "text",
+                'separator':    _("Terms of Service Options"),
+                'name':         _("Page Title"),
+                'description':  _("Title of page community ToS are displayed on."),
+            }),
+            ('tos_url', {
+                'value':        "",
+                'type':         "string",
+                'input':        "text",
+                'name':         _("Link to remote page with ToS"),
+                'description':  _("If your forum's ToS are located on remote page, enter here its address."),
+            }),
+            ('tos_content', {
+                'value':        "",
+                'type':         "string",
+                'input':        "textarea",
+                'name':         _("OR enter ToS content"),
+                'description':  _("Instead of linking to remote page, forum can create dedicated ToS page for you. To display ToS page, enter here your forum Terms of Service."),
+            }),
+       ),
+    }),
+)
+
+
+def load():
+    load_settings_fixture(settings_fixture)
+
+
+def update():
+    update_settings_fixture(settings_fixture)

+ 49 - 0
misago/fixtures/userroles.py

@@ -0,0 +1,49 @@
+from misago.models import Role
+from misago.utils.translation import ugettext_lazy as _
+
+def load():
+    role = Role(name=_("Administrator").message, token='admin', protected=True)
+    role.petmissions = {
+                        'name_changes_allowed': 5,
+                        'changes_expire': 7,
+                        'can_use_acp': True,
+                        'can_use_signature': True,
+                        'allow_signature_links': True,
+                        'allow_signature_images': True,
+                        'can_search_users': True,
+                        'can_see_users_emails': True,
+                        'can_see_users_trails': True,
+                        'can_see_hidden_users': True,
+                        'forums': {5: 1, 6: 1, 7: 1},
+                       }
+    role.save(force_insert=True)
+    
+    role = Role(name=_("Moderator").message, token='mod', protected=True)
+    role.petmissions = {
+                        'name_changes_allowed': 3,
+                        'changes_expire': 14,
+                        'can_use_signature': True,
+                        'allow_signature_links': True,
+                        'can_search_users': True,
+                        'can_see_users_emails': True,
+                        'can_see_users_trails': True,
+                        'can_see_hidden_users': True,
+                        'forums': {5: 1, 6: 1, 7: 1},
+                       }
+    role.save(force_insert=True)
+    
+    role = Role(name=_("Registered").message, token='registered')
+    role.petmissions = {
+                        'name_changes_allowed': 2,
+                        'can_use_signature': False,
+                        'can_search_users': True,
+                        'forums': {5: 3, 6: 3, 7: 3},
+                       }
+    role.save(force_insert=True)
+    
+    role = Role(name=_("Guest").message, token='guest')
+    role.petmissions = {
+                        'can_search_users': True,
+                        'forums': {5: 6, 6: 6, 7: 6},
+                       }
+    role.save(force_insert=True)