Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
dbunskoek committed Mar 22, 2013
2 parents f20fada + 82c5c89 commit fd5931d
Show file tree
Hide file tree
Showing 1,498 changed files with 6,716 additions and 55,006 deletions.
8 changes: 7 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
language: python
python:
- 2.6
- 2.7
env:
- DJANGO_VERSION=1.3.7
- DJANGO_VERSION=1.4.5
- DJANGO_VERSION=1.5
install:
- pip install Django==$DJANGO_VERSION
- "pip install . --use-mirrors"
- "pip install -r testproject/requirements.txt --use-mirrors"
script:
Expand All @@ -11,4 +17,4 @@ script:
branches:
only:
- master
- dev
- dev
34 changes: 33 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,39 @@

## dev

* Enhancement: Ported to REST Framework. **Note:** projects with local REST Framework 0.3.X or 0.3.4
**Date**: 22nd Mar 2013

* Django 1.5 compatibility fixes
* block non-POST requests on login
* updated external libraries
* Fine Uploader 3.2.0
* CKEDITOR 4.0.1
* improved testing
* test multiple Django and Python versions on Travis CI
* added tox support


## 0.10.1

**Date**: 7th Feb 2013

* updated Django REST Framework to 2.1.17
* updated requirements
* Pillow 1.7.8
* Django MPTT 0.5.5
* Django compressor 1.2
* Django REST Framework 2.1.17
* Django 1.5 compatiblity fixes
* added meta_description field to Page
* added has_visible_children method to Page
* improved file deletion for multiple storage backends


## 0.10

**Date**: 21st Dec 2012

* Enhancement: Ported to REST Framework. **Note:** projects with local REST Framework 0.3.X or 0.3.4
dependencies will break.
* Enhancements: Updated README file and added this changelog.

Expand Down
6 changes: 4 additions & 2 deletions docs/contributors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ Luke Plant <L.Plant.98@cantab.net>
Maarten Draijer <maarten@madra.nl>
Marco Braak <mbraak@ridethepony.nl>
Marko Tibold <mtibold@leukeleu.nl>
Michael van de Waeter <mvdwaeter@gmail.com>
Michael van de Waeter <mvandewaeter@leukeleu.nl>
Nick Badoux <nbadoux@leukeleu.nl>
Niels van Dijk <nvandijk@leukeleu.nl>
Selwin Ong <selwin.ong@gmail.com>
Ramon de Jezus <rdejezus@leukeleu.nl>
Selwin Ong <selwin@ui.co.id>
Zenobius Jiricek <zenobius.jiricek@gmail.com>
7 changes: 6 additions & 1 deletion fiber/admin_urls.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
from django.conf.urls.defaults import include, patterns, url
try:
# Django >= 1.4
from django.conf.urls import include, patterns, url
except ImportError:
# Django 1.3
from django.conf.urls.defaults import include, patterns, url

from . import admin_views
from . import fiber_admin
Expand Down
2 changes: 2 additions & 0 deletions fiber/admin_views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.contrib.admin.views.decorators import staff_member_required
from django.views.decorators.http import require_POST
from django.contrib.auth import authenticate, login
from django.http import HttpResponse, HttpResponseRedirect
from django.utils import simplejson
Expand All @@ -7,6 +8,7 @@
from .models import Page


@require_POST
def fiber_login(request):
username = request.POST['username']
password = request.POST['password']
Expand Down
3 changes: 0 additions & 3 deletions fiber/editor_definitions/ckeditor_4_0_beta.py

This file was deleted.

18 changes: 15 additions & 3 deletions fiber/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@
from .utils.import_util import import_element


def is_non_html(response):
"""
Returns True if the response has no Content-type set or is not `text/html`
or not `application/xhtml+xml`.
"""
content_type = response.get('Content-Type')
if content_type is None or content_type.split(';')[0] not in ('text/html', 'application/xhtml+xml'):
return True


class AdminPageMiddleware(object):
body_re = re.compile(
r"<head>(?P<IN_HEAD>.*)</head>(?P<AFTER_HEAD>.*)<body(?P<IN_BODY_TAG>.*?)>(?P<BODY_CONTENTS>.*)</body>",
Expand All @@ -23,8 +33,9 @@ def __init__(self):

def process_response(self, request, response):
# only process html and xhtml responses
if response['Content-Type'].split(';')[0] not in ('text/html', 'application/xhtml+xml'):
if is_non_html(response):
return response

if self.set_login_session(request, response):
request.session['show_fiber_admin'] = True
url_without_fiber = request.path_info.replace(LOGIN_STRING, '')
Expand Down Expand Up @@ -178,8 +189,9 @@ class ObfuscateEmailAddressMiddleware(object):
def process_response(self, request, response):
# http://www.lampdocs.com/blog/2008/10/regular-expression-to-extract-all-e-mail-addresses-from-a-file-with-php/
email_pattern = re.compile(r'(mailto:)?[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))')
if response['Content-Type'].split(';')[0] in ('text/html', 'application/xhtml+xml'):
response.content = email_pattern.sub(self.encode_string_repl, response.content)
if is_non_html(response):
return response
response.content = email_pattern.sub(self.encode_string_repl, response.content)
return response

def encode_string_repl(self, email_pattern_match):
Expand Down
28 changes: 7 additions & 21 deletions fiber/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import os

import warnings

from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.files.images import get_image_dimensions
Expand Down Expand Up @@ -164,7 +166,7 @@ def is_child_of(self, node):
self.lft > node.lft and
self.rght < node.rght)

def get_ancestors(self):
def get_ancestors(self, *args, **kwargs):
if getattr(self, '_ancestors_retrieved', False):
# We have already retrieved the chain of parent objects, so can skip
# a DB query for this.
Expand All @@ -175,29 +177,13 @@ def get_ancestors(self):
node = node.parent
return ancestors
else:
return super(Page, self).get_ancestors()
return super(Page, self).get_ancestors(*args, **kwargs)

def get_ancestors_include_self(self):
"""
This method is currently used because there is no include_self
parameter in MPTTModel's get_ancestors() method. This will probably
land in django-mptt 0.5
"""
if self.is_root_node():
return self._tree_manager.filter(pk=self.pk)

opts = self._mptt_meta

left = getattr(self, opts.left_attr)
right = getattr(self, opts.right_attr)

qs = self._tree_manager._mptt_filter(
left__lte=left,
right__gte=right,
tree_id=self._mpttfield('tree_id'),
)
warnings.warn("The `get_ancestors_include_self` method is deprecated,"
"use MPPT's `get_ancestors(include_self=True)` instead", DeprecationWarning)

return qs.order_by(opts.left_attr)
return self.get_ancestors(include_self=True)

def move_page(self, target_id, position):
"""
Expand Down
7 changes: 6 additions & 1 deletion fiber/rest_api/urls.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
from django.conf.urls.defaults import patterns, url
try:
# Django >= 1.4
from django.conf.urls import patterns, url
except ImportError:
# Django 1.3
from django.conf.urls.defaults import patterns, url

from . import views

Expand Down
30 changes: 28 additions & 2 deletions fiber/rest_api/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.db.models import Q
from django.utils.encoding import smart_unicode

from rest_framework import generics
from rest_framework import renderers
Expand Down Expand Up @@ -29,6 +30,31 @@
status.HTTP_403_FORBIDDEN)


class PlainText(renderers.BaseRenderer):
media_type = 'text/plain'
format = 'txt'

def render(self, data, media_type=None, renderer_context=None):
if isinstance(data, basestring):
return data
return smart_unicode(data)


class IEUploadFixMixin(object):
"""
A Mixin that fixes issues with IE 8 and IE 9 file uploads.
Both user agents expect plain text responses when uploading files.
See https://github.com/valums/file-uploader/blob/master/readme.md#internet-explorer-limitations
"""

def get_renderers(self):
user_agent = self.request._request.META['HTTP_USER_AGENT']
if self.request.method == 'POST' and ('MSIE 8' in user_agent or 'MSIE 9' in user_agent):
return [PlainText()]
return super(IEUploadFixMixin, self).get_renderers()


class FiberListCreateAPIView(generics.ListCreateAPIView):
def create(self, request, *args, **kwargs):
response = super(FiberListCreateAPIView, self).create(request, *args, **kwargs)
Expand Down Expand Up @@ -119,7 +145,7 @@ class ContentItemDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = (permissions.IsAdminUser,)


class FileList(FiberListCreateAPIView):
class FileList(IEUploadFixMixin, FiberListCreateAPIView):
model = File
serializer_class = FileSerializer
renderer_classes = API_RENDERERS
Expand Down Expand Up @@ -162,7 +188,7 @@ class FileDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = (permissions.IsAdminUser,)


class ImageList(FiberListCreateAPIView):
class ImageList(IEUploadFixMixin, FiberListCreateAPIView):
model = Image
serializer_class = ImageSerializer
renderer_classes = API_RENDERERS
Expand Down
16 changes: 3 additions & 13 deletions fiber/static/fiber/css/admin.css
Original file line number Diff line number Diff line change
Expand Up @@ -352,12 +352,6 @@ div.ui-dialog form label.vCheckboxLabel {
width: auto;
}

div.ui-dialog form span.cke_skin_kama {
float: left;
border: none;
padding: 0;
}

div.ui-dialog form h2 {
font-weight: bold;
font-size: 100%;
Expand Down Expand Up @@ -398,19 +392,15 @@ div.ui-dialog form h2 {
display: none;
}

.ui-dialog .hide-label .cke_wrapper {
width: 734px;
}

/* .cke_chrome and .cke_inner selectors are for CKEditor 4.0 Beta */
/* .cke_chrome and .cke_inner selectors used for CKEditor 4 using the 'Kama' skin */

.ui-dialog .hide-label .cke_chrome {
.ui-dialog .cke_chrome {
float: none;
padding: 0;
border: none;
}

.ui-dialog .hide-label .cke_inner {
.ui-dialog .cke_inner {
border-radius: 0;
}

Expand Down
69 changes: 20 additions & 49 deletions fiber/static/fiber/css/widgets.css
Original file line number Diff line number Diff line change
@@ -1,59 +1,30 @@
/* ---[ CKEditor ]--- */

.cke_skin_kama {
float: left;
}

.cke_button_bold .cke_icon,
.cke_button_italic .cke_icon,
.cke_button_indent .cke_icon,
.cke_button_outdent .cke_icon,
.cke_button_bulletedlist .cke_icon,
.cke_button_numberedlist .cke_icon,
.cke_button_unlink .cke_icon,
.cke_button_source .cke_icon {
background-image: url(../images/ckeditor/bg-editor-toolbar-buttons.png) !important;
}

.cke_button_bold .cke_icon { background-position: -22px -2px !important; }
.cke_button_italic .cke_icon { background-position: -42px -2px !important; }
.cke_button_indent .cke_icon { background-position: -202px -2px !important; }
.cke_button_outdent .cke_icon { background-position: -222px -2px !important; }
.cke_button_bulletedlist .cke_icon { background-position: -322px -2px !important; }
.cke_button_numberedlist .cke_icon { background-position: -342px -2px !important; }
.cke_button_unlink .cke_icon { background-position: -442px -2px !important; }
.cke_button_source .cke_icon { background-position: -542px -2px !important; }

.cke_button_source .cke_label { display: none !important; }


/* ---[ CKEditor 4.0 Beta ]--- */
/* ---[ CKEditor 4 ]--- */

.cke_chrome {
float: left;
float: left;
}

.cke_button .cke_button__bold_icon,
.cke_button .cke_button__italic_icon,
.cke_button .cke_button__indent_icon,
.cke_button .cke_button__outdent_icon,
.cke_button .cke_button__bulletedlist_icon,
.cke_button .cke_button__numberedlist_icon,
.cke_button .cke_button__unlink_icon,
.cke_button .cke_button__source_icon {
.cke_ltr .cke_button .cke_button__bold_icon,
.cke_ltr .cke_button .cke_button__italic_icon,
.cke_ltr .cke_button .cke_button__indent_icon,
.cke_ltr .cke_button .cke_button__outdent_icon,
.cke_ltr .cke_button .cke_button__bulletedlist_icon,
.cke_ltr .cke_button .cke_button__numberedlist_icon,
.cke_ltr .cke_button .cke_button__unlink_icon,
.cke_ltr .cke_button .cke_button__source_icon {
background-image: url(../images/ckeditor/bg-editor-toolbar-buttons.png) !important;
}

.cke_button .cke_button__bold_icon { background-position: -22px -2px !important; }
.cke_button .cke_button__italic_icon { background-position: -42px -2px !important; }
.cke_button .cke_button__indent_icon { background-position: -202px -2px !important; }
.cke_button .cke_button__outdent_icon { background-position: -222px -2px !important; }
.cke_button .cke_button__bulletedlist_icon { background-position: -322px -2px !important; }
.cke_button .cke_button__numberedlist_icon { background-position: -342px -2px !important; }
.cke_button .cke_button__unlink_icon { background-position: -442px -2px !important; }
.cke_button .cke_button__source_icon { background-position: -542px -2px !important; }
.cke_ltr .cke_button .cke_button__bold_icon { background-position: -22px -2px !important; }
.cke_ltr .cke_button .cke_button__italic_icon { background-position: -42px -2px !important; }
.cke_ltr .cke_button .cke_button__indent_icon { background-position: -202px -2px !important; }
.cke_ltr .cke_button .cke_button__outdent_icon { background-position: -222px -2px !important; }
.cke_ltr .cke_button .cke_button__bulletedlist_icon { background-position: -322px -2px !important; }
.cke_ltr .cke_button .cke_button__numberedlist_icon { background-position: -342px -2px !important; }
.cke_ltr .cke_button .cke_button__unlink_icon { background-position: -442px -2px !important; }
.cke_ltr .cke_button .cke_button__source_icon { background-position: -542px -2px !important; }

.cke_button .cke_button_label { display: none !important; }
.cke_ltr .cke_button .cke_button_label { display: none !important; }


/* ---[ Combobox ]--- */
Expand Down Expand Up @@ -96,7 +67,7 @@
margin-left: 5px;
color: #5b80b2;
background: url("../../admin/img/admin/icon_addlink.gif") no-repeat scroll 0 0.25em transparent;
padding-left: 12px;
padding-left: 12px;
}

.fiber-json-widget tr.add-row {
Expand Down
Loading

0 comments on commit fd5931d

Please sign in to comment.