From 008682237a36ef295287359052597bcd6861e3f4 Mon Sep 17 00:00:00 2001
From: Pouria Hadjibagheri
Date: Sun, 23 Apr 2017 19:14:08 +0100
Subject: [PATCH 1/2] Minor clean up.
---
markdownx/admin.py | 4 ++-
markdownx/fields.py | 13 +++++----
markdownx/urls.py | 1 +
markdownx/utils.py | 69 +++++++++++++++++++++++++--------------------
testapp/admin.py | 7 +++--
testapp/forms.py | 14 +++++++--
testapp/urls.py | 1 +
testapp/views.py | 9 +++++-
8 files changed, 76 insertions(+), 42 deletions(-)
diff --git a/markdownx/admin.py b/markdownx/admin.py
index b8e07e0..d0c524c 100644
--- a/markdownx/admin.py
+++ b/markdownx/admin.py
@@ -1,11 +1,13 @@
from django.contrib import admin
-from django.db import models
from .widgets import AdminMarkdownxWidget
from .models import MarkdownxField
class MarkdownxModelAdmin(admin.ModelAdmin):
+ """
+
+ """
formfield_overrides = {
MarkdownxField: {'widget': AdminMarkdownxWidget}
diff --git a/markdownx/fields.py b/markdownx/fields.py
index ca59bd8..2a8d7b8 100644
--- a/markdownx/fields.py
+++ b/markdownx/fields.py
@@ -1,6 +1,6 @@
from django import forms
-from .widgets import MarkdownxWidget, AdminMarkdownxWidget
+from .widgets import MarkdownxWidget
class MarkdownxFormField(forms.CharField):
@@ -19,10 +19,13 @@ class MarkdownxFormField(forms.CharField):
super(MarkdownxFormField, self).__init__(*args, **kwargs)
if issubclass(self.widget.__class__, forms.widgets.MultiWidget):
- if not any([
- issubclass(x.__class__, MarkdownxWidget)
- for x in self.widget.widgets
- ]):
+ is_markdownx_widget = any(
+ issubclass(item.__class__, MarkdownxWidget)
+ for item in getattr(self.widget, 'widgets', list())
+ )
+
+ if not is_markdownx_widget:
self.widget = MarkdownxWidget()
+
elif not issubclass(self.widget.__class__, MarkdownxWidget):
self.widget = MarkdownxWidget()
diff --git a/markdownx/urls.py b/markdownx/urls.py
index 3c169e5..1338e48 100755
--- a/markdownx/urls.py
+++ b/markdownx/urls.py
@@ -5,6 +5,7 @@ from .views import (
MarkdownifyView,
)
+
urlpatterns = [
url(r'^upload/$', ImageUploadView.as_view()),
url(r'^markdownify/$', MarkdownifyView.as_view()),
diff --git a/markdownx/utils.py b/markdownx/utils.py
index cb199ec..876bffb 100755
--- a/markdownx/utils.py
+++ b/markdownx/utils.py
@@ -2,7 +2,10 @@ from markdown import markdown
from PIL import Image
-from .settings import MARKDOWNX_MARKDOWN_EXTENSIONS, MARKDOWNX_MARKDOWN_EXTENSION_CONFIGS
+from .settings import (
+ MARKDOWNX_MARKDOWN_EXTENSIONS,
+ MARKDOWNX_MARKDOWN_EXTENSION_CONFIGS
+)
def markdownify(content):
@@ -21,6 +24,36 @@ def markdownify(content):
return md
+def _crop(im, target_x, target_y):
+ # Use integer values now.
+ source_x, source_y = im.size
+ # Difference between new image size and requested size.
+ diff_x = int(source_x - min(source_x, target_x))
+ diff_y = int(source_y - min(source_y, target_y))
+
+ if diff_x or diff_y:
+ # Center cropping (default).
+ halfdiff_x, halfdiff_y = diff_x // 2, diff_y // 2
+ box = [
+ halfdiff_x,
+ halfdiff_y,
+ min(source_x, int(target_x) + halfdiff_x),
+ min(source_y, int(target_y) + halfdiff_y)
+ ]
+
+ # Finally, crop the image!
+ im = im.crop(box)
+ return im
+
+
+def _scale(im, x, y):
+ im.resize(
+ (int(x), int(y)),
+ resample=Image.ANTIALIAS
+ )
+ return im
+
+
def scale_and_crop(image, size, crop=False, upscale=False, quality=None):
"""
@@ -37,8 +70,6 @@ def scale_and_crop(image, size, crop=False, upscale=False, quality=None):
:return:
:rtype:
"""
- # ToDo: Possible IO/Runtime exceptions need to handled, and `finally` the file needs to be closed.
-
# Open image and store format/metadata.
image.open()
im = Image.open(image)
@@ -64,34 +95,16 @@ def scale_and_crop(image, size, crop=False, upscale=False, quality=None):
target_y = source_y * scale
if scale < 1.0 or (scale > 1.0 and upscale):
- im = im.resize(
- (int(source_x * scale), int(source_y * scale)),
- resample=Image.ANTIALIAS
- )
+ im = _scale(im=im, x=source_x * scale, y=source_y * scale)
if crop:
- # Use integer values now.
- source_x, source_y = im.size
- # Difference between new image size and requested size.
- diff_x = int(source_x - min(source_x, target_x))
- diff_y = int(source_y - min(source_y, target_y))
-
- if diff_x or diff_y:
- # Center cropping (default).
- halfdiff_x, halfdiff_y = diff_x // 2, diff_y // 2
- box = [
- halfdiff_x,
- halfdiff_y,
- min(source_x, int(target_x) + halfdiff_x),
- min(source_y, int(target_y) + halfdiff_y)
- ]
-
- # Finally, crop the image!
- im = im.crop(box)
+ im = _crop(im=im, target_x=target_x, target_y=target_y)
# Close image and replace format/metadata, as PIL blows this away.
im.format, im.info = im_format, im_info
+
image.close()
+
return im
@@ -108,11 +121,7 @@ def has_javascript(data):
# ------------------------------------------------
# Handles JavaScript nodes and stringified nodes.
# ------------------------------------------------
- pattern = (
- r'(<\s*\bscript\b.*>.*)|'
- r'(.*\bif\b\s*\(.?={2,3}.*\))|'
- r'(.*\bfor\b\s*\(.*\))'
- )
+ pattern = r'(<\s*\bscript\b.*>.*)|(.*\bif\b\s*\(.?={2,3}.*\))|(.*\bfor\b\s*\(.*\))'
found = search(
pattern=pattern,
diff --git a/testapp/admin.py b/testapp/admin.py
index de84192..633a66d 100644
--- a/testapp/admin.py
+++ b/testapp/admin.py
@@ -1,5 +1,5 @@
from django.db import models
-from django.contrib import admin
+from django.contrib.admin import ModelAdmin, site
from markdownx.widgets import AdminMarkdownxWidget
from markdownx.models import MarkdownxField
@@ -7,13 +7,14 @@ from markdownx.models import MarkdownxField
from .models import MyModel
-class MyModelAdmin(admin.ModelAdmin):
+@site.register(MyModel)
+class MyModelAdmin(ModelAdmin):
formfield_overrides = {
MarkdownxField: {'widget': AdminMarkdownxWidget},
models.TextField: {'widget': AdminMarkdownxWidget},
}
-admin.site.register(MyModel, MyModelAdmin)
+# site.register(MyModel, MyModelAdmin)
##
## SHORTER OPTION:
diff --git a/testapp/forms.py b/testapp/forms.py
index 594baf1..b807f60 100644
--- a/testapp/forms.py
+++ b/testapp/forms.py
@@ -3,6 +3,16 @@ from django import forms
from markdownx.fields import MarkdownxFormField
from markdownx.widgets import MarkdownxWidget
+
class MyForm(forms.Form):
- markdownx_form_field1 = MarkdownxFormField(widget=MarkdownxWidget(attrs={'class':'custom-class-markdownx_form_field1'}))
- markdownx_form_field2 = MarkdownxFormField(widget=MarkdownxWidget(attrs={'class':'custom-class-markdownx_form_field2'}))
+ markdownx_form_field1 = MarkdownxFormField(
+ widget=MarkdownxWidget(
+ attrs={'class': 'custom-class-markdownx_form_field1'}
+ )
+ )
+
+ markdownx_form_field2 = MarkdownxFormField(
+ widget=MarkdownxWidget(
+ attrs={'class': 'custom-class-markdownx_form_field2'}
+ )
+ )
diff --git a/testapp/urls.py b/testapp/urls.py
index 96b71cd..47fcbb0 100644
--- a/testapp/urls.py
+++ b/testapp/urls.py
@@ -9,6 +9,7 @@ from testapp.views import (
TestCreateView,
)
+
urlpatterns = [
url(r'^$', IndexTemplateView.as_view()),
url(r'^form-view/$', TestFormView.as_view(), name='form_view'),
diff --git a/testapp/views.py b/testapp/views.py
index 382ed37..844588f 100644
--- a/testapp/views.py
+++ b/testapp/views.py
@@ -8,13 +8,20 @@ from testapp.forms import MyForm
class IndexTemplateView(TemplateView):
template_name = 'index.html'
+
class TestFormView(FormView):
template_name = "test_form_view.html"
form_class = MyForm
success_url = '/'
+
class TestCreateView(CreateView):
template_name = "test_create_view.html"
model = MyModel
- fields = ['markdownx_field1', 'markdownx_field2', 'textfield1', 'textfield2']
success_url = '/'
+ fields = [
+ 'markdownx_field1',
+ 'markdownx_field2',
+ 'textfield1',
+ 'textfield2'
+ ]
From a915b857176b8e42388c6152816f7219af559a66 Mon Sep 17 00:00:00 2001
From: Pouria Hadjibagheri
Date: Sun, 23 Apr 2017 19:20:01 +0100
Subject: [PATCH 2/2] __init__ import altered.
---
setup.py | 54 ++++++++++++++++++++++++------------------------------
1 file changed, 24 insertions(+), 30 deletions(-)
diff --git a/setup.py b/setup.py
index 1217d18..77011cb 100755
--- a/setup.py
+++ b/setup.py
@@ -40,7 +40,6 @@ you have multiple versions installed on your machine:
from setuptools import setup, find_packages
from os import environ, link
from os.path import join, dirname
-from re import compile as re_compile
if 'vagrant' in str(environ):
@@ -48,38 +47,33 @@ if 'vagrant' in str(environ):
def get_meta():
- values = {
- 'author',
- 'author_email',
- 'description',
- 'credits',
- 'copyright',
- 'license',
- 'maintainer',
- 'version'
+ from sys import version_info
+
+ keys = {
+ '__author__',
+ '__description__',
+ '__credits__',
+ '__copyright__',
+ '__license__',
+ '__maintainer__',
+ '__version__'
}
- # Constructing the parsing pattern for metadata:
- template = str.join('|', values)
- pattern = re_compile(
- r"^_{{2}}"
- r"(?P({}))"
- r"_{{2}}.+[\'\"]"
- r"(?P(.+))"
- r"[\'\"][.\n]?$".format(template)
- )
-
- meta = dict()
-
- # Parsing metadata from `./markdownx/__init__.py`:
path = join(dirname(__file__), 'markdownx', '__init__.py')
- with open(path, 'r') as data:
- for line in data:
- if not line.startswith('__'):
- continue
- found = pattern.search(line)
- if found is not None:
- meta[found.group('name')] = found.group('value')
+
+ if version_info.major == 3 and version_info.minor >= 5:
+ import importlib.util
+ spec = importlib.util.spec_from_file_location('.', path)
+ mod = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(mod)
+ elif version_info.major == 3:
+ from importlib.machinery import SourceFileLoader
+ mod = SourceFileLoader('.', path).load_module()
+ else:
+ import imp
+ mod = imp.load_source('.', path)
+
+ meta = {key.replace('__', ''): getattr(mod, key) for key in keys}
return meta