def fm_delete_file(request): pathfile = request.POST.get('dir', None) ret = {} if pathfile: path = clean_path(pathfile) if path != pathfile: ret['message'] = gettext(u"Incorrect path") ret['status'] = 'error' else: buser, bmanager = get_user_access_to_path(request.user, path) if bmanager is False: ret['message'] = gettext(u"Access denied") ret['status'] = 'error' else: try: fname = os.path.basename(pathfile) pk, filename = split_file_name(fname) os.remove(get_upload_library() + '/' + path) ZornaFile.objects.get(pk=int(pk)).delete() ret['message'] = gettext(u"File deleted successfully") ret['status'] = 'success' except: ret['message'] = gettext(u"Invalid file name") ret['status'] = 'error' else: ret['message'] = gettext(u"Invalid file path") ret['status'] = 'error' json_data = simplejson.dumps(ret) return HttpResponse(json_data)
def get_files(request, path, search_tag, search_text): root_path = get_upload_library() buser, bmanager = get_user_access_to_path(request.user, path) fullpath = u"%s/%s" % (root_path, urllib.unquote(path)) fileList = {} files_id = [] search_text_files = [] dirs = [] import re for f in os.listdir(fullpath): ff = os.path.join(fullpath, f) if os.path.isdir(ff): dirs.append(f) continue pk, fname = split_file_name(f) if pk is False: continue else: files_id.append(int(pk)) statinfo = os.stat(ff) fileList[pk] = {'name': fname, 'realname': f, 'size': statinfo[stat.ST_SIZE], 'creation': datetime.fromtimestamp(statinfo[stat.ST_CTIME]), 'modification': datetime.fromtimestamp(statinfo[stat.ST_MTIME]), 'ext': os.path.splitext(f)[1][1:], 'path': path, } if search_text and re.search(search_text, fname, re.IGNORECASE): search_text_files.append(pk) filterreq = None if search_tag: filterreq = Q(tags__icontains=search_tag) if search_text: if filterreq: filterreq = filterreq & Q(description__icontains=search_text) else: filterreq = Q(description__icontains=search_text) | Q( tags__icontains=search_text) if search_text_files: if filterreq: filterreq = filterreq | Q(pk__in=search_text_files) else: filterreq = Q(pk__in=search_text_files) files = ZornaFile.objects.filter(pk__in=files_id) if filterreq: files = files.filter(filterreq) for f in files: f.file_name = fileList[str(f.pk)]['name'] f.file_info = fileList[str(f.pk)] import operator files = list(files) files.sort(key=operator.attrgetter('file_name')) return files, dirs
def fm_manage_folder(request): ret = {'data': ''} if request.method == 'POST': what = request.POST.get('what', '') ppath = request.POST.get('path_rel', '') ppath = urllib.unquote(ppath.rstrip('/')) folder_dest = clean_path(ppath) buser, bmanager = get_user_access_to_path(request.user, folder_dest) if folder_dest and bmanager: root_path = get_upload_library() path_dest = clean_path(folder_dest) parts = path_dest.split('/') if what == 'rename' and len(parts) > 1: new_folder = request.POST.get('new_folder', '').strip() n_folder = clean_path(new_folder) if new_folder == n_folder: try: n_folder = urllib.unquote(n_folder) path_src = u"%s/%s" % ( root_path, urllib.unquote(path_dest)) dest = parts[:-1] dest = '/'.join(dest) path_dest = u"%s/%s/%s" % ( root_path, urllib.unquote(dest), n_folder) os.rename(path_src, path_dest) ret['status'] = 'success' ret['message'] = gettext( u'Folder renamed successfully') ret['data'] = u"%s/%s/" % ( urllib.unquote(dest), n_folder) except Exception as e: ret['status'] = 'error' ret['message'] = e else: ret['status'] = 'error' ret['message'] = gettext(u'Invalid folder name') elif what == 'create': new_folder = request.POST.get('new_folder', '').strip() n_folder = clean_path(new_folder) if new_folder == n_folder: try: n_folder = urllib.unquote(n_folder) rel = '%s/%s' % (urllib.unquote(path_dest), n_folder) path = u"%s/%s" % (root_path, rel) os.mkdir(path) ret['status'] = 'success' ret['message'] = gettext( u'Folder created successfully') ret['data'] = '<li class="directory collapsed"><a href="#" rel="%s/">%s</a></li>' % ( rel, n_folder) except Exception as e: ret['status'] = 'error' ret['message'] = e else: ret['status'] = 'error' ret['message'] = gettext(u'Invalid folder name') else: ret['status'] = 'error' ret['message'] = gettext(u'Access denied') return HttpResponse(simplejson.dumps(ret))
def dirlist_communities_folders(request): r = ['<ul class="jqueryFileTree" style="display: none;">'] ppath = request.GET.get('dir', '') ppath = urllib.unquote(ppath.rstrip('/')) path = clean_path(ppath) if path != ppath: path = '' if path: buser, bmanager = get_user_access_to_path(request.user, path) if buser: ret = get_sub_folders(path) else: ret = [] else: ppath = request.GET.get('path', None) if ppath: ppath = urllib.unquote(ppath.rstrip('/')) folder_dest = clean_path(ppath) buser, bmanager = get_user_access_to_path( request.user, folder_dest) if buser: ret = get_sub_folders(folder_dest, request.user) else: ret = [] else: allowed_objects = set([]) for perm in ['member', 'manage']: objects = get_allowed_objects(request.user, Community, perm) allowed_objects = allowed_objects.union(set(objects)) root_path = get_upload_library() ret = [] com = Community.objects.filter( pk__in=allowed_objects, enable_documents=True) for c in com: path = u"C%s" % c.pk fullpath = u"%s/%s" % (root_path, path) if not os.path.isdir(fullpath): os.makedirs(fullpath) pathx = c.name ret.append({'name': pathx, 'rel': path}) for d in ret: r.append( '<li class="directory collapsed"><a href="#" rel="%s/" title="%s/">%s</a></li>' % (d['rel'], d['rel'], d['name'])) r.append('</ul>') return HttpResponse(''.join(r))
def dirlist_shared_folders(request): r = ['<ul class="jqueryFileTree" style="display: none;">'] pdir = request.GET.get('dir', '') pdir = urllib.unquote(pdir.rstrip('/')) path = clean_path(pdir) if path != pdir: path = '' if path: buser, bmanager = get_user_access_to_path(request.user, path) if buser: ret = get_sub_folders(path, request.user) else: ret = [] else: ppath = request.GET.get('path', None) if ppath: ppath = urllib.unquote(ppath.rstrip('/')) folder_dest = clean_path(ppath) buser, bmanager = get_user_access_to_path( request.user, folder_dest) if buser: ret = get_sub_folders(folder_dest, request.user) else: ret = [] else: allowed_objects = get_allowed_shared_folders( request.user, ['reader', 'manager', 'writer']) ret = [] ob_list = ZornaFolder.objects.filter( pk__in=allowed_objects, parent__isnull=True) root_path = get_upload_library() for f in ob_list: path = u"F%s" % f.pk fullpath = u"%s/%s" % (root_path, path) if not os.path.isdir(fullpath): os.makedirs(fullpath) ret.append({'name': f.name, 'rel': path}) for d in ret: r.append( '<li class="directory collapsed"><a href="#" rel="%s/" title="%s/">%s</a></li>' % (d['rel'], d['rel'], d['name'])) r.append('</ul>') return HttpResponse(''.join(r))
def dirlist_personal_folders(request): r = ['<ul class="jqueryFileTree" style="display: none;">'] root = 'U%s' % request.user.pk root_name = u"My Documents" ppath = request.GET.get('dir', '') ppath = urllib.unquote(ppath.rstrip('/')) path = clean_path(ppath) if path != ppath: path = '' if not path: ppath = request.GET.get('path', None) if ppath: ppath = urllib.unquote(ppath.rstrip('/')) folder_dest = clean_path(ppath) buser, bmanager = get_user_access_to_path( request.user, folder_dest) if buser: ret = get_sub_folders(folder_dest, request.user) else: ret = [] else: ret = [{'name': root_name, 'rel': root}] else: buser, bmanager = get_user_access_to_path(request.user, path) if buser: ret = get_sub_folders(path) else: ret = [] for d in ret: r.append( '<li class="directory collapsed"><a href="#" rel="%s/" title="%s/">%s</a></li>' % (d['rel'], d['rel'], d['name'])) r.append('</ul>') return HttpResponse(''.join(r))
def get_folder_content(request): search_tag = request.GET.get('search_tag', '') search_text = request.GET.get('search_text', '') ppath = request.GET.get('dir', '') ppath = urllib.unquote(ppath.rstrip('/')) path = clean_path(ppath) if path != ppath: path = '' default_text = _(u'Recent files') bdelete = False if path == '': files = get_home_page_files(request, search_tag, search_text) if search_tag or search_text: default_text = _(u'Search results') bmanager = False folder_item_template = 'fileman/fm_folder_item_home.html' else: buser, bmanager = get_user_access_to_path(request.user, path) if not buser: return HttpResponse('') else: files, dirs = get_files(request, path, search_tag, search_text) folder_item_template = 'fileman/fm_folder_item.html' if dirs or files: bdelete = False else: bdelete = True parts = path.split('/') if len(parts) == 1: brename = False bdelete = False else: brename = True cdir_components = get_path_components(path, default_text) extra_context = {'cdir_components': cdir_components, 'files': files, 'search_text': search_text, 'search_tag': search_tag, 'manager': bmanager, 'brename': brename, 'bdelete': bdelete } extra_context['folder_item_template'] = folder_item_template context = RequestContext(request) return render_to_response('fileman/fm_folder_content.html', extra_context, context_instance=context)
def get_folder_content(request): search_tag = request.GET.get('search_tag', '') search_text = request.GET.get('search_text', '') ppath = request.GET.get('dir', '') ppath = urllib.unquote(ppath.rstrip('/')) path = clean_path(ppath) if path != ppath: path = '' bdelete = False if path == '': files = get_home_page_files(request, search_tag, search_text) bmanager = False folder_item_template = 'fileman/fm_folder_item_home.html' else: buser, bmanager = get_user_access_to_path(request.user, path) if not buser: return HttpResponse('') else: files, dirs = get_files(request, path, search_tag, search_text) folder_item_template = 'fileman/fm_folder_item.html' if dirs or files: bdelete = False else: bdelete = True parts = path.split('/') if len(parts) == 1: brename = False bdelete = False else: brename = True cdir_components = get_path_components(path) extra_context = {'cdir_components': cdir_components, 'files': files, 'search_text': search_text, 'search_tag': search_tag, 'manager': bmanager, 'brename': brename, 'bdelete': bdelete } extra_context['folder_item_template'] = folder_item_template context = RequestContext(request) return render_to_response('fileman/fm_folder_content.html', extra_context, context_instance=context)
def fm_rename_file(request): pathfile = request.POST.get('dir', None) newfile = request.POST.get('new_name', None) ret = {} if pathfile and newfile: path = clean_path(pathfile) if path != pathfile: ret['message'] = gettext(u"Incorrect path") ret['status'] = 'error' else: buser, bmanager = get_user_access_to_path(request.user, path) if bmanager is False: ret['message'] = gettext(u"Access denied") ret['status'] = 'error' else: try: oldfile = os.path.basename(path) tab = oldfile.split(',') path = os.path.dirname(path) s = os.path.splitext(newfile) fname = slugify(s[0]) fext = s[1] dest = u"%s/%s/%s" % ( get_upload_library(), path, u"%s,%s%s" % (tab[0], fname, fext)) src = u"%s/%s/%s" % (get_upload_library(), path, oldfile) os.rename(src, dest) file = ZornaFile.objects.get(pk=int(tab[0])) file.modifier = request.user file.save() ret['message'] = gettext(u"File renamed successfully") ret['status'] = 'success' except Exception as e: ret['message'] = gettext(u"Invalid file path") ret['status'] = 'error' if ret['status'] == 'error': ret['new_name'] = os.path.basename(pathfile) else: ret['new_name'] = u"%s%s" % (fname, fext) json_data = simplejson.dumps(ret) return HttpResponse(json_data)
def get_file(request): pathfile = request.GET.get('file', None) if pathfile: path = clean_path(pathfile) if path != pathfile: return HttpResponseForbidden() buser, bmanager = get_user_access_to_path(request.user, path) if buser is False: return HttpResponseForbidden() f = os.path.basename(path) path = "%s/%s" % (get_upload_library(), path) fp = open(path, 'rb') content_type = mimetypes.guess_type(f)[0] response = HttpResponse(fp.read(), content_type=content_type) response['Content-Length'] = os.path.getsize(path) pk, filename = split_file_name(f) response['Content-Disposition'] = "attachment; filename=%s" % filename return response else: return HttpResponseForbidden()
def fm_delete_folder(request): ret = {'data': ''} if request.method == 'POST': ppath = request.POST.get('path_rel', '') ppath = urllib.unquote(ppath.rstrip('/')) folder_dest = clean_path(ppath) buser, bmanager = get_user_access_to_path(request.user, folder_dest) parts = folder_dest.split('/') if folder_dest and bmanager and len(parts) > 1: root_path = get_upload_library() try: path_src = u"%s/%s" % (root_path, urllib.unquote(folder_dest)) os.rmdir(path_src) ret['status'] = 'success' ret['message'] = gettext(u'Folder deleted successfully') ret['data'] = u"%s/" % '/'.join(parts[0:-1]) except Exception as e: ret['status'] = 'error' ret['message'] = 'Error: %s' % str(e) else: ret['status'] = 'error' ret['message'] = gettext(u'Access denied') return HttpResponse(simplejson.dumps(ret))
def get_file(request): pathfile = request.GET.get('file', None) inline = request.GET.get('inline', None) if pathfile: path = clean_path(pathfile) if path != pathfile: return HttpResponseForbidden() buser, bmanager = get_user_access_to_path(request.user, path) if buser is False: return HttpResponseForbidden() f = os.path.basename(path) path = "%s/%s" % (get_upload_library(), path) fp = open(path, 'rb') content_type = mimetypes.guess_type(f)[0] response = HttpResponse(fp.read(), content_type=content_type) response['Content-Length'] = os.path.getsize(path) pk, filename = split_file_name(f) disposition = 'inline' if inline else 'attachment' response['Content-Disposition'] = "%s; filename=%s" % (disposition, filename) return response else: return HttpResponseForbidden()
def fm_properties_view(request): pathfile = request.REQUEST.get('dir', None) file_name = request.REQUEST.get('file_name', None) file_id = request.REQUEST.get('file_id', 0) ret = {} if pathfile: ppath = urllib.unquote(pathfile.rstrip('/')) path_dest = clean_path(ppath) if path_dest != ppath: ret['message'] = gettext(u"Incorrect path") ret['status'] = 'error' else: buser, bmanager = get_user_access_to_path(request.user, path_dest) if bmanager is False: ret['message'] = gettext(u"Access denied") ret['status'] = 'error' else: folder = get_shared_folder(path_dest) try: fo = ZornaFile.objects.get(pk=int(file_id)) except: ret['message'] = gettext(u"Access denied") ret['status'] = 'error' else: cdir_components = get_path_components(path_dest) if request.method == 'POST': root_path = get_upload_library() form = ZornaFileForm(request.POST, instance=fo) if form.is_valid(): fo = form.save(commit=False) fo.modifier = request.user fo.save() if request.FILES: f = request.FILES['file'] s = os.path.splitext(f.name) fname = u"%s%s" % (slugify(s[0]), s[1]) os.remove(u"%s/%s/%s,%s" % ( root_path, path_dest, file_id, file_name)) destination = open(u"%s/%s/%s,%s" % ( root_path, path_dest, file_id, fname), 'wb+') for chunk in f.chunks(): destination.write(chunk) destination.close() # notify users bnotify = request.POST.get('notify_users', 0) if folder and folder.email_notification and (folder.email_notification == 1 or bnotify): notify_users(request, folder, [{ 'name': fname, 'description': fo.description}], False) ret['message'] = gettext( u"File updated successfully") ret['status'] = 'success' json_data = simplejson.dumps(ret) return HttpResponse('<textarea>' + json_data + '</textarea>') else: ret['message'] = gettext(u"Invalid form") ret['status'] = 'error' else: form = ZornaFileForm(instance=fo) ret['status'] = 'success' t = loader.get_template('fileman/file_properties.html') ec = { 'file': fo, 'form': form, 'file_path': pathfile, 'file_name': file_name, 'file_id': file_id, 'cdir_components': cdir_components, 'folder_content_url': get_url_folder_content(pathfile), 'folder': folder} c = RequestContext(request, ec) ret['data'] = t.render(c) else: ret['message'] = gettext(u"Invalid file path") ret['status'] = 'error' json_data = simplejson.dumps(ret) return HttpResponse(json_data)
def fm_multiple_upload_view(request): pathfile = request.REQUEST.get('dir', None) ret = {} if pathfile: ppath = urllib.unquote(pathfile.rstrip('/')) path_dest = clean_path(ppath) if path_dest != ppath: ret['message'] = gettext(u"Incorrect path") ret['status'] = 'error' else: buser, bmanager = get_user_access_to_path(request.user, path_dest) folder = get_shared_folder(path_dest) if bmanager is False: ret['message'] = gettext(u"Access denied") ret['status'] = 'error' else: cdir_components = get_path_components(path_dest) form = ZornaFileUploadForm(request.POST, request.FILES) if request.method == 'POST': root_path = get_upload_library() if form.is_valid(): path = u"%s/%s" % ( root_path, urllib.unquote(path_dest)) uploaded_file = request.FILES['file'] chunk = request.REQUEST.get('chunk', '0') chunks = request.REQUEST.get('chunks', '0') name = uploaded_file.name temp_file = '%s/%s.part' % (path, name) with open(temp_file, ('wb' if chunk == '0' else 'ab')) as f: for content in uploaded_file.chunks(): f.write(content) if int(chunk) + 1 >= int(chunks): s = os.path.splitext(name) file = ZornaFile( owner=request.user, modifier=request.user, description='', folder=path_dest.split('/')[0]) file.save() destination = u"%s/%s,%s" % (path, file.pk, name) shutil.move(temp_file, destination) if request.is_ajax(): response = HttpResponse( '{"jsonrpc" : "2.0", "result" : null, "id" : "id"}') response[ 'Expires'] = 'Mon, 1 Jan 2000 01:00:00 GMT' response[ 'Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0' response['Pragma'] = 'no-cache' return response else: ret['status'] = 'success' else: ret['status'] = 'success' t = loader.get_template( 'fileman/upload_multiple_documents.html') c = RequestContext(request, { 'form': form, 'cdir_components': cdir_components, 'folder_dest': pathfile, 'folder_content_url': get_url_folder_content(pathfile), 'folder': folder, 'language': settings.LANGUAGE_CODE[0:2]}) ret['data'] = t.render(c) else: ret['message'] = gettext(u"Invalid file path") ret['status'] = 'error' json_data = simplejson.dumps(ret) return HttpResponse(json_data)
def fm_upload_view(request): pathfile = request.REQUEST.get('dir', None) ret = {} if pathfile: ppath = urllib.unquote(pathfile.rstrip('/')) path_dest = clean_path(ppath) if path_dest != ppath: ret['message'] = gettext(u"Incorrect path") ret['status'] = 'error' else: buser, bmanager = get_user_access_to_path(request.user, path_dest) folder = get_shared_folder(path_dest) if bmanager is False: ret['message'] = gettext(u"Access denied") ret['status'] = 'error' else: cdir_components = get_path_components(path_dest) if request.method == 'POST': root_path = get_upload_library() fa_set = formset_factory(ZornaFileAddForm, extra=2) form_set = fa_set(request.POST, request.FILES) if form_set.is_valid(): upload_files = {} ifiles = [] for i in range(0, form_set.total_form_count()): form = form_set.forms[i] try: f = request.FILES['form-' + str(i) + '-file'] s = os.path.splitext(f.name) fname = u"%s%s" % (slugify(s[0]), s[1]) upload_files[fname] = {'pk': '', 'file': f, 'description': form.cleaned_data['description'], 'tags': form.cleaned_data['tags']} except: continue path = u"%s/%s" % ( root_path, urllib.unquote(path_dest)) bupload = False for f, info in upload_files.iteritems(): file = ZornaFile(owner=request.user, modifier=request.user, description=info[ 'description'], tags=info['tags'], folder=path_dest.split('/')[0]) file.save() destination = open(u"%s/%s,%s" % ( path, file.pk, f), 'wb+') bupload = True for chunk in info['file'].chunks(): destination.write(chunk) destination.close() ifiles.append({'name': f, 'description': info[ 'description']}) if bupload: ret['message'] = gettext( u"Files uploaded successfully") # notify users bnotify = request.POST.get('notify_users', 0) if folder and folder.email_notification and (folder.email_notification == 1 or bnotify): notify_users(request, folder, ifiles, True) else: ret['message'] = gettext(u"No file uploaded") ret['status'] = 'success' json_data = simplejson.dumps(ret) return HttpResponse('<textarea>' + json_data + '</textarea>') else: ret['message'] = gettext(u"Invalid form") ret['status'] = 'error' t = loader.get_template( 'fileman/upload_documents.html') c = RequestContext(request, {'form_set': form_set, 'cdir_components': cdir_components, 'folder_dest': pathfile, 'folder_content_url': get_url_folder_content(pathfile)}) ret['data'] = t.render(c) json_data = simplejson.dumps(ret) return HttpResponse('<textarea>' + json_data + '</textarea>') else: fa_set = formset_factory(ZornaFileAddForm, extra=2) form_set = fa_set() ret['status'] = 'success' t = loader.get_template('fileman/upload_documents.html') c = RequestContext(request, {'form_set': form_set, 'cdir_components': cdir_components, 'folder_dest': pathfile, 'folder_content_url': get_url_folder_content(pathfile), 'folder': folder, 'manager': bmanager, }) ret['data'] = t.render(c) else: ret['message'] = gettext(u"Invalid file path") ret['status'] = 'error' json_data = simplejson.dumps(ret) return HttpResponse(json_data)