Skip to content

Commit

Permalink
Merge pull request #42 from Ink/demo_modification
Browse files Browse the repository at this point in the history
Demo modification
  • Loading branch information
bkwi committed Mar 24, 2015
2 parents ca01048 + 1b2bf1f commit 3bed507
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 42 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ db.sqlite3
.DS_STORE
build
django_filepicker.egg-info
.idea
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ A django plugin to make integrating with Filepicker.io even easier

3. Add a filepicker field to your model and set the upload_to value.

# *Please note, that FPFileField handle only one file*
# In demo you can see how to handle multiple files upload.
fpfile = django_filepicker.models.FPFileField(upload_to='uploads')

4. Modify your view to accept the uploaded files along with the post data.
Expand Down
14 changes: 13 additions & 1 deletion demo/filepicker_demo/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
from django.contrib import admin
from models import FileModel, BasicFilesModel

# Register your models here.

class BasicFilesModelAdmin(admin.ModelAdmin):
pass


class FileModelAdmin(admin.ModelAdmin):
readonly_fields = ('image_tag',)
list_display = ('__unicode__', 'image_tag')


admin.site.register(FileModel, FileModelAdmin)
admin.site.register(BasicFilesModel, BasicFilesModelAdmin)
40 changes: 40 additions & 0 deletions demo/filepicker_demo/migrations/0002_auto_20150323_1549.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
import django_filepicker.models


class Migration(migrations.Migration):

dependencies = [
('filepicker_demo', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='BasicFilesModel',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('text', models.CharField(max_length=64)),
],
options={
},
bases=(models.Model,),
),
migrations.CreateModel(
name='FileModel',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('fpfile', django_filepicker.models.FPFileField(upload_to=b'uploads')),
('fpurl', models.URLField(max_length=255, null=True, blank=True)),
('mid', models.ForeignKey(to='filepicker_demo.BasicFilesModel')),
],
options={
},
bases=(models.Model,),
),
migrations.DeleteModel(
name='TestModel',
),
]
37 changes: 29 additions & 8 deletions demo/filepicker_demo/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,36 @@
import django_filepicker


class TestModel(models.Model):
#Text field just to show how the FPFileField goes along with normal controls
class BasicFilesModel(models.Model):
text = models.CharField(max_length=64)

#FPFileField is a field that will render as a filepicker dragdrop widget, but
#When accessed will provide a File-like interface (so you can do fpfile.read(), for instance)
fpfile = django_filepicker.models.FPFileField(upload_to='uploads', additional_params={'data-fp-multiple':'true'})
def __unicode__(self):
return 'Files chain {}. ID:{}'.format(self.text, self.pk)

class TestModelForm(forms.ModelForm):

class FileModel(models.Model):
mid = models.ForeignKey(BasicFilesModel)
fpfile = django_filepicker.models.FPFileField(
upload_to='uploads', additional_params={'data-fp-multiple': 'true'})
fpurl = models.URLField(max_length=255, null=True, blank=True)

def __unicode__(self):
return 'File from chain {}:id-{}. ID:{}'.format(
self.mid.text, self.mid.pk, self.pk)

def image_tag(self):
return u'<img src="%s" />' % self.fpurl
image_tag.short_description = 'Image'
image_tag.allow_tags = True


class BasicFilesForm(forms.ModelForm):
class Meta:
model = BasicFilesModel
fields = ['text']


class FileForm(forms.ModelForm):
class Meta:
model = TestModel
fields = ['text','fpfile']
model = FileModel
fields = ['fpfile']
1 change: 1 addition & 0 deletions demo/filepicker_demo/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ <h1>Filepicker.io Django Library - Demo page</h1>
{%if message%}<p>{{message}}</p>{%endif%}
<form method="post" action="{% url 'demo:pick' %}">
{%csrf_token%}
{{ basic_form.as_p }}
{{ form.as_p }}
<p><input type="submit" value="Submit"/></p>
</form>
Expand Down
54 changes: 30 additions & 24 deletions demo/filepicker_demo/views.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,39 @@
from django.shortcuts import render,redirect
from django.views.generic.base import View
from django.views.generic.base import TemplateView
from django.db import models
from django_filepicker.utils import FilepickerFile
from django.shortcuts import render

try:
from .models import TestModelForm
from .models import BasicFilesForm, FileForm
except ImportError:
from models import TestModelForm
from models import BasicFilesForm, FileForm


def pick(request):
message = None
if request.method == "POST":

#building the form - automagically turns the uploaded fpurl into a File object
form = TestModelForm(request.POST, request.FILES)
if form.is_valid():
#Save will read the data and upload it to the location defined in TestModel
form.save()
basic_form = BasicFilesForm()
form = FileForm()

#Reading the contents of the file
fpfile = form.cleaned_data['fpfile']
#Since we already read from it in save(), we'll want to seek to the beginning first
fpfile.seek(0)

message = "Save successful. URL for %s: %s" % (fpfile.name, request.POST['fpfile'])
if request.method == "POST":
post = request.POST.dict()
basic_form = BasicFilesForm(post)
if basic_form.is_valid():
f = basic_form.save()
post['mid_id'] = f.id
else:
message = "Invalid form"
else:
form = TestModelForm()
message = 'Invalid form'

files_links = request.POST['fpfile'].split(',')
if post.get('mid_id', None):
for i, f in enumerate(request.FILES.getlist("fpfile")):
form = FileForm(post)
if form.is_valid():
fp = form.save(commit=False)
fp.fpfile = f
fp.fpurl = files_links[i]
fp.mid_id = post.get('mid_id')
fp.save()
else:
message = "Invalid form"
files = ", ".join([str(f) for f in request.FILES.getlist("fpfile")])
message = "Save successful. URL for {0}: {1}".format(
files, request.POST["fpfile"]) if not message else message

return render(request, "home.html", {'form': form, 'message': message})
return render(request, "home.html", {'form': form, 'message': message, 'basic_form': basic_form})
11 changes: 5 additions & 6 deletions django_filepicker/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,8 @@ def process_request(self, request):
pass
else:
splits = val.split(",")
for url in splits:
if key in request.FILES:
request.FILES.setlist(key, list(
request.FILES.getlist(key) + [fp.get_file()]))
else:
request.FILES[key] = fp.get_file()
if key in request.FILES:
request.FILES.setlist(key,
request.FILES.getlist(key) + fp.get_file())
else:
request.FILES.setlist(key, fp.get_file())
6 changes: 4 additions & 2 deletions django_filepicker/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ def get_file(self, additional_params=None):
query_params[field] = additional_params[longfield]

# iterate through one or more file urls
result = list()
for url in self.url.split(","):
# Append the fields as GET query parameters to the URL in data.
r = requests.get(url, params=query_params, stream=True)
Expand All @@ -58,8 +59,9 @@ def get_file(self, additional_params=None):
tmp.flush()

# initialize File components of this object
super(FilepickerFile, self).__init__(tmp,name=name)
return self
file = File(tmp, name=name)
result.append(file)
return result

def cleanup(self):
'''
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setup(
name='django-filepicker',
version='0.2.1',
version='0.2.2',
description='Official Filepicker Django Library',
author='Filepicker.io',
author_email='contact@filepicker.io',
Expand Down

0 comments on commit 3bed507

Please sign in to comment.