Example #1
0
    def get_credentials(self, check_cookie=True):
        if check_cookie:
            creds = self.get_session_credentials()
            if creds:
                return creds

        code = self.request.REQUEST.get('code', '')
        if not code:
            return None

        oauth_flow = self.CreateOAuthFlow()

        try:
            creds = oauth_flow.step2_exchange(code)

        except FlowExchangeError:
            return None

        users_service = CreateService('oauth2', 'v2', creds)
        info = users_service.userinfo().get().execute()
        self.userid = info.get('id')
        email = info.get('email')
        created, self.prefs = get_or_create(Preferences,
                                            queries=(('userid =',
                                                      self.userid), ),
                                            defaults={
                                                'userid': self.userid,
                                                'email': email
                                            })
        if created:
            self.prefs.put()

        StorageByKeyName(Credentials, self.userid, 'credentials').put(creds)
        return creds
Example #2
0
 def get_credentials (self, check_cookie=True):
   if check_cookie:
     creds = self.get_session_credentials()
     if creds:
       return creds
       
   code = self.request.REQUEST.get('code', '')
   if not code:
     return None
     
   oauth_flow = self.CreateOAuthFlow()
   
   try:
     creds = oauth_flow.step2_exchange(code)
     
   except FlowExchangeError:
     return None
     
   users_service = CreateService('oauth2', 'v2', creds)
   info = users_service.userinfo().get().execute()
   self.userid = info.get('id')
   email = info.get('email')
   created, self.prefs = get_or_create(Preferences, queries=(('userid =', self.userid),), defaults={'userid': self.userid, 'email': email})
   if created:
     self.prefs.put()
     
   StorageByKeyName(Credentials, self.userid, 'credentials').put(creds)
   return creds
Example #3
0
def file_tree (request):
  da = DriveAuth(request)
  creds = da.get_session_credentials()
  if creds is None:
    return http.HttpResponseForbidden('Not Authorized', mimetype='text/plain')
    
  service = CreateService('drive', 'v2', creds)
  d = request.POST.get('dir', '')
  dirs = [] 
  flist = []
  page_token = None
  
  logging.info(d)
  while 1:
    param = {}  
    if page_token:
      param['pageToken'] = page_token
      
    if d:
      param['q'] = "'%s' in parents" % d[:-1]
      
    else:
      param['q'] = "'root' in parents"
      
    files = service.files().list(**param).execute()
      
    for f in files.get('items', []):
      f['ext'] = ''
      if f.has_key('fileExtension'):
        f['ext'] = f['fileExtension']
        
      isDir = False
      if f['ext'] == '' and f.has_key('mimeType') and f['mimeType'] == 'application/vnd.google-apps.folder':
        isDir = True
        
      if isDir:
        dirs.append((f['title'], '<li id="dir_%(id)s" class="directory collapsed" title="%(title)s"><a href="#" rel="%(id)s/" data-mime="%(mimeType)s" data-title="%(title)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'dir\', \'%(id)s/\')">%(title)s</a></li>' % f))
        
      else:
        flist.append((f['title'], '<li class="file ext_%(ext)s"><a href="#" rel="%(id)s" data-title="%(title)s" data-url="%(alternateLink)s" data-mime="%(mimeType)s" data-ext="%(ext)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'file\', \'%(id)s\')">%(title)s</a></li>' % f))
        
    page_token = files.get('nextPageToken')
    if not page_token:
      break
    
  flist = sorted(flist, key=lambda x: x[0].lower())
  dirs = sorted(dirs, key=lambda x: x[0].lower())
  
  dirs = [y for (x, y) in dirs if True]
  flist = [y for (x, y) in flist if True]
  
  r = ['<ul class="jqueryFileTree" style="display: none;">'] + dirs + flist + ['</ul>']
  return http.HttpResponse(''.join(r))
  
Example #4
0
def file_tree(request):
    #return JsonResponse({'status': 'auth_needed'})
    da = DriveAuth(request)
    creds = da.get_session_credentials()
    if creds is None:
        return JsonResponse({'status': 'auth_needed'})

    service = CreateService('drive', 'v2', creds)
    d = request.POST.get('dir', '')
    dirs = []
    flist = []
    page_token = None

    while 1:
        param = {}
        if page_token:
            param['pageToken'] = page_token

        if d:
            #if d == 'shared_with_me/':
            #  param['q'] = "not 'me' in owners and ('me' in writers or 'me' in readers)"
            #
            #else:
            param['q'] = "'%s' in parents" % d[:-1]

        else:
            param['q'] = "'root' in parents"

        try:
            files = service.files().list(**param).execute()

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        file_items = files.get('items', [])

        for f in file_items:
            if f.has_key('labels') and f['labels']['trashed']:
                continue

            f['ext'] = ''

            if f.has_key('fileExtension'):
                f['ext'] = f['fileExtension']

            isDir = False
            if f['ext'] == '' and f.has_key('mimeType') and f[
                    'mimeType'] == 'application/vnd.google-apps.folder':
                isDir = True

            if isDir:
                dirs.append((
                    f['title'],
                    '<li id="dir_%(id)s" class="directory collapsed" title="%(title)s"><a href="#" rel="%(id)s/" data-mime="%(mimeType)s" data-title="%(title)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'dir\', \'%(id)s/\')">%(title)s</a></li>'
                    % f))

            else:
                flist.append((
                    f['title'],
                    '<li class="file ext_%(ext)s"><a href="#" rel="%(id)s" data-title="%(title)s" data-url="%(alternateLink)s" data-mime="%(mimeType)s" data-ext="%(ext)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'file\', \'%(id)s\')">%(title)s</a></li>'
                    % f))

        page_token = files.get('nextPageToken')
        if not page_token:
            break

    flist = sorted(flist, key=lambda x: x[0].lower())
    dirs = sorted(dirs, key=lambda x: x[0].lower())

    if not d:
        pass
        #f = {
        #  'title': 'Shared With Me',
        #  'mimeType': 'application/vnd.google-apps.folder',
        #  'id': 'shared_with_me',
        #}
        #dirs.insert(0, (f['title'], '<li id="dir_%(id)s" class="directory collapsed" title="%(title)s"><a href="#" rel="%(id)s/" data-mime="%(mimeType)s" data-title="%(title)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'dir\', \'%(id)s/\')">%(title)s</a></li>' % f))

    dirs = [y for (x, y) in dirs if True]
    flist = [y for (x, y) in flist if True]

    r = ['<ul class="jqueryFileTree" style="display: none;">'
         ] + dirs + flist + ['</ul>']
    return http.HttpResponse(''.join(r))
Example #5
0
def shatner(request):
    da = DriveAuth(request)
    creds = da.get_session_credentials()
    if creds is None:
        return JsonResponse({'status': 'auth_needed'})

    task = request.POST.get('task', '')
    service = CreateService('drive', 'v2', creds)

    if service is None:
        return JsonResponse({'status': 'no_service'})

    if task == 'delete':
        file_id = request.POST.get('file_id', '')
        fid = file_id
        if file_id.endswith('/'):
            fid = file_id[:-1]

        try:
            service.files().trash(fileId=fid).execute()

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        return JsonResponse({'status': 'ok', 'file_id': file_id})

    elif task == 'revs':
        file_id = request.POST.get('file_id', '')
        try:
            revisions = service.revisions().list(fileId=file_id).execute()

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        else:
            #for item in revisions.get('items', []):
            #  logging.info('PIN: ' + str(item['pinned']))
            #  logging.info('PUB: ' + str(item['published']))
            #
            html = render_to_string('main/revs.html', {
                'file_id': file_id,
                'items': revisions.get('items', [])
            })

        return JsonResponse({'status': 'ok', 'file_id': file_id, 'html': html})

    elif task == 'get_url':
        file_id = request.POST.get('file_id', '')
        url = request.POST.get('url', '')

        try:
            resp, content = service._http.request(url)

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        return JsonResponse({
            'status': 'ok',
            'file_id': file_id,
            'text': content
        })

    elif task == 'get_urls':
        file_id = request.POST.get('file_id', '')
        url1 = request.POST.get('url1', '')
        url2 = request.POST.get('url2', '')

        try:
            resp1, content1 = service._http.request(url1)
            resp2, content2 = service._http.request(url2)

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        return JsonResponse({
            'status': 'ok',
            'file_id': file_id,
            'text1': content1,
            'text2': content2
        })

    elif task == 'open':
        file_id = request.POST.get('file_id', '')
        if file_id:
            try:
                f = service.files().get(fileId=file_id).execute()

            except AccessTokenRefreshError:
                return JsonResponse({'status': 'auth_needed'})

            downloadUrl = f.get('downloadUrl')

            if downloadUrl:
                resp, f['content'] = service._http.request(downloadUrl)

            else:
                f['content'] = ''

            fo = FileOpen(userid=da.userid,
                          fileid=file_id,
                          filename=f['title'])
            fo.put()
            return JsonResponse({'status': 'ok', 'file': f})

        return JsonResponse({'status': 'Invalid File'})

    elif task == 'save':
        name = request.POST.get('name')
        mimetype = request.POST.get('mimetype')
        content = request.POST.get('content', '')
        file_id = request.POST.get('file_id', '')
        new_file = request.POST.get('new_file')
        major = request.POST.get('major', '')
        md5hash = request.POST.get('md5hash', '')
        undos = int(request.POST.get('undos', '0'))

        new_revision = False
        if major == 'true':
            new_revision = True

        resource = {'title': name, 'mimeType': mimetype}

        encoding = chardet.detect(content)['encoding']
        dump = None
        if encoding:
            try:
                dump = content.encode(encoding)

            except:
                dump = None

        if dump is None:
            dump = content.encode('utf-8')

        file = MediaInMemoryUpload(dump, mimetype)
        try:
            if new_file == 'false':
                google = service.files().update(fileId=file_id,
                                                newRevision=new_revision,
                                                body=resource,
                                                media_body=file).execute()

            else:
                google = service.files().insert(body=resource,
                                                media_body=file).execute()

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        else:
            file_id = google['id']

        return JsonResponse(ok={
            'file_id': file_id,
            'md5hash': md5hash,
            'undos': undos
        })

    elif task == 'rename':
        name = request.POST.get('name')
        file_id = request.POST.get('file_id', '')
        rtype = request.POST.get('rtype', '')

        resource = {'title': name}
        if rtype == 'd':
            file_id = file_id[:-1]
            resource['mimeType'] = 'application/vnd.google-apps.folder'

        else:
            newm, enc = mimetypes.guess_type(name)
            if newm:
                resource['mimeType'] = newm

        google = service.files().update(fileId=file_id,
                                        newRevision=True,
                                        body=resource).execute()
        parents = []
        for p in google['parents']:
            if p['isRoot']:
                parents.append('')

            else:
                parents.append(p['id'])

        if not parents:
            parents.append('')

        return JsonResponse(ok={
            'file_id': file_id,
            'parents': parents,
            'name': name
        })

    elif task == 'new':
        name = request.POST.get('name')
        parent = request.POST.get('parent', '')

        mime_type, enc = mimetypes.guess_type(name)
        root, ext = os.path.splitext(name)
        if not mime_type:
            mime_type = 'application/octet-stream'

        if ext:
            ext = ext[1:]

        media_body = MediaInMemoryUpload('', mime_type)
        body = {'title': name, 'mimeType': mime_type}

        if parent:
            body['parents'] = [{'id': parent}]

        try:
            google = service.files().insert(body=body,
                                            media_body=media_body).execute()

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        else:
            return JsonResponse(
                ok={
                    'file_id': google['id'],
                    'title': name,
                    'ext': ext,
                    'mime': mime_type,
                    'url': google['alternateLink'],
                    'parent': parent
                })

    elif task == 'new_dir':
        name = request.POST.get('name')
        parent = request.POST.get('parent', '')
        dmt = 'application/vnd.google-apps.folder'

        body = {'title': name, 'mimeType': dmt}

        if parent:
            body['parents'] = [{'id': parent}]

        try:
            google = service.files().insert(body=body).execute()

        except AccessTokenRefreshError:
            return JsonResponse({'status': 'auth_needed'})

        else:
            return JsonResponse(
                ok={
                    'file_id': google['id'],
                    'title': name,
                    'mime': dmt,
                    'parent': parent
                })

    return http.HttpResponseBadRequest('Invalid Task', mimetype='text/plain')
Example #6
0
def shatner (request):
  da = DriveAuth(request)
  creds = da.get_session_credentials()
  if creds is None:
    return JsonResponse({'status': 'auth_needed'})
    
  task = request.POST.get('task', '')
  if task in ('open', 'new', 'save', 'rename', 'delete', 'revs', 'get_url'):
    service = CreateService('drive', 'v2', creds)
    
    if service is None:
      return JsonResponse({'status': 'no_service'})
      
    if task == 'delete':
      file_id = request.POST.get('file_id', '')
      fid = file_id
      if file_id.endswith('/'):
        fid = file_id[:-1]
        
      try:
        service.files().delete(fileId=fid).execute()
        
      except AccessTokenRefreshError:
        return JsonResponse({'status': 'auth_needed'})
        
      return JsonResponse({'status': 'ok', 'file_id': file_id})
      
    elif task == 'revs':
      file_id = request.POST.get('file_id', '')
      try:
        revisions = service.revisions().list(fileId=file_id).execute()
        
      except AccessTokenRefreshError:
        return JsonResponse({'status': 'auth_needed'})
        
      else:
        html = render_to_string('main/revs.html', {'file_id': file_id, 'items': revisions.get('items', [])})
        
      return JsonResponse({'status': 'ok', 'file_id': file_id, 'html': html})
      
    elif task == 'get_url':
      file_id = request.POST.get('file_id', '')
      url = request.POST.get('url', '')
      try:
        resp, content = service._http.request(url)
        
      except AccessTokenRefreshError:
        return JsonResponse({'status': 'auth_needed'})
        
      return JsonResponse({'status': 'ok', 'file_id': file_id, 'text': content})
      
    elif task == 'open':
      file_id = request.POST.get('file_id', '')
      if file_id:
        try:
          f = service.files().get(fileId=file_id).execute()
          
        except AccessTokenRefreshError:
          return JsonResponse({'status': 'auth_needed'})
          
        downloadUrl = f.get('downloadUrl')
        
        if downloadUrl:
          resp, f['content'] = service._http.request(downloadUrl)
          
        else:
          f['content'] = ''
          
        return JsonResponse({'status': 'ok', 'file': f})
        
      return JsonResponse({'status': 'Invalid File'})
      
    elif task == 'save':
      name = request.POST.get('name')
      mimetype = request.POST.get('mimetype')
      content = request.POST.get('content')
      file_id = request.POST.get('file_id', '')
      new_file = request.POST.get('new_file')
      major = request.POST.get('major', '')
      md5hash = request.POST.get('md5hash', '')
      undos = int(request.POST.get('undos', '0'))
      
      new_revision = False
      if major == 'true':
        new_revision = True
        
      resource = {
        'title': name,
        'mimeType': mimetype
      }
      
      file = MediaInMemoryUpload(content, mimetype)
      
      try:
        if new_file == 'false':
          google = service.files().update(fileId=file_id, newRevision=new_revision, body=resource, media_body=file).execute()
          
        else:
          google = service.files().insert(body=resource, media_body=file).execute()
          
      except AccessTokenRefreshError:
        return JsonResponse({'status': 'auth_needed'})
        
      else:
        file_id = google['id']
        
      return JsonResponse(ok={'file_id': file_id, 'md5hash': md5hash, 'undos': undos})
      
    elif task == 'rename':
      name = request.POST.get('name')
      mimetype = request.POST.get('mimetype')
      file_id = request.POST.get('file_id', '')
      
      newm, enc = mimetypes.guess_type(name)
      if newm:
        mimetype = newm
        
      resource = {
        'title': name,
        'mimeType': mimetype
      }
      google = service.files().update(fileId=file_id, newRevision=True, body=resource).execute()
      
      parents = []
      for p in google['parents']:
        if p['isRoot']:
          parents.append('')
          
        else:
          parents.append(p['id'])
          
      if not parents:
        parents.append('')
        
      return JsonResponse(ok={'file_id': file_id, 'parents': parents})
      
    elif task == 'new':
      name = request.POST.get('name')
      parent = request.POST.get('parent', '')
      
      mime_type, enc = mimetypes.guess_type(name)
      root, ext = os.path.splitext(name)
      if not mime_type:
        mime_type = 'application/octet-stream'
        
      if ext:
        ext = ext[1:]
        
      media_body = MediaInMemoryUpload('', mime_type)
      body = {
        'title': name,
        'mimeType': mime_type
      }
      
      if parent:
        body['parents'] = [{'id': parent}]
        
      try:
        google = service.files().insert(body=body, media_body=media_body).execute()
        
      except AccessTokenRefreshError:
        return JsonResponse({'status': 'auth_needed'})
        
      else:
        return JsonResponse(ok={'file_id': google['id'], 'title': name, 'ext': ext, 'mime': mime_type, 'url': google['alternateLink'], 'parent': parent})
        
  return http.HttpResponseBadRequest('Invalid Task', mimetype='text/plain')
Example #7
0
def file_tree (request):
  #return JsonResponse({'status': 'auth_needed'})
  da = DriveAuth(request)
  creds = da.get_session_credentials()
  if creds is None:
    return JsonResponse({'status': 'auth_needed'})
    
  service = CreateService('drive', 'v2', creds)
  d = request.POST.get('dir', '')
  dirs = [] 
  flist = []
  page_token = None
  
  while 1:
    param = {}  
    if page_token:
      param['pageToken'] = page_token
      
    if d:
      #if d == 'shared_with_me/':
      #  param['q'] = "not 'me' in owners and ('me' in writers or 'me' in readers)"
      #  
      #else:
      param['q'] = "'%s' in parents" % d[:-1]
      
    else:
      param['q'] = "'root' in parents"
      
    try:
      files = service.files().list(**param).execute()
      
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    file_items = files.get('items', [])
    
    for f in file_items:
      if f.has_key('labels') and f['labels']['trashed']:
        continue
      
      f['ext'] = ''
      
      if f.has_key('fileExtension'):
        f['ext'] = f['fileExtension']
        
      isDir = False
      if f['ext'] == '' and f.has_key('mimeType') and f['mimeType'] == 'application/vnd.google-apps.folder':
        isDir = True
        
      if isDir:
        dirs.append((f['title'], '<li id="dir_%(id)s" class="directory collapsed" title="%(title)s"><a href="#" rel="%(id)s/" data-mime="%(mimeType)s" data-title="%(title)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'dir\', \'%(id)s/\')">%(title)s</a></li>' % f))
        
      else:
        flist.append((f['title'], '<li class="file ext_%(ext)s"><a href="#" rel="%(id)s" data-title="%(title)s" data-url="%(alternateLink)s" data-mime="%(mimeType)s" data-ext="%(ext)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'file\', \'%(id)s\')">%(title)s</a></li>' % f))
        
    page_token = files.get('nextPageToken')
    if not page_token:
      break
    
  flist = sorted(flist, key=lambda x: x[0].lower())
  dirs = sorted(dirs, key=lambda x: x[0].lower())
  
  if not d:
    pass
    #f = {
    #  'title': 'Shared With Me',
    #  'mimeType': 'application/vnd.google-apps.folder',
    #  'id': 'shared_with_me',
    #}
    #dirs.insert(0, (f['title'], '<li id="dir_%(id)s" class="directory collapsed" title="%(title)s"><a href="#" rel="%(id)s/" data-mime="%(mimeType)s" data-title="%(title)s" onclick="hide_right_menu()" oncontextmenu="return right_menu(event, \'dir\', \'%(id)s/\')">%(title)s</a></li>' % f))
    
  dirs = [y for (x, y) in dirs if True]
  flist = [y for (x, y) in flist if True]
  
  r = ['<ul class="jqueryFileTree" style="display: none;">'] + dirs + flist + ['</ul>']
  return http.HttpResponse(''.join(r))
  
Example #8
0
def shatner (request):
  da = DriveAuth(request)
  creds = da.get_session_credentials()
  if creds is None:
    return JsonResponse({'status': 'auth_needed'})
    
  task = request.POST.get('task', '')
  service = CreateService('drive', 'v2', creds)
  
  if service is None:
    return JsonResponse({'status': 'no_service'})
    
  if task == 'delete':
    file_id = request.POST.get('file_id', '')
    fid = file_id
    if file_id.endswith('/'):
      fid = file_id[:-1]
      
    try:
      service.files().trash(fileId=fid).execute()
      
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    return JsonResponse({'status': 'ok', 'file_id': file_id})
    
  elif task == 'revs':
    file_id = request.POST.get('file_id', '')
    try:
      revisions = service.revisions().list(fileId=file_id).execute()
      
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    else:
      #for item in revisions.get('items', []):
      #  logging.info('PIN: ' + str(item['pinned']))
      #  logging.info('PUB: ' + str(item['published']))
      #  
      html = render_to_string('main/revs.html', {'file_id': file_id, 'items': revisions.get('items', [])})
      
    return JsonResponse({'status': 'ok', 'file_id': file_id, 'html': html})
    
  elif task == 'get_url':
    file_id = request.POST.get('file_id', '')
    url = request.POST.get('url', '')
    
    try:
      resp, content = service._http.request(url)
      
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    return JsonResponse({'status': 'ok', 'file_id': file_id, 'text': content})
    
  elif task == 'get_urls':
    file_id = request.POST.get('file_id', '')
    url1 = request.POST.get('url1', '')
    url2 = request.POST.get('url2', '')
    
    try:
      resp1, content1 = service._http.request(url1)
      resp2, content2 = service._http.request(url2)
      
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    return JsonResponse({'status': 'ok', 'file_id': file_id, 'text1': content1, 'text2': content2})
    
  elif task == 'open':
    file_id = request.POST.get('file_id', '')
    if file_id:
      try:
        f = service.files().get(fileId=file_id).execute()
        
      except AccessTokenRefreshError:
        return JsonResponse({'status': 'auth_needed'})
        
      downloadUrl = f.get('downloadUrl')
      
      if downloadUrl:
        resp, f['content'] = service._http.request(downloadUrl)
        
      else:
        f['content'] = ''
        
      fo = FileOpen(userid=da.userid, fileid=file_id, filename=f['title'])
      fo.put()
      return JsonResponse({'status': 'ok', 'file': f})
      
    return JsonResponse({'status': 'Invalid File'})
    
  elif task == 'save':
    name = request.POST.get('name')
    mimetype = request.POST.get('mimetype')
    content = request.POST.get('content', '')
    file_id = request.POST.get('file_id', '')
    new_file = request.POST.get('new_file')
    major = request.POST.get('major', '')
    md5hash = request.POST.get('md5hash', '')
    undos = int(request.POST.get('undos', '0'))
    
    new_revision = False
    if major == 'true':
      new_revision = True
      
    resource = {
      'title': name,
      'mimeType': mimetype
    }
    
    encoding = chardet.detect(content)['encoding']
    dump = None
    if encoding:
      try:
        dump = content.encode(encoding)
        
      except:
        dump = None
        
    if dump is None:
      dump = content.encode('utf-8')
      
    file = MediaInMemoryUpload(dump, mimetype)
    try:
      if new_file == 'false':
        google = service.files().update(fileId=file_id, newRevision=new_revision, body=resource, media_body=file).execute()
        
      else:
        google = service.files().insert(body=resource, media_body=file).execute()
        
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    else:
      file_id = google['id']
      
    return JsonResponse(ok={'file_id': file_id, 'md5hash': md5hash, 'undos': undos})
    
  elif task == 'rename':
    name = request.POST.get('name')
    file_id = request.POST.get('file_id', '')
    rtype = request.POST.get('rtype', '')
    
    resource = {'title': name}
    if rtype == 'd':
      file_id = file_id[:-1]
      resource['mimeType'] = 'application/vnd.google-apps.folder'
      
    else:
      newm, enc = mimetypes.guess_type(name)
      if newm:
        resource['mimeType'] = newm
        
    google = service.files().update(fileId=file_id, newRevision=True, body=resource).execute()
    parents = []
    for p in google['parents']:
      if p['isRoot']:
        parents.append('')
        
      else:
        parents.append(p['id'])
        
    if not parents:
      parents.append('')
      
    return JsonResponse(ok={'file_id': file_id, 'parents': parents, 'name': name})
    
  elif task == 'new':
    name = request.POST.get('name')
    parent = request.POST.get('parent', '')
    
    mime_type, enc = mimetypes.guess_type(name)
    root, ext = os.path.splitext(name)
    if not mime_type:
      mime_type = 'application/octet-stream'
      
    if ext:
      ext = ext[1:]
      
    media_body = MediaInMemoryUpload('', mime_type)
    body = {
      'title': name,
      'mimeType': mime_type
    }
    
    if parent:
      body['parents'] = [{'id': parent}]
      
    try:
      google = service.files().insert(body=body, media_body=media_body).execute()
      
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    else:
      return JsonResponse(ok={'file_id': google['id'], 'title': name, 'ext': ext, 'mime': mime_type, 'url': google['alternateLink'], 'parent': parent})
      
  elif task == 'new_dir':
    name = request.POST.get('name')
    parent = request.POST.get('parent', '')
    dmt = 'application/vnd.google-apps.folder'
    
    body = {'title': name, 'mimeType': dmt}
    
    if parent:
      body['parents'] = [{'id': parent}]
      
    try:
      google = service.files().insert(body=body).execute()
      
    except AccessTokenRefreshError:
      return JsonResponse({'status': 'auth_needed'})
      
    else:
      return JsonResponse(ok={'file_id': google['id'], 'title': name, 'mime': dmt, 'parent': parent})
        
  return http.HttpResponseBadRequest('Invalid Task', mimetype='text/plain')