views.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from django.core.cache import cache
  2. from django.core.urlresolvers import reverse
  3. from django.shortcuts import redirect
  4. from django.template import RequestContext
  5. from django.utils.translation import ungettext, ugettext as _
  6. from misago.forms import Form, FormLayout, FormFields
  7. from misago.messages import Message
  8. from misago.search import SearchQuery, SearchException
  9. from misago.models import SettingsGroup, Setting
  10. from misago.apps.errors import error404
  11. from misago.apps.admin.settings.forms import SearchForm
  12. def settings(request, group_id=None, group_slug=None):
  13. # Load groups and find selected group
  14. settings_groups = SettingsGroup.objects.all().order_by('key')
  15. if not group_id:
  16. active_group = settings_groups[0]
  17. group_id = active_group.pk
  18. else:
  19. group_id = int(group_id)
  20. for group in settings_groups:
  21. if group.pk == group_id:
  22. active_group = group
  23. break
  24. else:
  25. return error404(request, _('Requested settings group could not be found.'))
  26. # Load selected group settings and turn them into form
  27. group_settings = Setting.objects.filter(group=active_group).order_by('position')
  28. last_fieldset = (None, [])
  29. group_form = {'layout': []}
  30. for setting in group_settings:
  31. # New field subgroup?
  32. if setting.separator and last_fieldset[0] != setting.separator:
  33. if last_fieldset[0]:
  34. group_form['layout'].append(last_fieldset)
  35. last_fieldset = (_(setting.separator), [])
  36. last_fieldset[1].append(setting.pk)
  37. group_form[setting.pk] = setting.get_field()
  38. group_form['layout'].append(last_fieldset)
  39. SettingsGroupForm = type('SettingsGroupForm', (Form,), group_form)
  40. #Submit form
  41. message = request.messages.get_message('admin_settings')
  42. if request.method == 'POST':
  43. form = SettingsGroupForm(request.POST, request=request)
  44. if form.is_valid():
  45. for setting in form.cleaned_data.keys():
  46. request.settings[setting] = form.cleaned_data[setting]
  47. cache.delete('settings')
  48. request.messages.set_flash(Message(_('Configuration has been changed.')), 'success', 'admin_settings')
  49. return redirect(reverse('admin_settings', kwargs={
  50. 'group_id': active_group.pk,
  51. 'group_slug': active_group.key,
  52. }))
  53. else:
  54. message = Message(form.non_field_errors()[0], 'error')
  55. else:
  56. form = SettingsGroupForm(request=request)
  57. # Display settings group form
  58. return request.theme.render_to_response('settings/settings.html',
  59. {
  60. 'message': message,
  61. 'groups': settings_groups,
  62. 'active_group': active_group,
  63. 'search_form': FormFields(SearchForm(request=request)),
  64. 'form': FormLayout(form),
  65. 'raw_form': form,
  66. },
  67. context_instance=RequestContext(request));
  68. def settings_search(request):
  69. settings_groups = SettingsGroup.objects.all().order_by('key')
  70. message = None
  71. found_settings = []
  72. try:
  73. if request.method == 'POST' and request.csrf.request_secure(request):
  74. form = SearchForm(request.POST, request=request)
  75. if form.is_valid():
  76. # Start search
  77. search_strings = SearchQuery(form.cleaned_data['search_text'])
  78. # Loop over groups using our search query
  79. for setting in Setting.objects.all().order_by('setting'):
  80. if (search_strings.search(_(setting.name))
  81. or (setting.description and search_strings.search(_(setting.description)))
  82. or (setting.value and search_strings.search(setting.value))):
  83. found_settings.append(setting)
  84. # Scream if nothing could be found
  85. if found_settings:
  86. message = Message(ungettext(
  87. 'One setting that matches search criteria has been found.',
  88. '%(count)d settings that match search criteria have been found.',
  89. len(found_settings)) % {
  90. 'count': len(found_settings),
  91. }, 'success')
  92. else:
  93. raise SearchException(_('No settings that match search criteria have been found.'))
  94. else:
  95. raise SearchException(_('Search query is empty.'))
  96. else:
  97. raise SearchException(_('Search query is invalid.'))
  98. except SearchException as e:
  99. message = Message(unicode(e), 'error')
  100. return request.theme.render_to_response('settings/search_results.html',
  101. {
  102. 'message': message,
  103. 'groups': settings_groups,
  104. 'active_group': None,
  105. 'found_settings': found_settings,
  106. 'search_form': FormFields(form),
  107. },
  108. context_instance=RequestContext(request));