from django.shortcuts import render, redirect from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django.views.generic import TemplateView from .models import Data from django.views.generic.edit import FormView from .forms import CloudAddFileForm from django.conf import settings from django.core.files.storage import default_storage from digitaleagentur.settings import BASE_DIR from django.http import JsonResponse from .models import DataDir, DataFile from datetime import datetime from users.models import AgencyGroup from django.conf import settings from django.http import FileResponse from standards.models import Standards from django.contrib import messages import os ''' Prüft, ob ein Nutzer in diesen Ordner Zugriffsrechte hat. Läuft den gesamten Strang bis nach oben, ob ein Übergeordneter Ordner Rechte einschränkt. ''' @login_required def checkUserDirRights(request, startdir, userid): canview = True user = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) usergroups=list(user.groups.all()) grouptomach = [] singleObj = DataDir.objects.get(pk=startdir.pk, agency=request.user.profile.agency) # AGENCYCHECK if(singleObj.agency.pk == user.profile.agency.pk): # Get dirs to check while( singleObj.is_root != True and canview == True): for g in singleObj.visibleby.all(): grouptomach.append(g.group) if(len(grouptomach) == 0): canview = True else: if(len(set(usergroups).intersection(grouptomach)) > 0): canview = True else: canview = False grouptomach = [] singleObj = DataDir.objects.get(pk=singleObj.parent.pk, agency=request.user.profile.agency) else: canview = False return canview def folder_size(path='.'): total = 0 for entry in os.scandir(path): if entry.is_file(): total += entry.stat().st_size elif entry.is_dir(): total += folder_size(entry.path) total_gb = round(total/1024.0**3, 3) return total_gb @login_required def CloudMain(request, pk): diragency = [] alldirs = [] context = {} breadcrump = [] files = [] rootid = list(DataDir.objects.filter(is_root=True, agency=request.user.profile.agency))[0].pk if(pk == "first"): diragency = list(DataDir.objects.filter(is_root=True, agency=request.user.profile.agency))[0] alldirs = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=diragency).order_by("name") context = { 'active_link' : 'cloud', 'dirs' : alldirs, 'parentid' : diragency.pk, 'files' : DataFile.objects.filter(parent=diragency, agency=request.user.profile.agency).order_by("name"), 'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency).order_by("agencygroupname"), "rootid" : rootid, "actquota" : str(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")), "percent_quota" : int(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")/(2/100)) } else: # CHECK IF USER HAS RIGHTS TO SEE THIS DIR groupsofdir = DataDir.objects.get(pk=pk, agency=request.user.profile.agency) if checkUserDirRights(request, groupsofdir, request.user.pk): alldirs = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=pk).order_by("name") vieweddir = list(DataDir.objects.filter(pk=pk, agency=request.user.profile.agency))[0] singleObj = DataDir.objects.get(pk=pk, agency=request.user.profile.agency) while( singleObj.is_root != True): breadcrump.append(singleObj) singleObj = DataDir.objects.get(pk=singleObj.parent.pk, agency=request.user.profile.agency) # Navi oben einmal umdrehen breadcrump = breadcrump[::-1] context = { 'active_link' : 'cloud', 'dirs' : alldirs, 'parentid' : pk, 'breadcrump' : breadcrump, 'files' : DataFile.objects.filter(parent=vieweddir, agency=request.user.profile.agency).order_by("name"), 'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency).order_by("agencygroupname"), "rootid" : rootid, "actquota" : str(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")), "percent_quota" : int(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")/(2/100)) } else: context = { 'active_link' : 'cloud', } return render(request, 'cloud/noentrie.html', context) return render(request, 'cloud/cloud_main.html', context) @login_required def adddirbyajax(request, parent): success = True data = {} if(request.method == "GET"): # NEW DIR if(request.GET.get("action") == "adddir"): parentid = request.GET.get("parent") newdirname = request.GET.get("newdirname") parent_obj = DataDir.objects.get(pk=parentid, agency=request.user.profile.agency) tempdir = DataDir(name=newdirname, parent=parent_obj, agency=request.user.profile.agency, owner=request.user) tempdir.save() parent_obj.dirs.add(tempdir) parent_obj.save() # RETURN DIRNAME elif(request.GET.get("action") == "getname_dir"): dirobj = DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency) data = {'dirname' : dirobj.name} # RETURN COMPLETE AGENCY DIR LIST elif(request.GET.get("action") == "getdirlist"): data = {'agencydirlist' : loadAgencyDirList(request)} # RETURN FILENAME elif(request.GET.get("action") == "getname_file"): fileobj = DataFile.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency) linked_standards = Standards.objects.filter(agency=request.user.profile.agency); linked_standards_final = [] for ls in linked_standards: if(fileobj in ls.addedfiles.all()): linked_standards_final.append({ "id" : ls.pk, "name" : ls.name }); data = {'filename' : fileobj.name, 'linked_standards' : linked_standards_final} # DELETE FILE elif(request.GET.get("action") == "del_file"): DataFile.objects.filter(pk=request.GET.get('id'), agency=request.user.profile.agency).delete() # CHANGE DIR NAME elif(request.GET.get("action") == "change_dir_name"): dirobj = DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency) dirobj.name = request.GET.get("newdirname") dirobj.date_last_modified = datetime.now() dirobj.save() # DELETE DIR elif(request.GET.get("action") == "del_dir"): try: DataFile.objects.filter(parent=request.GET.get('id'), agency=request.user.profile.agency).delete() DataDir.objects.filter(parent=request.GET.get('id'), agency=request.user.profile.agency).delete() DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency).delete() except: success = False # MOVE FILE elif(request.GET.get("action") == "movefile"): tempdatafile = DataFile.objects.get(pk=request.GET.get('fileid'), agency=request.user.profile.agency) tempdatafile.parent = DataDir.objects.get(pk=request.GET.get('newpar'), agency=request.user.profile.agency) tempdatafile.date_last_modified = datetime.now() tempdatafile.save() # GROUPS # DIR elif(request.GET.get("action") == "changedirgroups"): dirid = request.GET.get('dirid') groupid = request.GET.get('groupid') value = request.GET.get('value') if(value == "true"): DataDir.objects.get(pk=dirid, agency=request.user.profile.agency).visibleby.add(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency)) else: DataDir.objects.get(pk=dirid, agency=request.user.profile.agency).visibleby.remove(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency)) # GET GROUPS elif(request.GET.get("action") == "getgroupsofdir"): dirid = request.GET.get('dirid') allgroupsofdir = DataDir.objects.get(pk=dirid, agency=request.user.profile.agency).visibleby.all() grouopsid = [] for ag in allgroupsofdir: grouopsid.append({"id" : ag.pk}) data = {"gdir" : grouopsid} # REPLACE FILE elif(request.GET.get("action") == "replacefile"): oldid = DataFile.objects.get(pk=request.GET.get('oldid'), agency=request.user.profile.agency) newid = DataFile.objects.get(pk=request.GET.get('newid'), agency=request.user.profile.agency) if(oldid != None and newid != None and oldid != newid): linked_standards = Standards.objects.filter(agency=request.user.profile.agency); replacecounter = 0 for standard in linked_standards: if(oldid in standard.addedfiles.all()): standard.addedfiles.remove(oldid) standard.addedfiles.add(newid) standard.save() replacecounter += 1 if(request.GET.get('delold') == "1"): oldid.delete() data = {"success" : True} if(replacecounter > 0): if(replacecounter == 1): messages.success(request, f'Datei wurde in einem Standard ersetzt.') else: messages.success(request, f'Datei wurde in '+str(replacecounter)+' Standards ersetzt.') else: data = {"success" : False} elif request.method == 'POST': tempdir = False tempdir = DataDir.objects.get(pk=parent) uploadsource = request.POST["uploadsource"] # VALIDATE FILE-TYPE file_ext = request.FILES['uploadedfile'].name.split(".")[1] allowed_types = ["txt", "TXT", "png", "PNG", "jpeg", "JPEG", "jpg", "JPG", "PDF", "pdf", "csv", "CSV", "DOC", "doc", "DOCX", "docx", "ODT", "odt", "PPT", "ppt", "PPTX", "pptx", "XLS", "xls", "XLSX", "xlsx"] file_ok = False for t in allowed_types: if t == file_ext: file_ok = True if(file_ok): datadir_parentid = 0 if(uploadsource == "standards"): datadir_parentid = list(DataDir.objects.filter(is_defaultstandard=True, agency__pk=request.user.profile.agency.pk))[0] else: datadir_parentid = tempdir tempdatafile = DataFile(file=request.FILES['uploadedfile'], name=str(request.FILES['uploadedfile'].name), owner=request.user, parent=datadir_parentid, agency=request.user.profile.agency) tempdatafile.save() data = {'savedobj_id' : tempdatafile.pk, 'savedobj_name' : tempdatafile.name} else: success = False return JsonResponse({"success" : success, "data" : data}) @login_required def loadAgencyDirList(request): alldirs = [] diragency = list(DataDir.objects.filter(is_root=True, agency=request.user.profile.agency))[0] alldirs_root = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=diragency).order_by("name") for d in alldirs_root: alldirs.append({"id" : d.pk, "parent" : "", "name" : d.name, 'subdirs' : getsubdirs(request, d.pk)}) return alldirs @login_required def getsubdirs(request, dirid): subdirs = [] actid = False if(isinstance(dirid, DataDir)): actid = dirid.pk else: actid = dirid alldirs_sub = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=dirid).order_by("name") for subdir in alldirs_sub: tempsubsubdir = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=subdir).order_by("name") if(len(tempsubsubdir) > 0): subdirs.append({"id" : subdir.pk, "parent" : actid, "name" : subdir.name, 'subdirs' : getsubdirs(request, subdir)}) else: subdirs.append({"id" : subdir.pk, "parent" : actid, "name" : subdir.name, 'subdirs' : []}) return subdirs ''' Hier wird geprüft, ob die angeforderte Datei für diesesn Nutzer herunterladbar ist oder nicht. Leitet auf die Kein-Zugriff-Seite weiter ODER sendet die Datei. Der "echte" Datei-Link bleibt jederzeit auf dem Server :) ''' @login_required def trydownloadfile(request, pk): file = DataFile.objects.get(pk=pk) filetodownload = file.file.open() checkuserrights = checkUserDirRights(request, file.parent, request.user.id) if(checkuserrights): response = FileResponse(filetodownload) return response else: context = { 'active_link' : 'cloud', } return render(request, 'cloud/noentrie.html', context)