1385: Этап №4 - Перенаправление URLов

remotes/origin/mobile_from_stage4
Alexander Burdeiny 10 years ago
parent d423922729
commit 8c632b6bcc
  1. 3
      expobanner/admin.py
  2. 6
      fabfile.py
  3. 52
      proj/admin.py
  4. 1
      proj/admin_urls.py
  5. 5
      proj/settings.py
  6. 0
      redirects/__init__.py
  7. 37
      redirects/admin.py
  8. 11
      redirects/admin_urls.py
  9. 20
      redirects/forms.py
  10. 6
      support/dev/settings.py
  11. 5
      support/prod/settings.py
  12. 9
      templates/admin/includes/admin_nav.html
  13. 38
      templates/admin/redirects/create_or_edit.html
  14. 37
      templates/admin/redirects/list.html

@ -222,6 +222,9 @@ class ParticipationCommentDelete(ParticipationMixin, CommentDelete):
pass
###############################################################################
# Other
###############################################################################
class PaidList(ListView):
expo = {
'model': Exposition,

6
fabfile.py vendored

@ -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)

@ -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')
return HttpResponse('error')

@ -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'),

@ -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',

@ -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)

@ -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<pk>\d+)/edit/$', RedirectUpdate.as_view(), name='redirects-edit'),
url(r'^(?P<pk>\d+)/delete/$', RedirectDelete.as_view(), name='redirects-delete'),
)

@ -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

@ -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',

@ -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',

@ -37,11 +37,11 @@
</li>
<li class="dropdown">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-wrench"></i> Настройки<b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/admin/country/all">Страна</a></li>
<li><a href="/admin/city/all">Город</a></li>
<li><a href="/admin/country/all">Страна</a></li>
<li><a href="/admin/city/all">Город</a></li>
<li><a href="/admin/theme/theme/all">Тематики</a></li>
{# <li><a href="/admin/theme/blog_theme/all">Тематики для блогов</a></li> #}
<li><a href="/admin/theme/tag/all">Теги</a></li>
@ -50,6 +50,7 @@
<li><a href="/admin/settings/main-page/">Главная страница</a></li>
<li><a href="/admin/meta/all/">Мета</a></li>
<li><a href="/admin/rosetta/">Перевод</a></li>
<li><a href="{% url 'redirects-list' %}">Редиректы</a></li>
<li class="divider"></li>
<li><a href="/admin/import-theme">Импорт тематик</a></li>
@ -58,7 +59,7 @@
<li class="divider"></li>
<li><a href="/admin/stats/">{% trans "Статистика разделов" %}</a></li>
<li><a href="/admin/stats/events/">{% trans "Статистика событий" %}</a></li>
</ul>
</ul>
</li>
<li class="dropdown">

@ -0,0 +1,38 @@
{% extends 'base.html' %}
{% load static %}
{% load i18n %}
{% block body %}
<form method="post" class="form-horizontal" action="."> {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>{{ form.verbose }}</h2>
</div>
<div class="box-content">
{% for field in form %}
<div class="control-group {% if field.errors %}error{% endif %}">
<label class="control-label"><b>{{ field.label }}:</b></label>
<div class="controls">{{ field }}
<span class="help-inline">{{ field.errors }}</span>
</div>
</div>
{% endfor %}
<div class="help-inline">
{% blocktrans %}
!!! Ссылки должны начинаться и заканчиваться знаком / (правый слэш)
<br>Работает только если по данному адресу 404.
{% endblocktrans %}
</div>
</div>
</div>
</fieldset>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Готово">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</form>
{% endblock %}

@ -0,0 +1,37 @@
{% extends 'base.html' %}
{% load i18n %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>{% trans "Список редиректов" %}</h2>
</div>
<div class="box-content">
{% block list_table %}
<a class="btn btn-success" href="{% url 'redirects-add' %}"><i class="icon-plus-sign icon-white"></i> {% trans "Добавить редирект" %}</a>
<table class="table table-hover">
<thead>
<tr>
<th>{% trans "Откуда" %}</th>
<th>{% trans "Куда" %}</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.old_path }}</td>
<td>{{ item.new_path }}</td>
<td><a class="btn btn-info" href="{% url 'redirects-edit' item.pk %}"><i class="icon-edit icon-white"></i>{% trans "Изменить" %}</a></td>
<td><a class="btn btn-danger delete" href="{% url 'redirects-delete' item.pk %}"><i class="icon-trash icon-white"></i>{% trans "Удалить" %}</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=page_obj %}
</div>
{% endblock %}
Loading…
Cancel
Save