Commit 290d95af by David Robinson

Merge pull request #70 from dankrause/master

add file support
parents aaca867f 65e78e72
......@@ -50,7 +50,7 @@ class ParseBase(object):
ENDPOINT_ROOT = API_ROOT
@classmethod
def execute(cls, uri, http_verb, extra_headers=None, batch=False, **kw):
def execute(cls, uri, http_verb, extra_headers=None, batch=False, body=None, **kw):
"""
if batch == False, execute a command with the given parameters and
return the response JSON.
......@@ -70,19 +70,25 @@ class ParseBase(object):
rest_key = ACCESS_KEYS.get('rest_key')
master_key = ACCESS_KEYS.get('master_key')
headers = extra_headers or {}
url = uri if uri.startswith(API_ROOT) else cls.ENDPOINT_ROOT + uri
if body is None:
data = kw and json.dumps(kw) or "{}"
else:
data = body
if http_verb == 'GET' and data:
url += '?%s' % urlencode(kw)
data = None
else:
data = data.encode('utf-8')
headers = {
'Content-type': 'application/json',
'X-Parse-Application-Id': app_id,
'X-Parse-REST-API-Key': rest_key
}
headers.update(extra_headers or {})
request = Request(url, data, headers)
request.add_header('Content-type', 'application/json')
request.add_header('X-Parse-Application-Id', app_id)
request.add_header('X-Parse-REST-API-Key', rest_key)
if master_key and 'X-Parse-Session-Token' not in headers.keys():
request.add_header('X-Parse-Master-Key', master_key)
......
......@@ -14,10 +14,12 @@ from __future__ import unicode_literals
import base64
import datetime
import mimetypes
import six
from parse_rest.connection import API_ROOT, ParseBase
from parse_rest.query import QueryManager
from parse_rest.core import ParseError
def complex_type(name=None):
......@@ -184,17 +186,26 @@ class GeoPoint(ParseType):
@complex_type()
class File(ParseType):
class File(ParseType, ParseBase):
ENDPOINT_ROOT = '/'.join([API_ROOT, 'files'])
@classmethod
def from_native(cls, **kw):
return cls(**kw)
def __init__(self, **kw):
name = kw.get('name')
def __init__(self, name, content=None, mimetype=None, url=None):
self._name = name
self._file_url = url
self._api_url = '/'.join([API_ROOT, 'files', name])
self._file_url = kw.get('url')
self._content = content
self._mimetype = mimetype or mimetypes.guess_type(name)
if not content and not url:
with open(name) as f:
content = f.read()
self._content = content
def __repr__(self):
return '<File:%s>' % (getattr(self, '_name', None))
def _to_native(self):
return {
......@@ -203,6 +214,27 @@ class File(ParseType):
'url': self._file_url
}
def save(self, batch=False):
if self.url is not None:
raise ParseError("Files can't be overwritten")
uri = '/'.join([self.__class__.ENDPOINT_ROOT, self.name])
headers = {'Content-type': self.mimetype}
response = self.__class__.POST(uri, extra_headers=headers, batch=batch, body=self._content)
self._file_url = response['url']
self._name = response['name']
self._api_url = '/'.join([API_ROOT, 'files', self._name])
if batch:
return response, lambda response_dict: None
def delete(self, batch=False):
uri = "/".join(self.__class__.ENDPOINT_ROOT, self.name)
response = self.__class__.DELETE(uri, batch=batch)
if batch:
return response, lambda response_dict: None
mimetype = property(lambda self: self._mimetype)
url = property(lambda self: self._file_url)
name = property(lambda self: self._name)
_absolute_url = property(lambda self: self._api_url)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment