First commit of fileupload packaging
This commit is contained in:
commit
ccdc04b8af
8
MANIFEST.in
Normal file
8
MANIFEST.in
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
include README.txt
|
||||||
|
recursive-include xstatic/pkg/angular_fileupload *
|
||||||
|
|
||||||
|
global-exclude *.pyc
|
||||||
|
global-exclude *.pyo
|
||||||
|
global-exclude *.orig
|
||||||
|
global-exclude *.rej
|
||||||
|
|
13
README.txt
Normal file
13
README.txt
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
XStatic-Angular-Filepload
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Angular-FileUpload JavaScript library packaged for setuptools (easy_install) / pip.
|
||||||
|
|
||||||
|
This package is intended to be used by **any** project that needs these files.
|
||||||
|
|
||||||
|
It intentionally does **not** provide any extra code except some metadata
|
||||||
|
**nor** has any extra requirements. You MAY use some minimal support code from
|
||||||
|
the XStatic base package, if you like.
|
||||||
|
|
||||||
|
You can find more info about the xstatic packaging way in the package `XStatic`.
|
||||||
|
|
27
setup.py
Normal file
27
setup.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from xstatic.pkg import angular_fileupload as xs
|
||||||
|
|
||||||
|
# The README.txt file should be written in reST so that PyPI can use
|
||||||
|
# it to generate your project's PyPI page.
|
||||||
|
long_description = open('README.txt').read()
|
||||||
|
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name=xs.PACKAGE_NAME,
|
||||||
|
version=xs.PACKAGE_VERSION,
|
||||||
|
description=xs.DESCRIPTION,
|
||||||
|
long_description=long_description,
|
||||||
|
classifiers=xs.CLASSIFIERS,
|
||||||
|
keywords=xs.KEYWORDS,
|
||||||
|
maintainer=xs.MAINTAINER,
|
||||||
|
maintainer_email=xs.MAINTAINER_EMAIL,
|
||||||
|
license=xs.LICENSE,
|
||||||
|
url=xs.HOMEPAGE,
|
||||||
|
platforms=xs.PLATFORMS,
|
||||||
|
packages=find_packages(),
|
||||||
|
namespace_packages=['xstatic', 'xstatic.pkg', ],
|
||||||
|
include_package_data=True,
|
||||||
|
zip_safe=False,
|
||||||
|
install_requires=[], # nothing! :)
|
||||||
|
# if you like, you MAY use the 'XStatic' package.
|
||||||
|
)
|
1
xstatic/__init__.py
Normal file
1
xstatic/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
__import__('pkg_resources').declare_namespace(__name__)
|
1
xstatic/pkg/__init__.py
Normal file
1
xstatic/pkg/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
__import__('pkg_resources').declare_namespace(__name__)
|
49
xstatic/pkg/angular_fileupload/__init__.py
Normal file
49
xstatic/pkg/angular_fileupload/__init__.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
"""
|
||||||
|
XStatic resource package
|
||||||
|
|
||||||
|
See package 'XStatic' for documentation and basic tools.
|
||||||
|
"""
|
||||||
|
|
||||||
|
DISPLAY_NAME = 'Angular-Bootstrap' # official name, upper/lowercase allowed, no spaces
|
||||||
|
PACKAGE_NAME = 'XStatic-%s' % DISPLAY_NAME # name used for PyPi
|
||||||
|
|
||||||
|
NAME = __name__.split('.')[-1] # package name (e.g. 'foo' or 'foo_bar')
|
||||||
|
# please use a all-lowercase valid python
|
||||||
|
# package name
|
||||||
|
|
||||||
|
VERSION = '0.11.0' # version of the packaged files, please use the upstream
|
||||||
|
# version number
|
||||||
|
BUILD = '2' # our package build number, so we can release new builds
|
||||||
|
# with fixes for xstatic stuff.
|
||||||
|
PACKAGE_VERSION = VERSION + '.' + BUILD # version used for PyPi
|
||||||
|
|
||||||
|
DESCRIPTION = "%s %s (XStatic packaging standard)" % (DISPLAY_NAME, VERSION)
|
||||||
|
|
||||||
|
PLATFORMS = 'any'
|
||||||
|
CLASSIFIERS = []
|
||||||
|
KEYWORDS = '%s xstatic' % NAME
|
||||||
|
|
||||||
|
# XStatic-* package maintainer:
|
||||||
|
MAINTAINER = 'Jordan OMara'
|
||||||
|
MAINTAINER_EMAIL = 'jsomara@gmail.com'
|
||||||
|
|
||||||
|
# this refers to the project homepage of the stuff we packaged:
|
||||||
|
HOMEPAGE = 'https://github.com/danialfarid/angular-file-upload'
|
||||||
|
|
||||||
|
# this refers to all files:
|
||||||
|
LICENSE = '(same as %s)' % DISPLAY_NAME
|
||||||
|
|
||||||
|
from os.path import join, dirname
|
||||||
|
BASE_DIR = join(dirname(__file__), 'data')
|
||||||
|
# linux package maintainers just can point to their file locations like this:
|
||||||
|
#BASE_DIR = '/usr/share/javascript/angular_cookies'
|
||||||
|
|
||||||
|
LOCATIONS = {
|
||||||
|
# CDN locations (if no public CDN exists, use an empty dict)
|
||||||
|
# if value is a string, it is a base location, just append relative
|
||||||
|
# path/filename. if value is a dict, do another lookup using the
|
||||||
|
# relative path/filename you want.
|
||||||
|
# your relative path/filenames should usually be without version
|
||||||
|
# information, because either the base dir/url is exactly for this
|
||||||
|
# version or the mapping will care for accessing this version.
|
||||||
|
}
|
250
xstatic/pkg/angular_fileupload/data/angular-file-upload.js
vendored
Normal file
250
xstatic/pkg/angular_fileupload/data/angular-file-upload.js
vendored
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
/**!
|
||||||
|
* AngularJS file upload/drop directive with http post and progress
|
||||||
|
* @author Danial <danial.farid@gmail.com>
|
||||||
|
* @version 1.4.0
|
||||||
|
*/
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
var angularFileUpload = angular.module('angularFileUpload', []);
|
||||||
|
|
||||||
|
angularFileUpload.service('$upload', ['$http', '$timeout', function($http, $timeout) {
|
||||||
|
function sendHttp(config) {
|
||||||
|
config.method = config.method || 'POST';
|
||||||
|
config.headers = config.headers || {};
|
||||||
|
config.transformRequest = config.transformRequest || function(data, headersGetter) {
|
||||||
|
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
return $http.defaults.transformRequest[0](data, headersGetter);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (window.XMLHttpRequest.__isShim) {
|
||||||
|
config.headers['__setXHR_'] = function() {
|
||||||
|
return function(xhr) {
|
||||||
|
if (!xhr) return;
|
||||||
|
config.__XHR = xhr;
|
||||||
|
config.xhrFn && config.xhrFn(xhr);
|
||||||
|
xhr.upload.addEventListener('progress', function(e) {
|
||||||
|
if (config.progress) {
|
||||||
|
$timeout(function() {
|
||||||
|
if(config.progress) config.progress(e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
//fix for firefox not firing upload progress end, also IE8-9
|
||||||
|
xhr.upload.addEventListener('load', function(e) {
|
||||||
|
if (e.lengthComputable) {
|
||||||
|
if(config.progress) config.progress(e);
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var promise = $http(config);
|
||||||
|
|
||||||
|
promise.progress = function(fn) {
|
||||||
|
config.progress = fn;
|
||||||
|
return promise;
|
||||||
|
};
|
||||||
|
promise.abort = function() {
|
||||||
|
if (config.__XHR) {
|
||||||
|
$timeout(function() {
|
||||||
|
config.__XHR.abort();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return promise;
|
||||||
|
};
|
||||||
|
promise.xhr = function(fn) {
|
||||||
|
config.xhrFn = fn;
|
||||||
|
return promise;
|
||||||
|
};
|
||||||
|
promise.then = (function(promise, origThen) {
|
||||||
|
return function(s, e, p) {
|
||||||
|
config.progress = p || config.progress;
|
||||||
|
var result = origThen.apply(promise, [s, e, p]);
|
||||||
|
result.abort = promise.abort;
|
||||||
|
result.progress = promise.progress;
|
||||||
|
result.xhr = promise.xhr;
|
||||||
|
result.then = promise.then;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
})(promise, promise.then);
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.upload = function(config) {
|
||||||
|
config.headers = config.headers || {};
|
||||||
|
config.headers['Content-Type'] = undefined;
|
||||||
|
config.transformRequest = config.transformRequest || $http.defaults.transformRequest;
|
||||||
|
var formData = new FormData();
|
||||||
|
var origTransformRequest = config.transformRequest;
|
||||||
|
var origData = config.data;
|
||||||
|
config.transformRequest = function(formData, headerGetter) {
|
||||||
|
if (origData) {
|
||||||
|
if (config.formDataAppender) {
|
||||||
|
for (var key in origData) {
|
||||||
|
var val = origData[key];
|
||||||
|
config.formDataAppender(formData, key, val);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (var key in origData) {
|
||||||
|
var val = origData[key];
|
||||||
|
if (typeof origTransformRequest == 'function') {
|
||||||
|
val = origTransformRequest(val, headerGetter);
|
||||||
|
} else {
|
||||||
|
for (var i = 0; i < origTransformRequest.length; i++) {
|
||||||
|
var transformFn = origTransformRequest[i];
|
||||||
|
if (typeof transformFn == 'function') {
|
||||||
|
val = transformFn(val, headerGetter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
formData.append(key, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.file != null) {
|
||||||
|
var fileFormName = config.fileFormDataName || 'file';
|
||||||
|
|
||||||
|
if (Object.prototype.toString.call(config.file) === '[object Array]') {
|
||||||
|
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
|
||||||
|
for (var i = 0; i < config.file.length; i++) {
|
||||||
|
formData.append(isFileFormNameString ? fileFormName + i : fileFormName[i], config.file[i], config.file[i].name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
formData.append(fileFormName, config.file, config.file.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return formData;
|
||||||
|
};
|
||||||
|
|
||||||
|
config.data = formData;
|
||||||
|
|
||||||
|
return sendHttp(config);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.http = function(config) {
|
||||||
|
return sendHttp(config);
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
angularFileUpload.directive('ngFileSelect', [ '$parse', '$timeout', function($parse, $timeout) {
|
||||||
|
return function(scope, elem, attr) {
|
||||||
|
var fn = $parse(attr['ngFileSelect']);
|
||||||
|
elem.bind('change', function(evt) {
|
||||||
|
var files = [], fileList, i;
|
||||||
|
fileList = evt.target.files;
|
||||||
|
if (fileList != null) {
|
||||||
|
for (i = 0; i < fileList.length; i++) {
|
||||||
|
files.push(fileList.item(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$timeout(function() {
|
||||||
|
fn(scope, {
|
||||||
|
$files : files,
|
||||||
|
$event : evt
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// removed this since it was confusing if the user click on browse and then cancel #181
|
||||||
|
// elem.bind('click', function(){
|
||||||
|
// this.value = null;
|
||||||
|
// });
|
||||||
|
|
||||||
|
// touch screens
|
||||||
|
if (('ontouchstart' in window) ||
|
||||||
|
(navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
|
||||||
|
elem.bind('touchend', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.target.click();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} ]);
|
||||||
|
|
||||||
|
angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', function($parse, $timeout) {
|
||||||
|
return function(scope, elem, attr) {
|
||||||
|
if ('draggable' in document.createElement('span')) {
|
||||||
|
var fn = $parse(attr['ngFileDropAvailable']);
|
||||||
|
$timeout(function() {
|
||||||
|
fn(scope);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} ]);
|
||||||
|
|
||||||
|
angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', function($parse, $timeout) {
|
||||||
|
return function(scope, elem, attr) {
|
||||||
|
if ('draggable' in document.createElement('span')) {
|
||||||
|
var cancel = null;
|
||||||
|
var fn = $parse(attr['ngFileDrop']);
|
||||||
|
elem[0].addEventListener("dragover", function(evt) {
|
||||||
|
$timeout.cancel(cancel);
|
||||||
|
evt.stopPropagation();
|
||||||
|
evt.preventDefault();
|
||||||
|
elem.addClass(attr['ngFileDragOverClass'] || "dragover");
|
||||||
|
}, false);
|
||||||
|
elem[0].addEventListener("dragleave", function(evt) {
|
||||||
|
cancel = $timeout(function() {
|
||||||
|
elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
|
||||||
|
});
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
var processing = 0;
|
||||||
|
function traverseFileTree(files, item) {
|
||||||
|
if (item.isDirectory) {
|
||||||
|
var dirReader = item.createReader();
|
||||||
|
processing++;
|
||||||
|
dirReader.readEntries(function(entries) {
|
||||||
|
for (var i = 0; i < entries.length; i++) {
|
||||||
|
traverseFileTree(files, entries[i]);
|
||||||
|
}
|
||||||
|
processing--;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
processing++;
|
||||||
|
item.file(function(file) {
|
||||||
|
processing--;
|
||||||
|
files.push(file);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
elem[0].addEventListener("drop", function(evt) {
|
||||||
|
evt.stopPropagation();
|
||||||
|
evt.preventDefault();
|
||||||
|
elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
|
||||||
|
var files = [], items = evt.dataTransfer.items;
|
||||||
|
if (items && items.length > 0 && items[0].webkitGetAsEntry) {
|
||||||
|
for (var i = 0; i < items.length; i++) {
|
||||||
|
traverseFileTree(files, items[i].webkitGetAsEntry());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var fileList = evt.dataTransfer.files;
|
||||||
|
if (fileList != null) {
|
||||||
|
for (var i = 0; i < fileList.length; i++) {
|
||||||
|
files.push(fileList.item(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(function callback(delay) {
|
||||||
|
$timeout(function() {
|
||||||
|
if (!processing) {
|
||||||
|
fn(scope, {
|
||||||
|
$files : files,
|
||||||
|
$event : evt
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback(10);
|
||||||
|
}
|
||||||
|
}, delay || 0)
|
||||||
|
})();
|
||||||
|
}, false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} ]);
|
||||||
|
|
||||||
|
})();
|
Loading…
Reference in New Issue
Block a user