diff --git a/expobanner/admin.py b/expobanner/admin.py index 6c486465..77424918 100644 --- a/expobanner/admin.py +++ b/expobanner/admin.py @@ -222,6 +222,9 @@ class ParticipationCommentDelete(ParticipationMixin, CommentDelete): pass +############################################################################### +# Other +############################################################################### class PaidList(ListView): expo = { 'model': Exposition, diff --git a/fabfile.py b/fabfile.py index c57c10ff..15f8786e 100644 --- a/fabfile.py +++ b/fabfile.py @@ -76,10 +76,12 @@ def chown(): run('chown -Rv www-data:www-data .') -def pull(): +def pull(with_configs=False): with cd(REMOTE_HOME_DIR): call_state('stop', only='apache2') run('git pull') + if with_configs: + put_configs() call_state('start', only='apache2') @@ -131,4 +133,4 @@ def stage4(): with cd(REMOTE_HOME_DIR): run('git fetch') run('git checkout stage4') - pull() + pull(with_configs=True) diff --git a/proj/admin.py b/proj/admin.py index 7c8afd82..b6ebdf86 100644 --- a/proj/admin.py +++ b/proj/admin.py @@ -1,20 +1,22 @@ # -*- coding: utf-8 -*- -from django.shortcuts import render_to_response -from django.http import HttpResponseRedirect, HttpResponse, Http404 -from django.contrib.contenttypes.models import ContentType -from django.conf import settings -from django.views.generic import TemplateView, DeleteView -from file.models import TmpFile, FileModel -from file.forms import FileModelForm, FileForm -from city.models import City -from theme.models import Tag +import datetime +import json + from article.models import Article +from city.models import City +from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.core.context_processors import csrf from django.db.models.loading import get_model - - - - - +from django.http import Http404, HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response +from django.views.generic import DeleteView, TemplateView +from exposition.forms import StatisticForm, TimeTableForm +from exposition.models import Exposition, Statistic, TimeTable, TmpTimeTable +from file.forms import FileForm, FileModelForm, PhotoForm +from file.models import FileModel, Photo, TmpFile +from functions import datetime_handler +from theme.models import Tag class AdminIndex(TemplateView): @@ -96,7 +98,8 @@ def ajax_post_file(request, obj_id=None): args['file_form'] = file_form return render_to_response('ajax_error_form.html', args) ''' -from django.core.context_processors import csrf + + def ajax_post_file(request, obj_id=None): """ Takes file and file data and save it @@ -117,7 +120,6 @@ def ajax_post_file(request, obj_id=None): files = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(obj),object_id=getattr(obj, 'id')) - return render_to_response('file_list.html', {'files' : files}) else: args = {} @@ -131,10 +133,6 @@ def ajax_post_file(request, obj_id=None): raise Http404 - -from file.forms import PhotoForm -from file.models import Photo - def ajax_post_photo(request, obj_id=None): if request.POST: photo_form = PhotoForm(request.POST, request.FILES) @@ -157,11 +155,6 @@ def ajax_post_photo(request, obj_id=None): args['file_form'] = photo_form return render_to_response('ajax_error_form.html', args) -from exposition.models import Exposition, TimeTable, TmpTimeTable -from exposition.forms import TimeTableForm -import json, datetime -from functions import datetime_handler - def ajax_post_timetable(request, obj_id=None): if request.GET: @@ -183,8 +176,8 @@ def ajax_post_timetable(request, obj_id=None): else: return HttpResponse('error') -from exposition.models import Statistic -from exposition.forms import StatisticForm + + def ajax_post_stat(request, obj_id=None): response = {'success': False} if request.GET: @@ -200,6 +193,7 @@ def ajax_post_stat(request, obj_id=None): return HttpResponse(json.dumps(response), content_type='application/json') + def ajax_delete_stat(request, id): redirect_to = request.META.get('HTTP_REFERER') @@ -214,8 +208,6 @@ def ajax_delete_stat(request, id): return HttpResponseRedirect(redirect_to) - - def ajax_delete_timetable(request): if request.GET: id = request.GET.get('id') @@ -237,4 +229,4 @@ def ajax_delete_file(request): file.delete() return HttpResponse('success') else: - return HttpResponse('error') \ No newline at end of file + return HttpResponse('error') diff --git a/proj/admin_urls.py b/proj/admin_urls.py index 83cceb30..72049c19 100644 --- a/proj/admin_urls.py +++ b/proj/admin_urls.py @@ -38,6 +38,7 @@ urlpatterns = required( url(r'^newsletters/', include('emencia.django.newsletter.admin_urls')), url(r'^stats/', include('stats_collector.admin_urls')), url(r'^rosetta/', include('rosetta.urls')), + url(r'^redirects/', include('redirects.admin_urls')), url(r'^language/add/', 'directories.admin.language_add'), url(r'^currency/add/', 'directories.admin.currency_add'), diff --git a/proj/settings.py b/proj/settings.py index dab660aa..0a3f78ac 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -157,7 +157,8 @@ MIDDLEWARE_CLASSES = ( 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', # 'django.middleware.cache.FetchFromCacheMiddleware', # Uncomment the next line for simple clickjacking protection: - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', ) @@ -320,12 +321,14 @@ INSTALLED_APPS = ( 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', + 'django.contrib.redirects', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', 'django.contrib.sitemaps', 'haystack', #custom modules + 'redirects', 'stats_collector', 'emencia.django.newsletter', 'accounts', diff --git a/redirects/__init__.py b/redirects/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/redirects/admin.py b/redirects/admin.py new file mode 100644 index 00000000..b12f3c50 --- /dev/null +++ b/redirects/admin.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from django.contrib.redirects.models import Redirect +from django.views.generic import CreateView, DeleteView, ListView, UpdateView +from django.core.urlresolvers import reverse_lazy + +from .forms import RedirectForm + + +############################################################################### +# Redirects +############################################################################### +class RedirectMixin(object): + form_class = RedirectForm + model = Redirect + template_name = 'admin/redirects/create_or_edit.html' + success_url = reverse_lazy('redirects-list') + + def get_success_url(self): + return self.success_url + + +class RedirectList(RedirectMixin, ListView): + template_name = 'admin/redirects/list.html' + + +class RedirectCreate(RedirectMixin, CreateView): + pass + + +class RedirectUpdate(RedirectMixin, UpdateView): + pass + + +class RedirectDelete(RedirectMixin, DeleteView): + def get(self, request, *args, **kwargs): + return self.post(request, *args, **kwargs) + diff --git a/redirects/admin_urls.py b/redirects/admin_urls.py new file mode 100644 index 00000000..50c5f027 --- /dev/null +++ b/redirects/admin_urls.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import patterns, url +from .admin import * + + +urlpatterns = patterns('redirects.admin', + url(r'^$', RedirectList.as_view(), name='redirects-list'), + url(r'^add/$', RedirectCreate.as_view(), name='redirects-add'), + url(r'^(?P\d+)/edit/$', RedirectUpdate.as_view(), name='redirects-edit'), + url(r'^(?P\d+)/delete/$', RedirectDelete.as_view(), name='redirects-delete'), +) diff --git a/redirects/forms.py b/redirects/forms.py new file mode 100644 index 00000000..56d78e6c --- /dev/null +++ b/redirects/forms.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.contrib.redirects.models import Redirect +from django.conf import settings +from django.contrib.redirects.admin import RedirectAdmin +from django.utils.translation import ugettext as _ + + +class RedirectForm(forms.ModelForm): + verbose = _(u'Создание/редактирование редиректа') + class Meta: + model = Redirect + fields = ['old_path', 'new_path'] + + def save(self, commit=True): + obj = super(RedirectForm, self).save(commit=False) + obj.site_id = settings.SITE_ID + if commit: + obj.save() + return obj diff --git a/support/dev/settings.py b/support/dev/settings.py index 0127afe9..2cd88eeb 100644 --- a/support/dev/settings.py +++ b/support/dev/settings.py @@ -157,8 +157,8 @@ MIDDLEWARE_CLASSES = ( 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', # 'django.middleware.cache.FetchFromCacheMiddleware', # Uncomment the next line for simple clickjacking protection: - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', ) @@ -320,12 +320,14 @@ INSTALLED_APPS = ( 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', + 'django.contrib.redirects', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', 'django.contrib.sitemaps', 'haystack', #custom modules + 'redirects', 'stats_collector', 'emencia.django.newsletter', 'accounts', diff --git a/support/prod/settings.py b/support/prod/settings.py index 1716a017..c54773cc 100644 --- a/support/prod/settings.py +++ b/support/prod/settings.py @@ -157,7 +157,8 @@ MIDDLEWARE_CLASSES = ( 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', # 'django.middleware.cache.FetchFromCacheMiddleware', # Uncomment the next line for simple clickjacking protection: - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', ) @@ -320,12 +321,14 @@ INSTALLED_APPS = ( 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', + 'django.contrib.redirects', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', 'django.contrib.sitemaps', 'haystack', #custom modules + 'redirects', 'stats_collector', 'emencia.django.newsletter', 'accounts', diff --git a/templates/admin/includes/admin_nav.html b/templates/admin/includes/admin_nav.html index 56cc65a4..58075bc0 100644 --- a/templates/admin/includes/admin_nav.html +++ b/templates/admin/includes/admin_nav.html @@ -37,11 +37,11 @@ -