digitaleagenturnc/cloud/views.py

233 lines
8.7 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
import os
from .models import DataDir, DataFile
from datetime import datetime
from users.models import AgencyGroup
'''
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
@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
}
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)
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
}
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)
data = {'filename' : fileobj.name}
# 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})
print(grouopsid)
data = {"gdir" : grouopsid}
elif request.method == 'POST':
tempdir = False
tempdir = DataDir.objects.get(pk=parent)
# 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"]
file_ok = False
for t in allowed_types:
if t == file_ext:
file_ok = True
if(file_ok):
tempdatafile = DataFile(file=request.FILES['uploadedfile'], name=request.FILES['uploadedfile'].name, owner=request.user, parent=tempdir, 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