Skip to content

Commit

Permalink
Merge pull request #12 from oliverseal/master
Browse files Browse the repository at this point in the history
No PIL; Want pillow.
  • Loading branch information
miguelramos committed Aug 28, 2014
2 parents ba13db8 + a90727d commit 5131d30
Show file tree
Hide file tree
Showing 16 changed files with 134 additions and 68 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

### 25-08-2014 v3.4.0
* Uses Pillow now.
* Python 3 only now.
* Integration with the Six Foot Chirping Malachite Sunbird working.

### 02-07-2013
* Refactor and resolved an issue on window.opener event.
* Refactor FB_Redactor plugin.
Expand Down
25 changes: 12 additions & 13 deletions filebrowser/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from filebrowser.settings import *
from filebrowser.conf import fb_settings
from filebrowser.functions import get_file_type, url_join, is_selectable, get_version_path
from django.utils.encoding import force_unicode

# PIL import
if STRICT_PIL:
Expand Down Expand Up @@ -44,7 +43,7 @@ def _filesize(self):
"""
Filesize.
"""
path = force_unicode(self.path)
path = (self.path)
if os.path.isfile(os.path.join(fb_settings.MEDIA_ROOT, path)) or os.path.isdir(os.path.join(fb_settings.MEDIA_ROOT, path)):
return os.path.getsize(os.path.join(fb_settings.MEDIA_ROOT, path))
return ""
Expand All @@ -70,7 +69,7 @@ def _extension(self):
"""
Extension.
"""
return u"%s" % os.path.splitext(self.filename)[1]
return u"{0}".format(os.path.splitext(self.filename)[1])
extension = property(_extension)

def _filetype_checked(self):
Expand All @@ -97,9 +96,9 @@ def _path_relative_directory(self):
"""
Path relative to initial directory.
"""
directory_re = re.compile(r'^(%s)' % (fb_settings.DIRECTORY))
directory_re = re.compile(r'^({0})'.format((fb_settings.DIRECTORY)))
value = directory_re.sub('', self.path)
return u"%s" % value
return u"{0}".format(value)
path_relative_directory = property(_path_relative_directory)

def _url_relative(self):
Expand All @@ -110,7 +109,7 @@ def _url_full(self):
"""
Full URL including MEDIA_URL.
"""
return force_unicode(url_join(fb_settings.MEDIA_URL, self.url_rel))
return (url_join(fb_settings.MEDIA_URL, self.url_rel))
url_full = property(_url_full)

def _url_save(self):
Expand All @@ -128,18 +127,18 @@ def _url_thumbnail(self):
Thumbnail URL.
"""
if self.filetype == "Image":
return u"%s" % url_join(fb_settings.MEDIA_URL, get_version_path(self.path, ADMIN_THUMBNAIL))
return u"{0}".format(url_join(fb_settings.MEDIA_URL, get_version_path(self.path, ADMIN_THUMBNAIL)))
else:
return ""
url_thumbnail = property(_url_thumbnail)

def url_admin(self):
if self.filetype_checked == "Folder":
directory_re = re.compile(r'^(%s)' % (fb_settings.DIRECTORY))
directory_re = re.compile(r'^({0})'.format((fb_settings.DIRECTORY)))
value = directory_re.sub('', self.path)
return u"%s" % value
return u"{0}".format(value)
else:
return u"%s" % url_join(fb_settings.MEDIA_URL, self.path)
return u"{0}".format(url_join(fb_settings.MEDIA_URL, self.path))

def _dimensions(self):
"""
Expand Down Expand Up @@ -196,12 +195,12 @@ def _is_empty(self):
is_empty = property(_is_empty)

def __repr__(self):
return force_unicode(self.url_save)
return (self.url_save)

def __str__(self):
return force_unicode(self.url_save)
return (self.url_save)

def __unicode__(self):
return force_unicode(self.url_save)
return (self.url_save)


1 change: 0 additions & 1 deletion filebrowser/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from django import forms
from django.forms.widgets import Input
from django.db.models.fields import Field, CharField
from django.utils.encoding import force_unicode
from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _

Expand Down
30 changes: 18 additions & 12 deletions filebrowser/functions.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# coding: utf-8

# imports
import os, re, decimal
import os, re, decimal, itertools
from time import gmtime, strftime, localtime, mktime, time
from urlparse import urlparse
# from urllib import parse

# django imports
from django.utils.translation import ugettext as _
Expand Down Expand Up @@ -34,7 +34,7 @@ def url_to_path(value):
Returns a PATH relative to MEDIA_ROOT.
"""

mediaurl_re = re.compile(r'^(%s)' % (fb_settings.MEDIA_URL))
mediaurl_re = re.compile(r'^({0})'.format(fb_settings.MEDIA_URL))
value = mediaurl_re.sub('', value)
return value

Expand All @@ -47,7 +47,7 @@ def path_to_url(value):
Return an URL relative to MEDIA_ROOT.
"""

mediaroot_re = re.compile(r'^(%s)' % (fb_settings.MEDIA_ROOT))
mediaroot_re = re.compile(r'^({0})'.format(fb_settings.MEDIA_ROOT))
value = mediaroot_re.sub('', value)
return url_join(fb_settings.MEDIA_URL, value)

Expand All @@ -59,9 +59,9 @@ def dir_from_url(value):
an URL relative to MEDIA_URL.
"""

mediaurl_re = re.compile(r'^(%s)' % (fb_settings.MEDIA_URL))
mediaurl_re = re.compile(r'^({0})'.format(fb_settings.MEDIA_URL))
value = mediaurl_re.sub('', value)
directory_re = re.compile(r'^(%s)' % (fb_settings.DIRECTORY))
directory_re = re.compile(r'^({0})'.format(fb_settings.DIRECTORY))
value = directory_re.sub('', value)
return os.path.split(value)[0]

Expand Down Expand Up @@ -120,9 +120,15 @@ def sort_by_attr(seq, attr):
# (seq[i].attr, i, seq[i]) and sort it. The second item of tuple is needed not
# only to provide stable sorting, but mainly to eliminate comparison of objects
# (which can be expensive or prohibited) in case of equal attribute values.
intermed = map(None, map(getattr, seq, (attr,)*len(seq)), xrange(len(seq)), seq)
intermed.sort()
return map(operator.getitem, intermed, (-1,) * len(intermed))
intermed = map(None, map(getattr, seq, (attr,)*len(seq)), itertools.zip_longest(range(len(seq)), seq))
# intermed.sort()
try:
intermed = sorted(intermed)
# does this actually DO anything?
print(intermed)
return list(map(operator.getitem, intermed, (-1,) * len(intermed)))
except TypeError:
return seq


def url_join(*args):
Expand Down Expand Up @@ -251,7 +257,7 @@ def get_file_type(filename):

file_extension = os.path.splitext(filename)[1].lower()
file_type = ''
for k,v in EXTENSIONS.iteritems():
for k,v in EXTENSIONS.items():
for extension in v:
if file_extension == extension.lower():
file_type = k
Expand All @@ -265,7 +271,7 @@ def is_selectable(filename, selecttype):

file_extension = os.path.splitext(filename)[1].lower()
select_types = []
for k,v in SELECT_FORMATS.iteritems():
for k,v in SELECT_FORMATS.items():
for extension in v:
if file_extension == extension.lower():
select_types.append(k)
Expand Down Expand Up @@ -296,7 +302,7 @@ def version_generator(value, version_prefix, force=None):
version_dir = os.path.split(absolute_version_path)[0]
if not os.path.isdir(version_dir):
os.makedirs(version_dir)
os.chmod(version_dir, 0775)
os.chmod(version_dir, 0o775)
version = scale_and_crop(im, VERSIONS[version_prefix]['width'], VERSIONS[version_prefix]['height'], VERSIONS[version_prefix]['opts'])
try:
version.save(absolute_version_path, quality=90, optimize=(os.path.splitext(version_path)[1].lower() != '.gif'))
Expand Down
4 changes: 2 additions & 2 deletions filebrowser/management/commands/version_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ def handle_noargs(self, **options):
filter_re = []
for exp in EXCLUDE:
filter_re.append(re.compile(exp))
for k,v in VERSIONS.iteritems():
exp = (r'_%s.(%s)') % (k, '|'.join(EXTENSION_LIST))
for k,v in VERSIONS.items():
exp = (r'_{0}.({1})').format(k, '|'.join(EXTENSION_LIST))
filter_re.append(re.compile(exp))

path = os.path.join(fb_settings.MEDIA_ROOT, fb_settings.DIRECTORY)
Expand Down
33 changes: 33 additions & 0 deletions filebrowser/static/filebrowser/js/FB_Sixfoot.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
if(window.opener){
document.addEventListener('DOMContentLoaded', function(e) {
// hook an event on the select button
var selectButtons, button, i, img, message;

function onImageButtonClick(e) {
message = {
event: 'selected',
file: e.target.getAttribute('data-file'),
type: e.target.getAttribute('data-type')
}
window.opener.postMessage(message, '*');
window.close();
}

selectButtons = document.querySelectorAll('button[name="sixfoot-select"]');
console.log(selectButtons);
for (i = selectButtons.length - 1; i >= 0; i--) {
button = selectButtons[i];

button.addEventListener('click', onImageButtonClick);
};

window.addEventListener('unload', function(e) {
message = {
event: 'close',
file: null,
type: null
}
window.opener.postMessage(message, '*');
});
});
}
1 change: 1 addition & 0 deletions filebrowser/templates/filebrowser/include/tableheader.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
{% if query.pop == "1" and results_var.select_total %}<th></th>{% endif %}
{% if query.pop == "2" and results_var.select_total %}<th></th>{% endif %}
{% if query.pop == "3" and results_var.select_total %}<th></th>{% endif %}
{% if query.pop == "4" and results_var.select_total %}<th></th>{% endif %}
<!-- FILETYPE -->
{% ifequal query.o "filetype_checked" %}<th class="sorted {{ query.ot }}ending"><a href="{% query_string "" "o,ot,p" %}&amp;ot={% ifequal query.ot "desc" %}asc{% else %}desc{% endifequal %}&amp;o=filetype_checked">{% trans "Type" %}</a></th>{% endifequal %}
{% ifnotequal query.o "filetype_checked" %}<th><a href="{% query_string "" "o,ot,p" %}&amp;ot=asc&amp;o=filetype_checked">{% trans "Type" %}</a></th>{% endifnotequal %}
Expand Down
1 change: 1 addition & 0 deletions filebrowser/templates/filebrowser/versions.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
{% ifequal query.pop '1' %}<th></th>{% endifequal %}
{% ifequal query.pop '2' %}<th></th>{% endifequal %}
{% ifequal query.pop '3' %}<th></th>{% endifequal %}
{% ifequal query.pop '4' %}<th></th>{% endifequal %}

<!-- Filename/Dimensions -->
<th>{% trans 'Name' %}</th>
Expand Down
13 changes: 13 additions & 0 deletions filebrowser/templates/suit/include/filelisting.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,19 @@
</td>
{% endif %}

<!-- FILESELECT FOR SIXFOOT -->
{% if query.pop == "5" and results_var.select_total %}
<td class="fb_icon">
{% selectable file.filetype query.type %}
{% if selectable %}
<!--<button class="btn btn-success" name="redactor-select" onclick="RedactorSubmit('{{ file.url_save }}', '{{ file.url_thumbnail }}', '{{ file.filetype }}');">{% trans "Select" %}</button>-->
<button class="btn btn-success" name="sixfoot-select" data-file="{{ file.url_save }}" data-thumb="{{ file.url_thumbnail }}" data-type="{{ file.filetype }}">{% trans "Select" %}</button>
{% else %}
&nbsp;
{% endif %}
</td>
{% endif %}

<!-- FILEICON -->
<td>
<img src="{{ settings_var.URL_FILEBROWSER_MEDIA }}img/filebrowser_type_{{ file.filetype|lower }}.gif" />
Expand Down
5 changes: 5 additions & 0 deletions filebrowser/templates/suit/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@
{% ifequal query.pop '4' %} <!-- Redactor -->
<script language="javascript" type="text/javascript" src="{{ settings_var.URL_FILEBROWSER_MEDIA }}js/FB_Redactor.js"></script>
{% endifequal %}
{% ifequal query.pop '5' %} <!-- Sixfoot Chirping Malachite Sunbird -->
<script language="javascript" type="text/javascript" src="{{ settings_var.URL_FILEBROWSER_MEDIA }}js/FB_Sixfoot.js"></script>
{% endifequal %}
{{ media.js }}
{% if action_form %}{% if actions_on_top or actions_on_bottom %}
<script type="text/javascript">
Expand Down Expand Up @@ -135,6 +138,8 @@ <h2>{% trans "Filters" %}</h2>
{% if query.pop == "1" and results_var.select_total %}<th></th>{% endif %}
{% if query.pop == "2" and results_var.select_total %}<th></th>{% endif %}
{% if query.pop == "3" and results_var.select_total %}<th></th>{% endif %}
{% if query.pop == "4" and results_var.select_total %}<th></th>{% endif %}
{% if query.pop == "5" and results_var.select_total %}<th></th>{% endif %}
<!-- FILETYPE -->
{% ifequal query.o "filetype_checked" %}<th class="sorted {{ query.ot }}ending"><a href="{% query_string "" "o,ot,p" %}&amp;ot={% ifequal query.ot "desc" %}asc{% else %}desc{% endifequal %}&amp;o=filetype_checked">{% trans "Type" %}</a></th>{% endifequal %}
{% ifnotequal query.o "filetype_checked" %}<th><a href="{% query_string "" "o,ot,p" %}&amp;ot=asc&amp;o=filetype_checked">{% trans "Type" %}</a></th>{% endifnotequal %}
Expand Down
5 changes: 5 additions & 0 deletions filebrowser/templates/suit/versions.html
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@
<script language="javascript" type="text/javascript" src="{{ settings_var.URL_FILEBROWSER_MEDIA }}js/FB_Redactor.js"></script>
{% endifequal %}

{% ifequal query.pop '5' %}
<!-- Six Foot Chirping Malachite Sunbird -->
<script language="javascript" type="text/javascript" src="{{ settings_var.URL_FILEBROWSER_MEDIA }}js/FB_Sixfoot.js"></script>
{% endifequal %}

{{ media }}
{% endblock %}

Expand Down
2 changes: 1 addition & 1 deletion filebrowser/templatetags/fb_csrf.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def render(self, context):
if csrf_token == 'NOTPROVIDED':
return mark_safe(u"")
else:
return mark_safe(u"<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='%s' /></div>" % (csrf_token))
return mark_safe(u"<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='{0}' /></div>".format(csrf_token))
else:
# It's very probable that the token is missing because of
# misconfiguration, so we raise a warning
Expand Down
12 changes: 6 additions & 6 deletions filebrowser/templatetags/fb_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,16 @@ def get_query_string(p, new_params=None, remove=None):
if new_params is None: new_params = {}
if remove is None: remove = []
for r in remove:
for k in p.keys():
#if k.startswith(r):
if k == r:
del p[k]
try:
p.pop(r)
except KeyError:
continue
for k, v in new_params.items():
if k in p and v is None:
del p[k]
elif v is not None:
p[k] = v
return '?' + '&'.join([u'%s=%s' % (urlquote(k), urlquote(v)) for k, v in p.items()])
return '?' + '&'.join([u'{0}={1}'.format(urlquote(k), urlquote(v)) for k, v in p.items()])


def string_to_dict(string):
Expand Down Expand Up @@ -134,7 +134,7 @@ def selectable(parser, token):
try:
tag, filetype, format = token.split_contents()
except:
raise template.TemplateSyntaxError, "%s tag requires 2 arguments" % token.contents.split()[0]
raise template.TemplateSyntaxError("{0} tag requires 2 arguments".format(token.contents.split()[0]))

return SelectableNode(filetype, format)

Expand Down
Loading

0 comments on commit 5131d30

Please sign in to comment.