Skip to content

Optimize #35

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.idea
*.pyc
*.DS_Store
dist/*
*.egg-info
venv
example/db.sqlite3
example/db.sqlite3
23 changes: 20 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@ Ajax image uploads.

Upload images via ajax. Images are optionally resized.

Optimized on https://github.com/bradleyg/django-ajaximage.

Features Appended:

* Correctly display the readonly field
* Support django2 and above
* `upload_to` support datetime string format
* Change FileField to ImageFileField to compatible with ImageField
* Add format_image method to display custom image field using the same format
```
from ajaximage.utils import format_image
class xxxAdmin(ModelAdmin):
...
def some_field(obj):
return format_image(obj.some_field.ajaximagefield)
```

![screenshot](/screenshot.png?raw=true)

## Support
Expand Down Expand Up @@ -38,9 +55,9 @@ AJAXIMAGE_AUTH_TEST = lambda u: True
### urls.py

```python
urlpatterns = patterns('',
url(r'^ajaximage/', include('ajaximage.urls')),
)
urlpatterns += [
path('ajaximage/', include('ajaximage.urls')),
]
```

Run ```python manage.py collectstatic``` if required.
Expand Down
27 changes: 19 additions & 8 deletions ajaximage/fields.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
#-*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import django.contrib.admin.helpers
from ajaximage.utils import format_image
from django.contrib.admin.utils import display_for_field
from django.core.files.storage import default_storage
from django.db.models.fields.files import FileDescriptor, FieldFile
from django.db.models import Field
from django.conf import settings
from django.db.models.fields.files import FileDescriptor, ImageFieldFile
from django.utils.safestring import mark_safe

from .widgets import AjaxImageWidget


class AjaxImageField(Field):

storage = default_storage
attr_class = FieldFile
attr_class = ImageFieldFile
descriptor_class = FileDescriptor

def __init__(self, *args, **kwargs):
Expand Down Expand Up @@ -50,6 +53,14 @@ def formfield(self, **kwargs):
return super(AjaxImageField, self).formfield(**defaults)


if 'south' in settings.INSTALLED_APPS:
from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^ajaximage\.fields\.AjaxImageField"])
# Monkey path to rightly display readonly field.

def display_for_field_patch(value, field, empty_value_display):
if isinstance(field, AjaxImageField) and value:
width = value.width if value.width < 200 else 200
return format_image(value)
else:
return display_for_field(value, field, empty_value_display)


django.contrib.admin.helpers.display_for_field = display_for_field_patch
10 changes: 10 additions & 0 deletions ajaximage/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# coding: utf-8
from django.utils.safestring import mark_safe


def format_image(ajax_image_file_field):
if ajax_image_file_field:
width = ajax_image_file_field.width if ajax_image_file_field.width < 200 else 200
html = f"""<a class="file-link" target="_blank" href="{ajax_image_file_field.url}">
<img width="{width}px" src="{ajax_image_file_field.url}"></a>"""
return mark_safe(html)
12 changes: 7 additions & 5 deletions ajaximage/views.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import os
import datetime
import json
import os

from django.conf import settings
from django.contrib.auth.decorators import user_passes_test
from django.core.files.storage import default_storage
from django.http import HttpResponse
from django.utils.text import slugify
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
from .image import resize
from .forms import FileForm

from .forms import FileForm
from .image import resize

UPLOAD_PATH = getattr(settings, 'AJAXIMAGE_DIR', 'ajaximage/')
AUTH_TEST = getattr(settings, 'AJAXIMAGE_AUTH_TEST', lambda u: u.is_staff)
Expand All @@ -33,7 +34,8 @@ def ajaximage(request, upload_to=None, max_width=None, max_height=None, crop=Non
file_ = resize(file_, max_width, max_height, crop)
file_name, extension = os.path.splitext(file_.name)
safe_name = '{0}{1}'.format(FILENAME_NORMALIZER(file_name), extension)

if upload_to:
upload_to = datetime.datetime.now().strftime(upload_to)
name = os.path.join(upload_to or UPLOAD_PATH, safe_name)
path = default_storage.save(name, file_)
url = default_storage.url(path)
Expand Down
11 changes: 6 additions & 5 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@
f.close()

setup(
name='django-ajaximage',
version='0.2.9',
description='Upload images via ajax. Images are optionally resized.',
name='django2-ajaximage',
version='0.7.0',
description='Upload images via ajax. Images are optionally resized.',
long_description=readme,
author="Bradley Griffiths",
long_description_content_type='text/markdown',
author="Bradley Griffiths(Modified by Daimon)",
author_email='[email protected]',
url='https://github.com/bradleyg/django-ajaximage',
url='https://github.com/bradleyg/django2-ajaximage',
packages=['ajaximage'],
include_package_data=True,
install_requires=['Django', 'Pillow',],
Expand Down