Browse Source

Dropped thread adjustments in preparation for #127

Ralfp 12 years ago
parent
commit
509b43cbbc

+ 0 - 0
misago/apps/admin/clients/__init__.py


+ 0 - 51
misago/apps/admin/clients/forms.py

@@ -1,51 +0,0 @@
-from django.conf import settings
-from django.core.exceptions import ValidationError
-from django.utils.translation import ugettext_lazy as _
-from django import forms
-from misago.forms import Form
-from misago.models import ThemeAdjustment
-from misago.validators import validate_sluggable
-
-available_themes = []
-for theme in settings.INSTALLED_THEMES[0:-1]:
-    available_themes.append((theme, theme))
-
-
-class ThemeAdjustmentForm(Form):
-    theme = forms.ChoiceField(choices=available_themes, required=False)
-    useragents = forms.CharField(widget=forms.Textarea, required=False)
-    
-    layout = (
-              (
-               _("Theme Adjustment"),
-               (
-                ('theme', {'label': _("Theme"), 'help_text': _("Select theme that is to replace default one.")}),
-                ('useragents', {'label': _("UserAgent Strings"), 'help_text': _("Enter UserAgent strings for which selected theme has to replace default one. Each string has to be entered in new line. This is case insensitive")}),
-                ),
-               ),
-              )
-
-    def __init__(self, adjustment=None, *args, **kwargs):
-        self.request = kwargs['request']
-        if adjustment:
-            self.adjustment = adjustment
-        else:
-            self.adjustment = ThemeAdjustment()
-        super(ThemeAdjustmentForm, self).__init__(*args, **kwargs)
-        
-    def clean_theme(self):
-        self.adjustment.theme = self.cleaned_data['theme']
-        self.adjustment.full_clean()
-        return self.cleaned_data['theme']
-
-    def clean_useragents(self):
-        agents_raw = self.cleaned_data['useragents'].strip().lower().splitlines()
-        agents = []
-        for line in agents_raw:
-            line = line.strip()
-            if line and not line in agents:
-                agents.append(line)
-        self.cleaned_data['useragents'] = agents
-        if not agents:
-            raise ValidationError(_("You have to enter at least one UserAgent."))
-        return self.cleaned_data['useragents']

+ 0 - 110
misago/apps/admin/clients/views.py

@@ -1,110 +0,0 @@
-from django.core.urlresolvers import reverse as django_reverse
-from django import forms
-from django.utils.translation import ugettext as _
-from misago.admin import site
-from misago.apps.admin.widgets import *
-from misago.forms import Form
-from misago.models import ThemeAdjustment
-from misago.utils.strings import slugify
-from misago.apps.admin.clients.forms import ThemeAdjustmentForm
-
-def reverse(route, target=None):
-    if target:
-        return django_reverse(route, kwargs={'target': target.pk, 'slug': slugify(target.theme)})
-    return django_reverse(route)
-
-
-"""
-Views
-"""
-class List(ListWidget):
-    admin = site.get_action('clients')
-    id = 'list'
-    columns = (
-               ('theme', _("Theme")),
-               )
-    nothing_checked_message = _('You have to check at least one adjustment.')
-    actions = (
-               ('delete', _("Delete selected adjustments"), _("Are you sure you want to delete selected theme adjustments?")),
-               )
-
-    def get_item_actions(self, item):
-        return (
-                self.action('pencil', _("Edit Adjustment"), reverse('admin_clients_edit', item)),
-                self.action('remove', _("Delete Adjustment"), reverse('admin_clients_delete', item), post=True, prompt=_("Are you sure you want to delete this adjustment?")),
-                )
-
-    def action_delete(self, items, checked):
-        ThemeAdjustment.objects.filter(id__in=checked).delete()
-        return Message(_('Selected adjustment have been deleted successfully.'), 'success'), reverse('admin_clients')
-
-
-class New(FormWidget):
-    admin = site.get_action('clients')
-    id = 'new'
-    fallback = 'admin_clients'
-    form = ThemeAdjustmentForm
-    submit_button = _("Set Adjustment")
-
-    def get_form_instance(self, form, model, initial, post=False):
-        if post:
-            return form(model, self.request.POST, request=self.request, initial=self.get_initial_data(model))
-        return form(model, request=self.request, initial=self.get_initial_data(model))
-    
-    def get_new_url(self, model):
-        return reverse('admin_clients_new')
-
-    def get_edit_url(self, model):
-        return reverse('admin_clients_edit', model)
-
-    def submit_form(self, form, target):
-        new_adjustment = ThemeAdjustment.objects.create(
-                                                        theme=form.cleaned_data['theme'],
-                                                        useragents='\r\n'.join(form.cleaned_data['useragents']),
-                                                        )
-        return new_adjustment, Message(_('New adjustment has been created.'), 'success')
-
-
-class Edit(FormWidget):
-    admin = site.get_action('clients')
-    id = 'edit'
-    name = _("Edit Adjustment")
-    fallback = 'admin_clients'
-    form = ThemeAdjustmentForm
-    target_name = 'theme'
-    notfound_message = _('Requested adjustment could not be found.')
-    submit_fallback = True
-
-    def get_url(self, model):
-        return reverse('admin_clients_edit', model)
-
-    def get_edit_url(self, model):
-        return self.get_url(model)
-
-    def get_form_instance(self, form, model, initial, post=False):
-        if post:
-            return form(model, self.request.POST, request=self.request, initial=self.get_initial_data(model))
-        return form(model, request=self.request, initial=self.get_initial_data(model))
-    
-    def get_initial_data(self, model):
-        return {
-                'theme': model.theme,
-                'useragents': model.useragents,
-                }
-
-    def submit_form(self, form, target):
-        target.theme = form.cleaned_data['theme']
-        target.useragents = '\r\n'.join(form.cleaned_data['useragents'])
-        target.save(force_update=True)
-        return target, Message(_('Adjustment using theme "%(name)s" has been saved.') % {'name': target.theme}, 'success')
-
-
-class Delete(ButtonWidget):
-    admin = site.get_action('clients')
-    id = 'delete'
-    fallback = 'admin_clients'
-    notfound_message = _('Requested adjustment could not be found.')
-
-    def action(self, target):
-        target.delete()
-        return Message(_('Adjustment using theme "%(name)s" has been deleted.') % {'name': target.theme}, 'success'), False

+ 60 - 60
misago/apps/admin/sections/forums.py

@@ -4,29 +4,29 @@ from misago.admin import AdminAction
 from misago.models import Forum
 from misago.models import Forum
 
 
 ADMIN_ACTIONS = (
 ADMIN_ACTIONS = (
-   AdminAction(
-               section='forums',
-               id='forums',
-               name=_("Forums List"),
-               help=_("Create, edit and delete forums."),
-               icon='comment',
-               model=Forum,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Forums List"),
-                         'help': _("All existing forums"),
-                         'route': 'admin_forums'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("New Node"),
-                         'help': _("Create new forums tree node"),
-                         'route': 'admin_forums_new'
-                         },
-                        ],
-               route='admin_forums',
-               urlpatterns=patterns('misago.apps.admin.forums.views',
+    AdminAction(
+                section='forums',
+                id='forums',
+                name=_("Forums List"),
+                help=_("Create, edit and delete forums."),
+                icon='comment',
+                model=Forum,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Forums List"),
+                          'help': _("All existing forums"),
+                          'route': 'admin_forums'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("New Node"),
+                          'help': _("Create new forums tree node"),
+                          'route': 'admin_forums_new'
+                          },
+                         ],
+                route='admin_forums',
+                urlpatterns=patterns('misago.apps.admin.forums.views',
                         url(r'^$', 'List', name='admin_forums'),
                         url(r'^$', 'List', name='admin_forums'),
                         url(r'^sync/$', 'resync_forums', name='admin_forums_resync'),
                         url(r'^sync/$', 'resync_forums', name='admin_forums_resync'),
                         url(r'^sync/(?P<forum>\d+)/(?P<progress>\d+)/$', 'resync_forums', name='admin_forums_resync'),
                         url(r'^sync/(?P<forum>\d+)/(?P<progress>\d+)/$', 'resync_forums', name='admin_forums_resync'),
@@ -36,49 +36,49 @@ ADMIN_ACTIONS = (
                         url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_forums_edit'),
                         url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_forums_edit'),
                         url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_forums_delete'),
                         url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_forums_delete'),
                     ),
                     ),
-               ),
-   AdminAction(
-               section='forums',
-               id='labels',
-               name=_("Thread Labels"),
-               help=_("Thread Labels allow you to group threads together within forums."),
-               icon='tags',
-               route='admin_forums_labels',
-               urlpatterns=patterns('misago.apps.admin.index',
+                ),
+    AdminAction(
+                section='forums',
+                id='labels',
+                name=_("Thread Labels"),
+                help=_("Thread Labels allow you to group threads together within forums."),
+                icon='tags',
+                route='admin_forums_labels',
+                urlpatterns=patterns('misago.apps.admin.index',
                         url(r'^$', 'todo', name='admin_forums_labels'),
                         url(r'^$', 'todo', name='admin_forums_labels'),
                     ),
                     ),
-               ),
-   AdminAction(
-               section='forums',
-               id='badwords',
-               name=_("Words Filter"),
-               help=_("Forbid usage of words in messages"),
-               icon='volume-off',
-               route='admin_forums_badwords',
-               urlpatterns=patterns('misago.apps.admin.index',
+                ),
+    AdminAction(
+                section='forums',
+                id='badwords',
+                name=_("Words Filter"),
+                help=_("Forbid usage of words in messages"),
+                icon='volume-off',
+                route='admin_forums_badwords',
+                urlpatterns=patterns('misago.apps.admin.index',
                         url(r'^$', 'todo', name='admin_forums_badwords'),
                         url(r'^$', 'todo', name='admin_forums_badwords'),
                     ),
                     ),
-               ),
-   AdminAction(
-               section='forums',
-               id='tests',
-               name=_("Tests"),
-               help=_("Tests that new messages have to pass"),
-               icon='filter',
-               route='admin_forums_tests',
-               urlpatterns=patterns('misago.apps.admin.index',
+                ),
+    AdminAction(
+                section='forums',
+                id='tests',
+                name=_("Tests"),
+                help=_("Tests that new messages have to pass"),
+                icon='filter',
+                route='admin_forums_tests',
+                urlpatterns=patterns('misago.apps.admin.index',
                         url(r'^$', 'todo', name='admin_forums_tests'),
                         url(r'^$', 'todo', name='admin_forums_tests'),
                     ),
                     ),
-               ),
-   AdminAction(
-               section='forums',
-               id='attachments',
-               name=_("Attachments"),
-               help=_("Manage allowed attachment types."),
-               icon='download-alt',
-               route='admin_forums_attachments',
-               urlpatterns=patterns('misago.apps.admin.index',
+                ),
+    AdminAction(
+                section='forums',
+                id='attachments',
+                name=_("Attachments"),
+                help=_("Manage allowed attachment types."),
+                icon='download-alt',
+                route='admin_forums_attachments',
+                urlpatterns=patterns('misago.apps.admin.index',
                         url(r'^$', 'todo', name='admin_forums_attachments'),
                         url(r'^$', 'todo', name='admin_forums_attachments'),
                     ),
                     ),
-               ),
+                ),
 )
 )

+ 51 - 51
misago/apps/admin/sections/overview.py

@@ -4,68 +4,68 @@ from misago.admin import AdminAction
 from misago.models import Session, User
 from misago.models import Session, User
 
 
 ADMIN_ACTIONS = (
 ADMIN_ACTIONS = (
-   AdminAction(
-               section='overview',
-               id='index',
-               name=_("Home"),
-               help=_("Your forums right now"),
-               icon='home',
-               route='admin_home',
-               urlpatterns=patterns('misago.apps.admin.index',
+    AdminAction(
+                section='overview',
+                id='index',
+                name=_("Home"),
+                help=_("Your forums right now"),
+                icon='home',
+                route='admin_home',
+                urlpatterns=patterns('misago.apps.admin.index',
                         url(r'^$', 'index', name='admin_home'),
                         url(r'^$', 'index', name='admin_home'),
                     ),
                     ),
-               ),
+                ),
     AdminAction(
     AdminAction(
-               section='overview',
-               id='stats',
-               name=_("Stats"),
-               help=_("Create Statistics Reports"),
-               icon='signal',
-               route='admin_stats',
-               urlpatterns=patterns('misago.apps.admin.stats.views',
+                section='overview',
+                id='stats',
+                name=_("Stats"),
+                help=_("Create Statistics Reports"),
+                icon='signal',
+                route='admin_stats',
+                urlpatterns=patterns('misago.apps.admin.stats.views',
                         url(r'^$', 'form', name='admin_stats'),
                         url(r'^$', 'form', name='admin_stats'),
                         url(r'^(?P<model>[a-z0-9]+)/(?P<date_start>[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])/(?P<date_end>[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])/(?P<precision>\w+)$', 'graph', name='admin_stats_graph'),
                         url(r'^(?P<model>[a-z0-9]+)/(?P<date_start>[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])/(?P<date_end>[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])/(?P<precision>\w+)$', 'graph', name='admin_stats_graph'),
                     ),
                     ),
-               ),
+                ),
     AdminAction(
     AdminAction(
-               section='overview',
-               id='online',
-               name=_("Online"),
-               help=_("See who is currently online on forums."),
-               icon='fire',
-               model=Session,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Users"),
-                         'help': _("Browse all registered user accounts"),
-                         'route': 'admin_online'
-                         },
-                        ],
-               route='admin_online',
-               urlpatterns=patterns('misago.apps.admin.online.views',
+                section='overview',
+                id='online',
+                name=_("Online"),
+                help=_("See who is currently online on forums."),
+                icon='fire',
+                model=Session,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Browse Users"),
+                          'help': _("Browse all registered user accounts"),
+                          'route': 'admin_online'
+                          },
+                         ],
+                route='admin_online',
+                urlpatterns=patterns('misago.apps.admin.online.views',
                         url(r'^$', 'List', name='admin_online'),
                         url(r'^$', 'List', name='admin_online'),
                         url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_online'),
                         url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_online'),
                     ),
                     ),
-               ),
+                ),
     AdminAction(
     AdminAction(
-               section='overview',
-               id='team',
-               name=_("Forum Team"),
-               help=_("List of all forum team members"),
-               icon='user',
-               model=User,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Forum Team Members"),
-                         'help': _("List of all forum team members"),
-                         'route': 'admin_team'
-                         },
-                        ],
-               route='admin_team',
-               urlpatterns=patterns('misago.apps.admin.team',
+                section='overview',
+                id='team',
+                name=_("Forum Team"),
+                help=_("List of all forum team members"),
+                icon='user',
+                model=User,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Forum Team Members"),
+                          'help': _("List of all forum team members"),
+                          'route': 'admin_team'
+                          },
+                         ],
+                route='admin_team',
+                urlpatterns=patterns('misago.apps.admin.team',
                         url(r'^$', 'List', name='admin_team'),
                         url(r'^$', 'List', name='admin_team'),
                     ),
                     ),
-               ),
+                ),
 )
 )

+ 61 - 61
misago/apps/admin/sections/perms.py

@@ -4,65 +4,65 @@ from misago.admin import AdminAction
 from misago.models import ForumRole, Role
 from misago.models import ForumRole, Role
 
 
 ADMIN_ACTIONS = (
 ADMIN_ACTIONS = (
-   AdminAction(
-               section='perms',
-               id='roles',
-               name=_("User Roles"),
-               help=_("Manage User Roles"),
-               icon='th-large',
-               model=Role,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Roles"),
-                         'help': _("Browse all existing roles"),
-                         'route': 'admin_roles'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("Add Role"),
-                         'help': _("Create new role"),
-                         'route': 'admin_roles_new'
-                         },
-                        ],
-               route='admin_roles',
-               urlpatterns=patterns('misago.apps.admin.roles.views',
-                        url(r'^$', 'List', name='admin_roles'),
-                        url(r'^new/$', 'New', name='admin_roles_new'),
-                        url(r'^forums/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Forums', name='admin_roles_masks'),
-                        url(r'^acl/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'ACL', name='admin_roles_acl'),
-                        url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_roles_edit'),
-                        url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_roles_delete'),
-                    ),
-               ),
-   AdminAction(
-               section='perms',
-               id='roles_forums',
-               name=_("Forum Roles"),
-               help=_("Manage Forum Roles"),
-               icon='th-list',
-               model=ForumRole,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Roles"),
-                         'help': _("Browse all existing roles"),
-                         'route': 'admin_roles_forums'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("Add Role"),
-                         'help': _("Create new role"),
-                         'route': 'admin_roles_forums_new'
-                         },
-                        ],
-               route='admin_roles_forums',
-               urlpatterns=patterns('misago.apps.admin.forumroles.views',
-                        url(r'^$', 'List', name='admin_roles_forums'),
-                        url(r'^new/$', 'New', name='admin_roles_forums_new'),
-                        url(r'^acl/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'ACL', name='admin_roles_forums_acl'),
-                        url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_roles_forums_edit'),
-                        url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_roles_forums_delete'),
-                    ),
-               ),
+    AdminAction(
+                section='perms',
+                id='roles',
+                name=_("User Roles"),
+                help=_("Manage User Roles"),
+                icon='th-large',
+                model=Role,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Browse Roles"),
+                          'help': _("Browse all existing roles"),
+                          'route': 'admin_roles'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("Add Role"),
+                          'help': _("Create new role"),
+                          'route': 'admin_roles_new'
+                          },
+                         ],
+                route='admin_roles',
+                urlpatterns=patterns('misago.apps.admin.roles.views',
+                         url(r'^$', 'List', name='admin_roles'),
+                         url(r'^new/$', 'New', name='admin_roles_new'),
+                         url(r'^forums/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Forums', name='admin_roles_masks'),
+                         url(r'^acl/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'ACL', name='admin_roles_acl'),
+                         url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_roles_edit'),
+                         url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_roles_delete'),
+                     ),
+                ),
+    AdminAction(
+                section='perms',
+                id='roles_forums',
+                name=_("Forum Roles"),
+                help=_("Manage Forum Roles"),
+                icon='th-list',
+                model=ForumRole,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Browse Roles"),
+                          'help': _("Browse all existing roles"),
+                          'route': 'admin_roles_forums'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("Add Role"),
+                          'help': _("Create new role"),
+                          'route': 'admin_roles_forums_new'
+                          },
+                         ],
+                route='admin_roles_forums',
+                urlpatterns=patterns('misago.apps.admin.forumroles.views',
+                         url(r'^$', 'List', name='admin_roles_forums'),
+                         url(r'^new/$', 'New', name='admin_roles_forums_new'),
+                         url(r'^acl/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'ACL', name='admin_roles_forums_acl'),
+                         url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_roles_forums_edit'),
+                         url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_roles_forums_delete'),
+                     ),
+                ),
 )
 )

+ 13 - 42
misago/apps/admin/sections/system.py

@@ -4,46 +4,17 @@ from misago.admin import AdminAction
 from misago.models import ThemeAdjustment
 from misago.models import ThemeAdjustment
 
 
 ADMIN_ACTIONS = (
 ADMIN_ACTIONS = (
-   AdminAction(
-               section='system',
-               id='settings',
-               name=_("Settings"),
-               help=_("Change your forum configuration"),
-               icon='wrench',
-               route='admin_settings',
-               urlpatterns=patterns('misago.apps.admin.settings.views',
-                        url(r'^$', 'settings', name='admin_settings'),
-                        url(r'^search/$', 'settings_search', name='admin_settings_search'),
-                        url(r'^(?P<group_slug>([a-z0-9]|-)+)-(?P<group_id>\d+)/$', 'settings', name='admin_settings')
-                    ),
-               ),
-   AdminAction(
-               section='system',
-               id='clients',
-               name=_("Clients"),
-               help=_("Adjust presentation layer to clients"),
-               icon='tint',
-               model=ThemeAdjustment,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Clients"),
-                         'help': _("Browse all existing clients"),
-                         'route': 'admin_clients'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("Add New Adjustment"),
-                         'help': _("Create new client adjustment"),
-                         'route': 'admin_clients_new'
-                         },
-                        ],
-               route='admin_clients',
-               urlpatterns=patterns('misago.apps.admin.clients.views',
-                        url(r'^$', 'List', name='admin_clients'),
-                        url(r'^new/$', 'New', name='admin_clients_new'),
-                        url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_clients_edit'),
-                        url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_clients_delete'),
-                    ),
-               ),
+    AdminAction(
+                section='system',
+                id='settings',
+                name=_("Settings"),
+                help=_("Change your forum configuration"),
+                icon='wrench',
+                route='admin_settings',
+                urlpatterns=patterns('misago.apps.admin.settings.views',
+                         url(r'^$', 'settings', name='admin_settings'),
+                         url(r'^search/$', 'settings_search', name='admin_settings_search'),
+                         url(r'^(?P<group_slug>([a-z0-9]|-)+)-(?P<group_id>\d+)/$', 'settings', name='admin_settings')
+                     ),
+                ),
 )
 )

+ 151 - 151
misago/apps/admin/sections/users.py

@@ -4,155 +4,155 @@ from misago.admin import AdminAction
 from misago.models import Ban, Newsletter, PruningPolicy, Rank, User
 from misago.models import Ban, Newsletter, PruningPolicy, Rank, User
 
 
 ADMIN_ACTIONS = (
 ADMIN_ACTIONS = (
-   AdminAction(
-               section='users',
-               id='users',
-               name=_("Users List"),
-               help=_("Search and browse users"),
-               icon='user',
-               model=User,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Users"),
-                         'help': _("Browse all registered user accounts"),
-                         'route': 'admin_users'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("Add User"),
-                         'help': _("Create new user account"),
-                         'route': 'admin_users_new'
-                         },
-                        ],
-               route='admin_users',
-               urlpatterns=patterns('misago.apps.admin.users.views',
-                        url(r'^$', 'List', name='admin_users'),
-                        url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_users'),
-                        url(r'^inactive/$', 'inactive', name='admin_users_inactive'),
-                        url(r'^new/$', 'New', name='admin_users_new'),
-                        url(r'^edit/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Edit', name='admin_users_edit'),
-                        url(r'^delete/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Delete', name='admin_users_delete'),
-                    ),
-               ),
-   AdminAction(
-               section='users',
-               id='ranks',
-               name=_("Ranks"),
-               help=_("Administrate User Ranks"),
-               icon='star',
-               model=Rank,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Ranks"),
-                         'help': _("Browse all existing ranks"),
-                         'route': 'admin_ranks'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("Add Rank"),
-                         'help': _("Create new rank"),
-                         'route': 'admin_ranks_new'
-                         },
-                        ],
-               route='admin_ranks',
-               urlpatterns=patterns('misago.apps.admin.ranks.views',
-                        url(r'^$', 'List', name='admin_ranks'),
-                        url(r'^new/$', 'New', name='admin_ranks_new'),
-                        url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_ranks_edit'),
-                        url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_ranks_delete'),
-                    ),
-               ),
-   AdminAction(
-               section='users',
-               id='bans',
-               name=_("Bans"),
-               help=_("Ban or unban users from forums."),
-               icon='lock',
-               model=Ban,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Bans"),
-                         'help': _("Browse all existing bans"),
-                         'route': 'admin_bans'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("Set Ban"),
-                         'help': _("Set new Ban"),
-                         'route': 'admin_bans_new'
-                         },
-                        ],
-               route='admin_bans',
-               urlpatterns=patterns('misago.apps.admin.bans.views',
-                        url(r'^$', 'List', name='admin_bans'),
-                        url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_bans'),
-                        url(r'^new/$', 'New', name='admin_bans_new'),
-                        url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_bans_edit'),
-                        url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_bans_delete'),
-                    ),
-               ),
-   AdminAction(
-               section='users',
-               id='prune_users',
-               name=_("Prune Users"),
-               help=_("Delete multiple Users"),
-               icon='remove',
-               model=PruningPolicy,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Pruning Policies"),
-                         'help': _("Browse all existing pruning policies"),
-                         'route': 'admin_prune_users'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("Set New Policy"),
-                         'help': _("Set new pruning policy"),
-                         'route': 'admin_prune_users_new'
-                         },
-                        ],
-               route='admin_prune_users',
-               urlpatterns=patterns('misago.apps.admin.pruneusers.views',
-                        url(r'^$', 'List', name='admin_prune_users'),
-                        url(r'^new/$', 'New', name='admin_prune_users_new'),
-                        url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_prune_users_edit'),
-                        url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_prune_users_delete'),
-                        url(r'^apply/(?P<target>\d+)/$', 'Apply', name='admin_prune_users_apply'),
-                    ),
-               ),
-   AdminAction(
-               section='users',
-               id='newsletters',
-               name=_("Newsletters"),
-               help=_("Manage and send Newsletters"),
-               icon='envelope',
-               model=Newsletter,
-               actions=[
-                        {
-                         'id': 'list',
-                         'name': _("Browse Newsletters"),
-                         'help': _("Browse all existing Newsletters"),
-                         'route': 'admin_newsletters'
-                         },
-                        {
-                         'id': 'new',
-                         'name': _("New Newsletter"),
-                         'help': _("Create new Newsletter"),
-                         'route': 'admin_newsletters_new'
-                         },
-                        ],
-               route='admin_newsletters',
-               urlpatterns=patterns('misago.apps.admin.newsletters.views',
-                        url(r'^$', 'List', name='admin_newsletters'),
-                        url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_newsletters'),
-                        url(r'^new/$', 'New', name='admin_newsletters_new'),
-                        url(r'^send/(?P<target>\d+)/(?P<token>[a-zA-Z0-9]+)/$', 'send', name='admin_newsletters_send'),
-                        url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_newsletters_edit'),
-                        url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_newsletters_delete'),
-                    ),
-               ),
+    AdminAction(
+                section='users',
+                id='users',
+                name=_("Users List"),
+                help=_("Search and browse users"),
+                icon='user',
+                model=User,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Browse Users"),
+                          'help': _("Browse all registered user accounts"),
+                          'route': 'admin_users'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("Add User"),
+                          'help': _("Create new user account"),
+                          'route': 'admin_users_new'
+                          },
+                         ],
+                route='admin_users',
+                urlpatterns=patterns('misago.apps.admin.users.views',
+                         url(r'^$', 'List', name='admin_users'),
+                         url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_users'),
+                         url(r'^inactive/$', 'inactive', name='admin_users_inactive'),
+                         url(r'^new/$', 'New', name='admin_users_new'),
+                         url(r'^edit/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Edit', name='admin_users_edit'),
+                         url(r'^delete/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Delete', name='admin_users_delete'),
+                     ),
+                ),
+    AdminAction(
+                section='users',
+                id='ranks',
+                name=_("Ranks"),
+                help=_("Administrate User Ranks"),
+                icon='star',
+                model=Rank,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Browse Ranks"),
+                          'help': _("Browse all existing ranks"),
+                          'route': 'admin_ranks'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("Add Rank"),
+                          'help': _("Create new rank"),
+                          'route': 'admin_ranks_new'
+                          },
+                         ],
+                route='admin_ranks',
+                urlpatterns=patterns('misago.apps.admin.ranks.views',
+                         url(r'^$', 'List', name='admin_ranks'),
+                         url(r'^new/$', 'New', name='admin_ranks_new'),
+                         url(r'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_ranks_edit'),
+                         url(r'^delete/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Delete', name='admin_ranks_delete'),
+                     ),
+                ),
+    AdminAction(
+                section='users',
+                id='bans',
+                name=_("Bans"),
+                help=_("Ban or unban users from forums."),
+                icon='lock',
+                model=Ban,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Browse Bans"),
+                          'help': _("Browse all existing bans"),
+                          'route': 'admin_bans'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("Set Ban"),
+                          'help': _("Set new Ban"),
+                          'route': 'admin_bans_new'
+                          },
+                         ],
+                route='admin_bans',
+                urlpatterns=patterns('misago.apps.admin.bans.views',
+                         url(r'^$', 'List', name='admin_bans'),
+                         url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_bans'),
+                         url(r'^new/$', 'New', name='admin_bans_new'),
+                         url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_bans_edit'),
+                         url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_bans_delete'),
+                     ),
+                ),
+    AdminAction(
+                section='users',
+                id='prune_users',
+                name=_("Prune Users"),
+                help=_("Delete multiple Users"),
+                icon='remove',
+                model=PruningPolicy,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Pruning Policies"),
+                          'help': _("Browse all existing pruning policies"),
+                          'route': 'admin_prune_users'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("Set New Policy"),
+                          'help': _("Set new pruning policy"),
+                          'route': 'admin_prune_users_new'
+                          },
+                         ],
+                route='admin_prune_users',
+                urlpatterns=patterns('misago.apps.admin.pruneusers.views',
+                         url(r'^$', 'List', name='admin_prune_users'),
+                         url(r'^new/$', 'New', name='admin_prune_users_new'),
+                         url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_prune_users_edit'),
+                         url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_prune_users_delete'),
+                         url(r'^apply/(?P<target>\d+)/$', 'Apply', name='admin_prune_users_apply'),
+                     ),
+                ),
+    AdminAction(
+                section='users',
+                id='newsletters',
+                name=_("Newsletters"),
+                help=_("Manage and send Newsletters"),
+                icon='envelope',
+                model=Newsletter,
+                actions=[
+                         {
+                          'id': 'list',
+                          'name': _("Browse Newsletters"),
+                          'help': _("Browse all existing Newsletters"),
+                          'route': 'admin_newsletters'
+                          },
+                         {
+                          'id': 'new',
+                          'name': _("New Newsletter"),
+                          'help': _("Create new Newsletter"),
+                          'route': 'admin_newsletters_new'
+                          },
+                         ],
+                route='admin_newsletters',
+                urlpatterns=patterns('misago.apps.admin.newsletters.views',
+                         url(r'^$', 'List', name='admin_newsletters'),
+                         url(r'^(?P<page>[1-9]([0-9]+)?)/$', 'List', name='admin_newsletters'),
+                         url(r'^new/$', 'New', name='admin_newsletters_new'),
+                         url(r'^send/(?P<target>\d+)/(?P<token>[a-zA-Z0-9]+)/$', 'send', name='admin_newsletters_send'),
+                         url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_newsletters_edit'),
+                         url(r'^delete/(?P<target>\d+)/$', 'Delete', name='admin_newsletters_delete'),
+                     ),
+                ),
 )
 )

+ 0 - 15
misago/middleware/theme.py

@@ -1,24 +1,9 @@
 from django.conf import settings
 from django.conf import settings
 from django.core.cache import cache
 from django.core.cache import cache
 from misago.theme import Theme
 from misago.theme import Theme
-from misago.models import ThemeAdjustment
 
 
 class ThemeMiddleware(object):
 class ThemeMiddleware(object):
     def process_request(self, request):
     def process_request(self, request):
         if not settings.INSTALLED_THEMES:
         if not settings.INSTALLED_THEMES:
             raise ValueError('There are no themes installed!')
             raise ValueError('There are no themes installed!')
         request.theme = Theme(settings.INSTALLED_THEMES[0])
         request.theme = Theme(settings.INSTALLED_THEMES[0])
-        
-        # Adjust theme for specific client?
-        if request.META.get('HTTP_USER_AGENT'):
-            adjustments = cache.get('client_adjustments', 'nada')
-            if adjustments == 'nada':
-                adjustments = ThemeAdjustment.objects.all()
-                cache.set('client_adjustments', adjustments)
-            if adjustments:
-                user_agent = request.META.get('HTTP_USER_AGENT').lower()
-                for item in adjustments:
-                    if item.adjust_theme(user_agent):
-                        request.theme = Theme(item.theme)
-                        break
-            

+ 394 - 0
misago/migrations/0007_removethemeadjustments.py

@@ -0,0 +1,394 @@
+# -*- 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):
+        db.delete_table('misago_themeadjustment')
+
+    def backwards(self, orm):
+        db.create_table(u'misago_themeadjustment', (
+            ('theme', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
+            ('useragents', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+        ))
+        db.send_create_signal('misago', ['ThemeAdjustment'])
+
+    models = {
+        'misago.alert': {
+            'Meta': {'object_name': 'Alert'},
+            'date': ('django.db.models.fields.DateTimeField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']"}),
+            'variables': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
+        },
+        'misago.ban': {
+            'Meta': {'object_name': 'Ban'},
+            'ban': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'reason_admin': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'reason_user': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'test': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
+        },
+        'misago.change': {
+            'Meta': {'object_name': 'Change'},
+            'agent': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'change': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'date': ('django.db.models.fields.DateTimeField', [], {}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
+            'post': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Post']"}),
+            'post_content': ('django.db.models.fields.TextField', [], {}),
+            'reason': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Thread']"}),
+            'thread_name_new': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'thread_name_old': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'user_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'user_slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'misago.checkpoint': {
+            'Meta': {'object_name': 'Checkpoint'},
+            'action': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'agent': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'date': ('django.db.models.fields.DateTimeField', [], {}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
+            'old_forum': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['misago.Forum']"}),
+            'old_forum_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'old_forum_slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'post': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Post']"}),
+            'target_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.User']"}),
+            'target_user_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'target_user_slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Thread']"}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'user_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'user_slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'misago.fixture': {
+            'Meta': {'object_name': 'Fixture'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'misago.forum': {
+            'Meta': {'object_name': 'Forum'},
+            'attrs': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'description_preparsed': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_poster': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.User']"}),
+            'last_poster_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'last_poster_slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'last_poster_style': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'last_thread': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.Thread']"}),
+            'last_thread_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'last_thread_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'last_thread_slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'parent': ('mptt.fields.TreeForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['misago.Forum']"}),
+            'posts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'posts_delta': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'prune_last': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'prune_start': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'pruned_archive': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.Forum']"}),
+            'redirect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'redirects': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'redirects_delta': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'show_details': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
+            'special': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'style': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'threads': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'threads_delta': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '12'})
+        },
+        'misago.forumread': {
+            'Meta': {'object_name': 'ForumRead'},
+            'cleared': ('django.db.models.fields.DateTimeField', [], {}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']"})
+        },
+        'misago.forumrole': {
+            'Meta': {'object_name': 'ForumRole'},
+            '_permissions': ('django.db.models.fields.TextField', [], {'null': 'True', 'db_column': "'permissions'", 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'misago.karma': {
+            'Meta': {'object_name': 'Karma'},
+            'agent': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'date': ('django.db.models.fields.DateTimeField', [], {}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
+            'post': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Post']"}),
+            'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Thread']"}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'user_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'user_slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'misago.monitoritem': {
+            'Meta': {'object_name': 'MonitorItem'},
+            'id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'primary_key': 'True'}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
+        },
+        'misago.newsletter': {
+            'Meta': {'object_name': 'Newsletter'},
+            'content_html': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'content_plain': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ignore_subscriptions': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'progress': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'ranks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['misago.Rank']", 'symmetrical': 'False'}),
+            'step_size': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'token': ('django.db.models.fields.CharField', [], {'max_length': '32'})
+        },
+        'misago.post': {
+            'Meta': {'object_name': 'Post'},
+            'agent': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'checkpoints': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'date': ('django.db.models.fields.DateTimeField', [], {}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'downvotes': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'edit_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'edit_reason': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'edit_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.User']"}),
+            'edit_user_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'edit_user_slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'edits': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
+            'mentions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'mention_set'", 'symmetrical': 'False', 'to': "orm['misago.User']"}),
+            'merge': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'moderated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'post': ('django.db.models.fields.TextField', [], {}),
+            'post_preparsed': ('django.db.models.fields.TextField', [], {}),
+            'protected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'reported': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Thread']"}),
+            'upvotes': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'user_name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'misago.pruningpolicy': {
+            'Meta': {'object_name': 'PruningPolicy'},
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_visit': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'posts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'registered': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
+        },
+        'misago.rank': {
+            'Meta': {'object_name': 'Rank'},
+            'as_tab': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'criteria': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'on_index': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'roles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['misago.Role']", 'symmetrical': 'False'}),
+            'slug': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'special': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'style': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
+        },
+        'misago.role': {
+            'Meta': {'object_name': 'Role'},
+            '_permissions': ('django.db.models.fields.TextField', [], {'null': 'True', 'db_column': "'permissions'", 'blank': 'True'}),
+            '_special': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_column': "'special'", 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'protected': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'misago.session': {
+            'Meta': {'object_name': 'Session'},
+            'admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'agent': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'crawler': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'data': ('django.db.models.fields.TextField', [], {'db_column': "'session_data'"}),
+            'id': ('django.db.models.fields.CharField', [], {'max_length': '42', 'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
+            'last': ('django.db.models.fields.DateTimeField', [], {}),
+            'matched': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'rank': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sessions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.Rank']"}),
+            'start': ('django.db.models.fields.DateTimeField', [], {}),
+            'team': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sessions'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.User']"})
+        },
+        'misago.setting': {
+            'Meta': {'object_name': 'Setting'},
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'extra': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'field': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.SettingsGroup']", 'to_field': "'key'"}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'normalize_to': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'position': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'separator': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'setting': ('django.db.models.fields.CharField', [], {'max_length': '255', 'primary_key': 'True'}),
+            'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'value_default': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
+        },
+        'misago.settingsgroup': {
+            'Meta': {'object_name': 'SettingsGroup'},
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'misago.signinattempt': {
+            'Meta': {'object_name': 'SignInAttempt'},
+            'date': ('django.db.models.fields.DateTimeField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'})
+        },
+        'misago.thread': {
+            'Meta': {'object_name': 'Thread'},
+            'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'downvotes': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last': ('django.db.models.fields.DateTimeField', [], {}),
+            'last_post': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.Post']"}),
+            'last_poster': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.User']"}),
+            'last_poster_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'last_poster_slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'last_poster_style': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'merges': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'moderated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'participants': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'private_thread_set'", 'symmetrical': 'False', 'to': "orm['misago.User']"}),
+            'replies': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'replies_deleted': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'replies_moderated': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'replies_reported': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'score': ('django.db.models.fields.PositiveIntegerField', [], {'default': '30'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
+            'start': ('django.db.models.fields.DateTimeField', [], {}),
+            'start_post': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['misago.Post']"}),
+            'start_poster': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'start_poster_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'start_poster_slug': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
+            'start_poster_style': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'upvotes': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'weight': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
+        },
+        'misago.threadread': {
+            'Meta': {'object_name': 'ThreadRead'},
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Thread']"}),
+            'updated': ('django.db.models.fields.DateTimeField', [], {}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']"})
+        },
+        'misago.token': {
+            'Meta': {'object_name': 'Token'},
+            'accessed': ('django.db.models.fields.DateTimeField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {}),
+            'id': ('django.db.models.fields.CharField', [], {'max_length': '42', 'primary_key': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'signin_tokens'", 'to': "orm['misago.User']"})
+        },
+        'misago.user': {
+            'Meta': {'object_name': 'User'},
+            'acl_key': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}),
+            'activation': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'alerts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'alerts_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'allow_pds': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'avatar_ban': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'avatar_ban_reason_admin': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'avatar_ban_reason_user': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'avatar_image': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'avatar_original': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'avatar_temp': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'avatar_type': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '255'}),
+            'email_hash': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'}),
+            'followers': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'following': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'follows': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'follows_set'", 'symmetrical': 'False', 'to': "orm['misago.User']"}),
+            'hide_activity': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ignores': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'ignores_set'", 'symmetrical': 'False', 'to': "orm['misago.User']"}),
+            'is_team': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'join_agent': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'join_date': ('django.db.models.fields.DateTimeField', [], {}),
+            'join_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
+            'karma_given_n': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'karma_given_p': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'karma_n': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'karma_p': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'last_agent': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'last_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'last_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
+            'last_post': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'last_search': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'last_sync': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'password_date': ('django.db.models.fields.DateTimeField', [], {}),
+            'posts': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'rank': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Rank']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
+            'ranking': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'receive_newsletters': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'roles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['misago.Role']", 'symmetrical': 'False'}),
+            'score': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'signature': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'signature_ban': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'signature_ban_reason_admin': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'signature_ban_reason_user': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'signature_preparsed': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'subscribe_reply': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'subscribe_start': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'sync_pds': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'threads': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'timezone': ('django.db.models.fields.CharField', [], {'default': "'utc'", 'max_length': '255'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'token': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}),
+            'unread_pds': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'username': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'username_slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
+            'votes': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
+        },
+        'misago.usernamechange': {
+            'Meta': {'object_name': 'UsernameChange'},
+            'date': ('django.db.models.fields.DateTimeField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'old_username': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'namechanges'", 'to': "orm['misago.User']"})
+        },
+        'misago.watchedthread': {
+            'Meta': {'object_name': 'WatchedThread'},
+            'email': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Forum']"}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_read': ('django.db.models.fields.DateTimeField', [], {}),
+            'thread': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.Thread']"}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['misago.User']"})
+        }
+    }
+
+    complete_apps = ['misago']

+ 0 - 25
misago/models/themeadjustmentmodel.py

@@ -1,25 +0,0 @@
-from django.core.cache import cache
-from django.db import models
-from django.utils.translation import ugettext_lazy as _
-
-class ThemeAdjustment(models.Model):
-    theme = models.CharField(max_length=255, unique=True,
-                             error_messages={'unique': _("User agents for this theme are already defined.")})
-    useragents = models.TextField(null=True, blank=True)
-    
-    class Meta:
-        app_label = 'misago'
-
-    def adjust_theme(self, useragent):
-        for string in self.useragents.splitlines():
-            if string in useragent:
-                return True
-        return False
-    
-    def save(self, *args, **kwargs):
-        cache.delete('client_adjustments')
-        super(ThemeAdjustment, self).save(*args, **kwargs)
-
-    def delete(self, *args, **kwargs):
-        cache.delete('client_adjustments')
-        super(ThemeAdjustment, self).delete(*args, **kwargs)