kopia lustrzana https://github.com/wagtail/wagtail
Merge branch 'wagtail-separation' into staging
commit
fbdcab4f87
|
@ -18,7 +18,7 @@
|
|||
<li class="more">
|
||||
<a href="#" class="icon icon-arrow-down">More</a>
|
||||
<ul>
|
||||
<li class="menu-redirects"><a href="{% url 'verdantredirects_index' %}" class="icon icon-redirect">Redirects</a></li>
|
||||
<li class="menu-redirects"><a href="{% url 'wagtailredirects_index' %}" class="icon icon-redirect">Redirects</a></li>
|
||||
<li class="menu-editorspicks"><a href="{% url 'verdantsearch_editorspicks_index' %}">Editors Picks</a></li>
|
||||
{% get_wagtailadmin_tab_urls as wagtailadmin_tab_urls %}
|
||||
{% for name, title in wagtailadmin_tab_urls %}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
from django import forms
|
||||
|
||||
import models
|
||||
|
||||
|
||||
class RedirectForm(forms.ModelForm):
|
||||
required_css_class = "required"
|
||||
|
||||
class Meta:
|
||||
model = models.Redirect
|
|
@ -0,0 +1,27 @@
|
|||
from django import http
|
||||
|
||||
import models
|
||||
|
||||
|
||||
# Originally pinched from: https://github.com/django/django/blob/master/django/contrib/redirects/middleware.py
|
||||
class RedirectMiddleware(object):
|
||||
def process_response(self, request, response):
|
||||
# No need to check for a redirect for non-404 responses.
|
||||
if response.status_code != 404:
|
||||
return response
|
||||
|
||||
# Get the path
|
||||
path = models.Redirect.normalise_path(request.get_full_path())
|
||||
|
||||
# Find redirect
|
||||
try:
|
||||
redirect = models.Redirect.get_for_site(request.site).get(old_path=path)
|
||||
|
||||
if redirect.is_permanent:
|
||||
return http.HttpResponsePermanentRedirect(redirect.link)
|
||||
else:
|
||||
return http.HttpResponseTemporaryRedirect(redirect.link)
|
||||
except:
|
||||
pass
|
||||
|
||||
return response
|
|
@ -0,0 +1,106 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
depends_on = (
|
||||
("wagtailcore", "0002_initial_data"),
|
||||
)
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'Redirect'
|
||||
db.create_table(u'wagtailredirects_redirect', (
|
||||
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('old_path', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255, db_index=True)),
|
||||
('site', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='redirects', null=True, to=orm['wagtailcore.Site'])),
|
||||
('is_permanent', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
('redirect_page', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='+', null=True, to=orm['wagtailcore.Page'])),
|
||||
('redirect_link', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)),
|
||||
))
|
||||
db.send_create_signal(u'wagtailredirects', ['Redirect'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'Redirect'
|
||||
db.delete_table(u'wagtailredirects_redirect')
|
||||
|
||||
|
||||
models = {
|
||||
u'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
u'wagtailcore.page': {
|
||||
'Meta': {'object_name': 'Page'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pages'", 'to': u"orm['contenttypes.ContentType']"}),
|
||||
'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
|
||||
'feed_image': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': u"orm['rca.RcaImage']"}),
|
||||
'has_unpublished_changes': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'live': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
|
||||
'seo_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'show_in_menus': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'url_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
|
||||
},
|
||||
u'wagtailcore.site': {
|
||||
'Meta': {'object_name': 'Site'},
|
||||
'hostname': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_default_site': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'port': ('django.db.models.fields.IntegerField', [], {'default': '80'}),
|
||||
'root_page': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sites_rooted_here'", 'to': u"orm['wagtailcore.Page']"})
|
||||
},
|
||||
u'rca.rcaimage': {
|
||||
'Meta': {'object_name': 'RcaImage'},
|
||||
'alt': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'creator': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'dimensions': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'eprint_docid': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'file': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
|
||||
'height': ('django.db.models.fields.IntegerField', [], {}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'medium': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'permission': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'photographer': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'rca_content_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'width': ('django.db.models.fields.IntegerField', [], {}),
|
||||
'year': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
|
||||
},
|
||||
u'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'})
|
||||
},
|
||||
u'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"})
|
||||
},
|
||||
u'wagtailredirects.redirect': {
|
||||
'Meta': {'object_name': 'Redirect'},
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_permanent': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'old_path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
|
||||
'redirect_link': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
|
||||
'redirect_page': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': u"orm['wagtailcore.Page']"}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'redirects'", 'null': 'True', 'to': u"orm['wagtailcore.Site']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['wagtailredirects']
|
|
@ -0,0 +1,72 @@
|
|||
from django.db import models
|
||||
from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, PageChooserPanel
|
||||
|
||||
|
||||
class Redirect(models.Model):
|
||||
old_path = models.CharField("Redirect from",max_length=255, unique=True, db_index=True)
|
||||
site = models.ForeignKey('wagtailcore.Site', null=True, blank=True, related_name='redirects', db_index=True, editable=False)
|
||||
is_permanent = models.BooleanField("Permanent", default=True, help_text="Recommended. Permanent redirects ensure search engines forget the old page (the 'Redirect from') and index the new page instead.")
|
||||
redirect_page = models.ForeignKey('wagtailcore.Page', verbose_name="Redirect to a page", related_name='+', null=True, blank=True)
|
||||
redirect_link = models.URLField("Redirect to any URL", blank=True)
|
||||
|
||||
@property
|
||||
def title(self):
|
||||
return self.old_path
|
||||
|
||||
@property
|
||||
def link(self):
|
||||
if self.redirect_page:
|
||||
return self.redirect_page.url
|
||||
else:
|
||||
return self.redirect_link
|
||||
|
||||
def get_is_permanent_display(self):
|
||||
if self.is_permanent:
|
||||
return "permanent"
|
||||
else:
|
||||
return "temporary"
|
||||
|
||||
@classmethod
|
||||
def get_for_site(cls, site=None):
|
||||
if site:
|
||||
return cls.objects.filter(models.Q(site=site) | models.Q(site=None))
|
||||
else:
|
||||
return cls.objects.all()
|
||||
|
||||
@staticmethod
|
||||
def normalise_path(full_path):
|
||||
# Split full_path into path and query_string
|
||||
try:
|
||||
question_mark = full_path.index('?')
|
||||
path = full_path[:question_mark]
|
||||
query_string = full_path[question_mark:]
|
||||
except ValueError:
|
||||
path = full_path
|
||||
query_string = ''
|
||||
|
||||
# Check that the path has content before normalising
|
||||
if path is None or path == '':
|
||||
return query_string
|
||||
|
||||
# Make sure theres a '/' at the beginning
|
||||
if path[0] != '/':
|
||||
path = '/' + path
|
||||
|
||||
# Make sure theres not a '/' at the end
|
||||
if path[-1] == '/':
|
||||
path = path[:-1]
|
||||
|
||||
return path + query_string
|
||||
|
||||
def clean(self):
|
||||
# Normalise old path
|
||||
self.old_path = Redirect.normalise_path(self.old_path)
|
||||
|
||||
Redirect.content_panels = [
|
||||
MultiFieldPanel([
|
||||
FieldPanel('old_path'),
|
||||
FieldPanel('is_permanent'),
|
||||
PageChooserPanel('redirect_page'),
|
||||
FieldPanel('redirect_link'),
|
||||
])
|
||||
]
|
|
@ -0,0 +1,23 @@
|
|||
{% extends "wagtailadmin/base.html" %}
|
||||
{% block titletag %}Add redirect{% endblock %}
|
||||
{% block content %}
|
||||
<header>
|
||||
<h1>Add redirect</h1>
|
||||
</header>
|
||||
|
||||
<form action="{% url 'wagtailredirects_add_redirect' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
{{ edit_handler.render_form_content }}
|
||||
|
||||
<div class="nice-padding">
|
||||
<input type="submit" value="Save" />
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
{% include "wagtailadmin/pages/_editor_css.html" %}
|
||||
{% endblock %}
|
||||
{% block extra_js %}
|
||||
{% include "wagtailadmin/pages/_editor_js.html" %}
|
||||
{% endblock %}
|
|
@ -0,0 +1,15 @@
|
|||
{% extends "wagtailadmin/base.html" %}
|
||||
|
||||
{% block titletag %}Delete redirect {{ redirect.title }}{% endblock %}
|
||||
{% block content %}
|
||||
<header>
|
||||
<h1>Delete <span>{{ redirect.title }}</span></h1>
|
||||
</header>
|
||||
<div class="row row-flush nice-padding">
|
||||
<p>Are you sure you want to delete this redirect?</p>
|
||||
<form action="{% url 'wagtailredirects_delete_redirect' redirect.id %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<input type="submit" value="Yes, delete" class="serious" />
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -0,0 +1,24 @@
|
|||
{% extends "wagtailadmin/base.html" %}
|
||||
{% block titletag %}Editing {{ redirect.title }}{% endblock %}
|
||||
{% block content %}
|
||||
<header>
|
||||
<h1>Editing <span>{{ redirect.title }}</span></h1>
|
||||
</header>
|
||||
|
||||
<form action="{% url 'wagtailredirects_edit_redirect' redirect.id %}" method="POST">
|
||||
{% csrf_token %}
|
||||
{{ edit_handler.render_form_content }}
|
||||
|
||||
<div class="nice-padding">
|
||||
<input type="submit" value="Save" />
|
||||
<a href="{% url 'wagtailredirects_delete_redirect' redirect.id %}" class="button button-secondary no">Delete redirect</a>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
{% include "wagtailadmin/pages/_editor_css.html" %}
|
||||
{% endblock %}
|
||||
{% block extra_js %}
|
||||
{% include "wagtailadmin/pages/_editor_js.html" %}
|
||||
{% endblock %}
|
|
@ -0,0 +1,50 @@
|
|||
{% extends "wagtailadmin/base.html" %}
|
||||
{% block titletag %}Redirects{% endblock %}
|
||||
{% block bodyclass %}page-explorer{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<header>
|
||||
<div class="row row-flush">
|
||||
<div class="left col9">
|
||||
<h1>Redirects</h1>
|
||||
</div>
|
||||
<div class="right col3">
|
||||
<a href="{% url 'wagtailredirects_add_redirect' %}" class="button icon icon-plus-inverse">Add redirect</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<table class="listing full-width">
|
||||
<col />
|
||||
<col width="40%"/>
|
||||
<col />
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="title">From</th>
|
||||
<th>To</th>
|
||||
<th class="type">Type</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% if redirects %}
|
||||
{% for redirect in redirects %}
|
||||
<tr>
|
||||
<td class="title">
|
||||
<h2><a href="{% url 'wagtailredirects_edit_redirect' redirect.id %}" title="Edit this redirect">{{ redirect.title }}</a></h2>
|
||||
</td>
|
||||
<td>
|
||||
{% if redirect.redirect_page %}
|
||||
<a href="{% url 'wagtailadmin_pages_edit' redirect.redirect_page.id %}" class="nolink">{{ redirect.redirect_page.title }}</a>
|
||||
{% else %}
|
||||
{{ redirect.link }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="type"><div class="status-tag {% if redirect.get_is_permanent_display = "permanent" %}primary{% endif %}">{{ redirect.get_is_permanent_display }}</div></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<tr><td colspan="3" class="no-results-message"><p>No redirects have been added. Why not <a href="{% url 'wagtailredirects_add_redirect' %}">add one</a>?</td></tr>
|
||||
{% endif %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
|
@ -0,0 +1,16 @@
|
|||
"""
|
||||
This file demonstrates writing tests using the unittest module. These will pass
|
||||
when you run "manage.py test".
|
||||
|
||||
Replace this with more appropriate tests for your application.
|
||||
"""
|
||||
|
||||
from django.test import TestCase
|
||||
|
||||
|
||||
class SimpleTest(TestCase):
|
||||
def test_basic_addition(self):
|
||||
"""
|
||||
Tests that 1 + 1 always equals 2.
|
||||
"""
|
||||
self.assertEqual(1 + 1, 2)
|
|
@ -0,0 +1,9 @@
|
|||
from django.conf.urls import patterns, url
|
||||
|
||||
|
||||
urlpatterns = patterns('wagtail.wagtailredirects.views',
|
||||
url(r'^$', 'index', name='wagtailredirects_index'),
|
||||
url(r'^(\d+)/$', 'edit', name='wagtailredirects_edit_redirect'),
|
||||
url(r'^(\d+)/delete/$', 'delete', name='wagtailredirects_delete_redirect'),
|
||||
url(r'^add/$', 'add', name='wagtailredirects_add_redirect'),
|
||||
)
|
|
@ -0,0 +1,85 @@
|
|||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
from django.contrib import messages
|
||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from wagtail.wagtailadmin.edit_handlers import ObjectList
|
||||
|
||||
import models
|
||||
import forms
|
||||
|
||||
|
||||
REDIRECT_EDIT_HANDLER = ObjectList(models.Redirect.content_panels)
|
||||
|
||||
@permission_required('wagtailredirects.change_redirect')
|
||||
def index(request):
|
||||
# Get redirects
|
||||
redirects = models.Redirect.get_for_site(site=request.site)
|
||||
|
||||
# Render template
|
||||
return render(request, "wagtailredirects/index.html", {
|
||||
'redirects': redirects,
|
||||
})
|
||||
|
||||
|
||||
@permission_required('wagtailredirects.change_redirect')
|
||||
def edit(request, redirect_id):
|
||||
theredirect = get_object_or_404(models.Redirect, id=redirect_id)
|
||||
|
||||
form_class = REDIRECT_EDIT_HANDLER.get_form_class(models.Redirect)
|
||||
if request.POST:
|
||||
form = form_class(request.POST, request.FILES, instance=theredirect)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, "Redirect '%s' updated." % theredirect.title)
|
||||
return redirect('wagtailredirects_index')
|
||||
else:
|
||||
messages.error(request, "The redirect could not be saved due to errors.")
|
||||
edit_handler = REDIRECT_EDIT_HANDLER(instance=theredirect, form=form)
|
||||
else:
|
||||
form = form_class(instance=theredirect)
|
||||
edit_handler = REDIRECT_EDIT_HANDLER(instance=theredirect, form=form)
|
||||
|
||||
return render(request, "wagtailredirects/edit.html", {
|
||||
'redirect': theredirect,
|
||||
'edit_handler': edit_handler,
|
||||
})
|
||||
|
||||
|
||||
@permission_required('wagtailredirects.change_redirect')
|
||||
def delete(request, redirect_id):
|
||||
theredirect = get_object_or_404(models.Redirect, id=redirect_id)
|
||||
|
||||
if request.POST:
|
||||
theredirect.delete()
|
||||
messages.success(request, "Redirect '%s' deleted." % theredirect.title)
|
||||
return redirect('wagtailredirects_index')
|
||||
|
||||
return render(request, "wagtailredirects/confirm_delete.html", {
|
||||
'redirect': theredirect,
|
||||
})
|
||||
|
||||
|
||||
@permission_required('wagtailredirects.change_redirect')
|
||||
def add(request):
|
||||
theredirect = models.Redirect()
|
||||
|
||||
form_class = REDIRECT_EDIT_HANDLER.get_form_class(models.Redirect)
|
||||
if request.POST:
|
||||
form = form_class(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
theredirect = form.save(commit=False)
|
||||
theredirect.site = request.site
|
||||
theredirect.save()
|
||||
|
||||
messages.success(request, "Redirect '%s' added." % theredirect.title)
|
||||
return redirect('wagtailredirects_index')
|
||||
else:
|
||||
messages.error(request, "The redirect could not be created due to errors.")
|
||||
edit_handler = REDIRECT_EDIT_HANDLER(instance=theredirect, form=form)
|
||||
else:
|
||||
form = form_class()
|
||||
edit_handler = REDIRECT_EDIT_HANDLER(instance=theredirect, form=form)
|
||||
|
||||
return render(request, "wagtailredirects/add.html", {
|
||||
'edit_handler': edit_handler,
|
||||
})
|
Ładowanie…
Reference in New Issue