digitaleagenturnc/cloud/views.py

341 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"):
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)