342 lines
13 KiB
Python
342 lines
13 KiB
Python
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, HttpResponse, Http404
|
|
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
|
|
import sys
|
|
from django.conf import settings
|
|
|
|
'''
|
|
|
|
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}
|
|
# CHECK DOUBLE FILENAME
|
|
elif(request.GET.get("action") == "check_doublefile"):
|
|
fileobj = list(DataFile.objects.filter(name__icontains=request.GET.get('name'), agency=request.user.profile.agency))
|
|
if len(fileobj) > 0:
|
|
data = {"found" : True}
|
|
else:
|
|
data = {"found" : False}
|
|
# 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"]
|
|
replace = request.POST["replace"]
|
|
|
|
print(replace)
|
|
|
|
# DECODE
|
|
request.decoding = 'utf-8'
|
|
|
|
# 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", "mov", "MOV", "SVG", "svg", "ZIP", "zip", "RAR", "rar", "EPS", "eps", "MP3", "mp3", "WAV", "wav", "avi", "AVI", "FLV", "flv", "MP4", "mp4"]
|
|
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
|
|
|
|
if(replace == "0"):
|
|
request.FILES["uploadedfile"].name = request.FILES["uploadedfile"].name.encode().decode(encoding='UTF-8',errors='strict')
|
|
tempdatafile = DataFile(file=request.FILES['uploadedfile'], name=str(request.FILES['uploadedfile'].name).encode().decode(encoding='UTF-8',errors='strict'), owner=request.user, parent=datadir_parentid, agency=request.user.profile.agency)
|
|
else:
|
|
tempdatafile = list(DataFile.objects.filter(name__icontains=request.FILES['uploadedfile'].name, agency=request.user.profile.agency))[0]
|
|
tempdatafile.file = request.FILES['uploadedfile']
|
|
|
|
try:
|
|
tempdatafile.save()
|
|
except:
|
|
success = False
|
|
print("Fehler beim Speichern der Datei")
|
|
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)
|
|
checkuserrights = checkUserDirRights(request, file.parent, request.user.id)
|
|
if(checkuserrights):
|
|
file_path = os.path.join(settings.MEDIA_ROOT, file.file.name)
|
|
if os.path.exists(file_path):
|
|
with open(file_path, 'rb') as fh:
|
|
file_ext = file.name.split(".")[1]
|
|
response = HttpResponse(fh.read(), content_type="application/file")
|
|
response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
|
|
return response
|
|
raise Http404
|
|
|
|
return response
|
|
else:
|
|
context = {
|
|
'active_link' : 'cloud',
|
|
}
|
|
return render(request, 'cloud/noentrie.html', context)
|
|
|
|
|