Просмотр исходного кода

ACP's system section refactored

Ralfp 12 лет назад
Родитель
Сommit
6fb5d9354d

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


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

@@ -0,0 +1,51 @@
+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']

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

@@ -0,0 +1,110 @@
+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.core.admin.widgets import *
+from misago.forms import Form
+from misago.models import ThemeAdjustment
+from misago.utils.strings import slugify
+from misago.core.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

+ 20 - 20
misago/core/admin/sections/__init__.py

@@ -7,27 +7,27 @@ ADMIN_SECTIONS = (
                  name=_("Overview"),
                  name=_("Overview"),
                  icon='signal',
                  icon='signal',
                  ),
                  ),
+    AdminSection(
+                 id='system',
+                 name=_("System"),
+                 icon='cog',
+                 ),
 )
 )
 
 
 """
 """
-AdminSection(
-             id='users',
-             name=_("Users"),
-             icon='user',
-             ),
-AdminSection(
-             id='forums',
-             name=_("Forums"),
-             icon='comment',
-             ),
-AdminSection(
-             id='perms',
-             name=_("Permissions"),
-             icon='adjust',
-             ),
-AdminSection(
-             id='system',
-             name=_("System"),
-             icon='cog',
-             ),
+    AdminSection(
+                 id='users',
+                 name=_("Users"),
+                 icon='user',
+                 ),
+    AdminSection(
+                 id='forums',
+                 name=_("Forums"),
+                 icon='comment',
+                 ),
+    AdminSection(
+                 id='perms',
+                 name=_("Permissions"),
+                 icon='adjust',
+                 ),
 """
 """

+ 2 - 2
misago/core/admin/sections/system.py

@@ -11,7 +11,7 @@ ADMIN_ACTIONS = (
                help=_("Change your forum configuration"),
                help=_("Change your forum configuration"),
                icon='wrench',
                icon='wrench',
                route='admin_settings',
                route='admin_settings',
-               urlpatterns=patterns('misago.settings.views',
+               urlpatterns=patterns('misago.core.admin.settings.views',
                         url(r'^$', 'settings', name='admin_settings'),
                         url(r'^$', 'settings', name='admin_settings'),
                         url(r'^search/$', 'settings_search', name='admin_settings_search'),
                         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')
                         url(r'^(?P<group_slug>([a-z0-9]|-)+)-(?P<group_id>\d+)/$', 'settings', name='admin_settings')
@@ -39,7 +39,7 @@ ADMIN_ACTIONS = (
                          },
                          },
                         ],
                         ],
                route='admin_clients',
                route='admin_clients',
-               urlpatterns=patterns('misago.themes.views',
+               urlpatterns=patterns('misago.core.admin.clients.views',
                         url(r'^$', 'List', name='admin_clients'),
                         url(r'^$', 'List', name='admin_clients'),
                         url(r'^new/$', 'New', name='admin_clients_new'),
                         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'^edit/(?P<slug>([a-z0-9]|-)+)-(?P<target>\d+)/$', 'Edit', name='admin_clients_edit'),

+ 0 - 0
misago/core/admin/settings/__init__.py


+ 5 - 0
misago/core/admin/settings/forms.py

@@ -0,0 +1,5 @@
+from django import forms
+from misago.forms import Form
+
+class SearchForm(Form):
+    search_text = forms.CharField(max_length=255)

+ 114 - 0
misago/core/admin/settings/views.py

@@ -0,0 +1,114 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.template import RequestContext
+from django.utils.translation import ungettext, ugettext as _
+from misago.forms import Form, FormLayout, FormFields
+from misago.messages import Message
+from misago.search import SearchQuery, SearchException
+from misago.models import SettingsGroup, Setting
+from misago.core.views import error404
+from misago.core.admin.settings.forms import SearchForm
+
+def settings(request, group_id=None, group_slug=None):
+    # Load groups and find selected group
+    settings_groups = SettingsGroup.objects.all().order_by('key')
+    if not group_id:
+        active_group = settings_groups[0]
+        group_id = active_group.pk
+    else:
+        group_id = int(group_id)
+        for group in settings_groups:
+            if group.pk == group_id:
+                active_group = group
+                break
+        else:
+            return error404(request, _('The requested settings group could not be found.'))
+
+    # Load selected group settings and turn them into form
+    group_settings = Setting.objects.filter(group=active_group).order_by('position')
+    last_fieldset = (None, [])
+    group_form = {'layout': []}
+    for setting in group_settings:
+        # New field subgroup?
+        if setting.separator and last_fieldset[0] != setting.separator:
+            if last_fieldset[0]:
+                group_form['layout'].append(last_fieldset)
+            last_fieldset = (_(setting.separator), [])
+        last_fieldset[1].append(setting.pk)
+        group_form[setting.pk] = setting.get_field()
+    group_form['layout'].append(last_fieldset)
+    SettingsGroupForm = type('SettingsGroupForm', (Form,), group_form)
+
+    #Submit form
+    message = request.messages.get_message('admin_settings')
+    if request.method == 'POST':
+        form = SettingsGroupForm(request.POST, request=request)
+        if form.is_valid():
+            for setting in form.cleaned_data.keys():
+                request.settings[setting] = form.cleaned_data[setting]
+            request.messages.set_flash(Message(_('Configuration have been saved.')), 'success', 'admin_settings')
+            return redirect(reverse('admin_settings', kwargs={
+                                                       'group_id': active_group.pk,
+                                                       'group_slug': active_group.key,
+                                                       }))
+        else:
+            message = Message(form.non_field_errors()[0], 'error')
+    else:
+        form = SettingsGroupForm(request=request)
+
+    # Display settings group form      
+    return request.theme.render_to_response('settings/settings.html',
+                                            {
+                                            'message': message,
+                                            'groups': settings_groups,
+                                            'active_group': active_group,
+                                            'search_form': FormFields(SearchForm(request=request)),
+                                            'form': FormLayout(form),
+                                            'raw_form': form,
+                                            },
+                                            context_instance=RequestContext(request));
+
+
+def settings_search(request):
+    settings_groups = SettingsGroup.objects.all().order_by('key')
+    message = None
+    found_settings = []
+    try:
+        if request.method == 'POST' and request.csrf.request_secure(request):
+            form = SearchForm(request.POST, request=request)
+            if form.is_valid():
+                # Start search
+                search_strings = SearchQuery(form.cleaned_data['search_text'])
+
+                # Loop over groups using our search query
+                for setting in Setting.objects.all().order_by('setting'):
+                    if (search_strings.search(_(setting.name))
+                        or (setting.description and search_strings.search(_(setting.description)))
+                        or (setting.value and search_strings.search(setting.value))):
+                        found_settings.append(setting)
+
+                # Scream if nothing could be found
+                if found_settings:
+                    message = Message(ungettext(
+                                                    'One setting that match search criteria has been found.',
+                                                    '%(count)d settings that match search criteria have been found.',
+                                                len(found_settings)) % {
+                                                    'count': len(found_settings),
+                                                }, 'success')
+                else:
+                    raise SearchException(_('No settings that match search criteria has been found.'))
+            else:
+                raise SearchException(_('Search query is empty.'))
+        else:
+            raise SearchException(_('Search query is invalid.'))
+    except SearchException as e:
+        message = Message(e.message, 'error')
+    return request.theme.render_to_response('settings/search_results.html',
+                                    {
+                                    'message': message,
+                                    'groups': settings_groups,
+                                    'active_group': None,
+                                    'found_settings': found_settings,
+                                    'search_form': FormFields(form),
+                                    },
+                                    context_instance=RequestContext(request));

+ 1 - 1
misago/markdown/extensions/mentions.py

@@ -3,7 +3,7 @@ import markdown
 from markdown.util import etree
 from markdown.util import etree
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from misago.models import User
 from misago.models import User
-from misago.utils import slugify
+from misago.utils.strings import slugify
 
 
 # Global vars
 # Global vars
 MENTION_RE = re.compile(r'([^\w]?)@(?P<username>(\w)+)', re.UNICODE)
 MENTION_RE = re.compile(r'([^\w]?)@(?P<username>(\w)+)', re.UNICODE)