Dateilösung fertig inkl. Rechte usw, DIV-Bug bei Module gelöst, Profil zweispaltig gemacht

This commit is contained in:
holger.trampe 2020-02-15 21:18:14 +01:00
parent 670b2bce6c
commit de04d397bb
17 changed files with 704 additions and 152 deletions

View File

@ -1,6 +1,6 @@
from django import forms
from django.forms import ModelForm
from .models import Data
from .models import Data, DataFile
class CloudAddFileForm(forms.ModelForm):

View File

@ -8,7 +8,7 @@ from django.utils import timezone
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/agency_<id>/files/<subdirs>/<filename>
return 'agencydata/agency_{0}/files/{1}/{2}'.format(instance.agency.pk, instance.subdir, filename)
return 'agencydata/agency_{0}/files/{1}'.format(instance.agency.pk, filename)
class Data(models.Model):
@ -28,7 +28,6 @@ class DataDir(models.Model):
name = models.CharField(max_length=2000, default="", blank=True, null=True)
is_root = models.BooleanField(default=False)
dirs = models.ManyToManyField('self', blank=True, related_name='dirs_in_dirs', symmetrical = False)
datafiles = models.ManyToManyField('DataFile', blank=True, related_name='files_in_dir')
visibleby = models.ManyToManyField(AgencyGroup, blank=True, related_name='visible_by_user')
date_created = models.DateTimeField(default = timezone.now)
date_last_modified = models.DateTimeField(default = timezone.now)
@ -42,12 +41,12 @@ class DataDir(models.Model):
class DataFile(models.Model):
name = models.CharField(max_length=2000, default="", blank=True, null=True)
file = models.FileField(null=True, max_length=255, upload_to=user_directory_path)
file = models.FileField(null=True, max_length=255, upload_to=user_directory_path, blank=True)
date_created = models.DateTimeField(default = timezone.now)
date_last_modified = models.DateTimeField(default = timezone.now)
owner = models.ForeignKey(User, on_delete=models.PROTECT)
agency = models.ForeignKey(Agency, on_delete=models.CASCADE, default=None)
parent = models.ForeignKey(DataDir, on_delete=models.PROTECT, related_name='thisfileindir')
owner = models.ForeignKey(User, on_delete=models.PROTECT, default=None, blank=True, null=True)
agency = models.ForeignKey(Agency, on_delete=models.CASCADE, default=None, blank=True, null=True)
parent = models.ForeignKey(DataDir, on_delete=models.PROTECT, related_name='thisfileindir', blank=True, null=True)
def __str__(self):
return str(self.name)

View File

@ -1,13 +1,32 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% load counter_tag %}
{% load static %}
{% block content %}
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="{% static 'users/js/jsLists.js' %}"></script>
<link href="{% static 'users/css/jsLists.css' %}" rel="stylesheet">
<style>
.icon-hover:hover{
color: gray;
}
a.disabled {
pointer-events: none;
cursor: default;
}
</style>
<div aria-live="polite" aria-atomic="true" class="d-flex justify-content-center align-items-center" style="min-height: 200px; max-width: 250px; position: fixed; margin-top: -3%; margin-left: 70.5%; z-index: 10">
<!-- Then put toasts within -->
<div id="fileerr" class="toast alert-danger" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-header">
<strong class="mr-auto">Daten gefunden</strong>
</div>
<div class="toast-body">
<div id="toast_errcontent">Achtung! In Unterverzeichnissen befinden sich Dateien. Es können nur Ordner ohne Unterordner gelöscht werden!</div>
</div>
</div>
</div>
<div class="content-section col-12">
<h3>Dateien&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Hier können Sie Dateien und Ordner für ihre Agentur verwalten." class="far fa-question-circle"></i></small></h3>
<hr>
@ -23,45 +42,215 @@
<li class="breadcrumb-item"><a href="{% url 'cloud-main' cr.pk %}">{{cr.name}}</a></li>
{% endif %}
{% endfor %}
{% if user|usergperm:"filedirmanager" %}
<li class="breadcrumb-item" active><i onclick="javascript:addDirModal()" class="fas fa-folder-plus icon-hover"></i></li>
{% endif %}
</ol>
</nav>
{% if user|usergperm:"filesviewer" %}
<table class="table table-hover" id="dirfilestable">
<thead>
<tr>
<th scope="col"></th>
<th scope="col"><small><i data-toggle="tooltip" data-placement="top" title="Ziehen Sie Dateien direkt auf die Ordner, um sie in die Ordner hochzuladen oder in den unteren Bereich, um Dateien in diesen Ordner hochzuladen." class="far fa-question-circle"></i></small></th>
<th scope="col">Name</th>
<th scope="col">Eigentümer</th>
<th scope="col">Datum</th>
<th scope="col"></th>
<th scope="col">Erstellt</th>
<th scope="col">Geändert</th>
<th></th>
</tr>
</thead>
<tbody>
{% for d in dirs %}
{% for d in dirs %}
{% setbool False %}
{% for ag in d.visibleby.all %}
{% if user|has_group:ag.group.name %}
{% setbool True %}
{% endif %}
{% endfor %}
{% if d.visibleby.all|length == 0 %}
{% setbool True %}
{% endif %}
{% getbool as groupchecker %}
<tr id="dir_{{d.pk}}" class="droppable_tr">
<td id="dir_{{d.pk}}_icon"><i class="fas fa-folder" ></i></td>
<td><a href="{% url 'cloud-main' d.pk %}">{{d.name}}</a></td>
<td id="dir_{{d.pk}}_icon"><i class="fas fa-folder" ></i>
</td>
<td>
{% if groupchecker %}
<a href="{% url 'cloud-main' d.pk %}">{{d.name}}</a>
{% else %}
<span class="text-secondary"><i class="fas fa-lock"></i>&nbsp;{{d.name}}</span>
{% endif %}
</td>
<td>{{d.owner.first_name}} {{d.owner.last_name}}</td>
<td>{{d.date_created|date:"d.m.Y G:i"}}</td>
<td>{{d.date_last_modified|date:"d.m.Y G:i"}}</td>
<td>
{% if user|usergperm:"filedirmanager" and groupchecker %}
<div class="dropdown no-arrow">
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
<div class="dropdown-header">Ordneroptionen</div>
<a class="dropdown-item" href="javascript:changeDirName({{d.pk}})">Umbenennen</a>
<a class="dropdown-item" href="javascript:showGroupChangeModal({{d.pk}})">Zugriff einschränken</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="javascript:delDataDirObje({{d.pk}})" >Löschen</a>
</div>
</div>
{% endif %}
</td>
</tr>
{% endfor %}
{% for file in dir.DataFiles %}
{% endfor %}
{% for file in files %}
<tr>
<td>
<i class="fas fa-file" ></i>{{file}}
</td>
<i class="fas fa-file" ></i>
</td>
<td><a href="{{file.file.url}}" download>{{file.name}}</a></td>
<td>{{file.owner.first_name}} {{file.owner.last_name}}</td>
<td>{{file.date_created|date:"d.m.Y G:i"}}</td>
<td>{{file.date_last_modified|date:"d.m.Y G:i"}}</td>
<td>
{% if user|usergperm:"filesmanager" %}
<div class="dropdown no-arrow">
<a class="dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i>
</a>
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
<div class="dropdown-header">Dateioptionen</div>
<a class="dropdown-item" href="javascript:moveFile({{file.pk}})">Verschieben</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="javascript:delDataFileObje({{file.pk}})" >Löschen</a>
</div>
</div>
{% endif %}
</td>
</tr>
{% endfor %}
{% endfor %}
</tbody>
</table>
<div class="alert alert-secondary droppable_div text-center" id="{{parentid}}_div" role="alert" style="min-height: 80px; line-height: 50px; text-align: center;">
<i class="fas fa-plus"></i>&nbsp;Dateien ins aktuelle Verzeichnis hier hineinziehen.
{% endif %}
{% if user|usergperm:"filesmanager" %}
<form method="POST" id="uploadFileForm" enctype="multipart/form-data">
<input type="file" id="uploadedfile" name="uploadedfile" style="display:none">
</form>
<div class="alert alert-secondary droppable_div text-center mt-5" id="{{parentid}}_div" role="alert" style="line-height: 45px; text-align: center;">
<button type="button" class="btn btn-primary btn-sm" id="uploadButton" onclick="javascript:uploadButtonPush()"><i class="fas fa-plus"></i></button>&nbsp;&nbsp;&nbsp;zum Hochladen klicken oder neue Dateien hier hineinziehen.<p><small>Dateien werden im aktuellen Ordner
<b>{% if breadcrump|length == 0 %}
Heimverzeichnis
{% else %}
{{breadcrump.0}}
{% endif %}</b>
gespeichert.
</small></p>
</div>
<!-- MODEAL ADD DIR -->
<div class="modal fade" id="addDir" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="" aria-hidden="true">
{% endif %}
<!-- MODAL CHANGE DIRNAME -->
<div class="modal fade" id="changeName" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="" aria-hidden="true">
<div class="modal-dialog " role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="mainmodalArea_title">Ordner in TODO erstellen</h5>
<h5 class="modal-title" id="mainmodalArea_title">
<span id="actualName"></span>&nbsp;Umbenennen
</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="exampleInputPassword1">Name:</label>
<input class="form-control" id="changename" type="text" value="" placeholder="Ordnername" onkeyup="javascript:validateNewName(this.value)">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Abrechen</button>&nbsp;
<button id="doUpdateName" type="button" class="btn btn-success" data-dismiss="modal" onclick="javascript:updateName()" disabled="false">Speichern</button>
</div>
</div>
</div>
</div>
<!-- CONFIRMA DELETE DIR -->
<div class="modal fade" id="delDataObj" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="groupDelFunction" aria-hidden="true">
<div class="modal-dialog " role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Ordner löschen</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Mit löschen fortfahren? Alle Dateien in diesem Verzeichnis werden ebenfalls gelöscht!
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal" onclick="javascript:doDelDataDir()">Löschen</button>&nbsp;&nbsp;
<button type="button" class="btn btn-success" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<!-- CONFIRMA DELETE FILE -->
<div class="modal fade" id="delDataFile" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="groupDelFunction" aria-hidden="true">
<div class="modal-dialog " role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Datei löschen</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Datei <b><span id="filenametodel"></span></b> wirklich löschen?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal" onclick="javascript:doDelDataFile()">Löschen</button>&nbsp;&nbsp;
<button type="button" class="btn btn-success" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<!-- CONFIRMA MOVE/DIR -->
<div class="modal fade" id="moveDataModal" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="groupDelFunction" aria-hidden="true">
<div class="modal-dialog " role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Datei Verschieben</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Bitte neues Verzeichnis auswählen:
<div id="agencydirlist"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-success" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<!-- MODEAL ADD DIR -->
<div class="modal fade" id="addDir" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="" aria-hidden="false">
<div class="modal-dialog " role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="mainmodalArea_title">
{% if breadcrump|length == 0 %}
Ordner in Heimverzeichnis der Agentur erstellen
{% else %}
Ordner in {{breadcrump.0}} erstellen
{% endif %}
</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span>
</button>
@ -79,8 +268,153 @@
</div>
</div>
</div>
<!-- CHANGE GROUPS -->
<div class="modal fade" id="changeGroupOfDataObj" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="groupDelFunction" aria-hidden="true">
<div class="modal-dialog " role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Zugriffe einschränken</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
Welche Gruppen dürfen auf diese Daten Zugriff haben?
<p><small>Ist keine Gruppe ausgewählt, darf jeder der Agentur diese Daten sehen!</small></p>
{% for g in agencygroups %}
<div class="custom-control custom-checkbox mb-2">
<input type="checkbox" class="custom-control-input groupclass" name="group_{{g.pk}}" id="group_{{g.pk}}" onchange="javascript:changeGroup({{g.pk}}, this.checked)">
<label class="custom-control-label" for="group_{{g.pk}}" >{{g.agencygroupname}}</label>
</div>
{% endfor %}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-success" data-dismiss="modal">Beenden</button>
</div>
</div>
</div>
</div>
<script>
//DROPPABLE
$(document).ready(function(){
$(".toast").toast({
autohide: true,
delay : 5000
});
});
//GROUPS
function showGroupChangeModal(tochangeid){
$("#changeGroupOfDataObj").modal("toggle");
$(".groupclass").attr("checked", false);
workingdirid = tochangeid;
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "getgroupsofdir",
dirid : workingdirid
},
success: function( data )
{
for(i = 0; i < data["data"]["gdir"].length; i++){
$("#group_" + data["data"]["gdir"][i]['id']).attr("checked", true);
}
}
});
}
$('#changeGroupOfDataObj').on('hidden.bs.modal', function (e) {
window.location = window.location
})
function changeGroup(groupid, value){
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "changedirgroups",
groupid : groupid,
dirid : workingdirid,
value : value
},
success: function( data )
{
}
});
}
//MOVING OPERATIONS
function moveFile(fileid)
{
workingfileid = fileid;
workingdirid = false;
$("#moveDataModal").modal("toggle");
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "getdirlist"
},
success: function( data )
{
$("#agencydirlist").html("");
createList(data["data"]["agencydirlist"], l);
$("#agencydirlist").html(html);
}
});
}
var html = ['<ul id="simple_list">'];
let l = 2;
//Create UL-LI-List for tree
function createList(arr, l) {
html.push('<ul>');
$.each(arr, function(i, val) {
if(val.parent == ""){
html.push('<li><i class="fa fa-folder mt-2"></i>&nbsp;<a href="javascript:targetParentToMove('+val.id+')"><b>' + val.name + '</b></a>');
}
else {
html.push('<li class="ml-'+l+' mt-2"><i class="fa fa-folder" ></i><a href="javascript:targetParentToMove('+val.id+')">&nbsp;'+val.name+'</a></li>');
}
if (val.subdirs) {
createList(val.subdirs, l+1)
}
html.push('</li>');
});
html.push('</ul>');
}
function targetParentToMove(parid){
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "movefile",
fileid : workingfileid,
newpar : parid
},
success: function( data )
{
window.location = window.location
}
});
}
// preventing page from redirecting
$("html").on("dragover", function(e) {
@ -91,6 +425,10 @@
$("html").on("drop", function(e) { e.preventDefault(); e.stopPropagation(); });
uploadtoparent = {{parentid}};
</script>
{% if user|usergperm:"filesmanager" %}
<script type="text/javascript">
$( ".droppable_tr" ).on('dragenter', function (e) {
e.stopPropagation();
e.preventDefault();
@ -104,8 +442,8 @@
$('.droppable_tr').on('drop', function (e) {
e.stopPropagation();
e.preventDefault();
console.log("UPLOAD TO: DIR" + e["currentTarget"]['id']);
var file = e.originalEvent.dataTransfer.files;
uploadtoparent = e["currentTarget"]['id'].split("_")[1];
uploadAction(e.originalEvent.dataTransfer.files[0], e["currentTarget"]['id'].split("_")[1]);
$("#" + currentid).removeClass('table-secondary');
$("#" + currentid + "_icon").html("");
$("#" + currentid + "_icon").html('<i class="fas fa-folder"></i>');
@ -132,10 +470,8 @@ $('.droppable_tr').on('dragleave', function (e) {
$('.droppable_div').on('drop', function (e) {
e.stopPropagation();
e.preventDefault();
$("#{{parentid}}_div").removeClass('bg-secondary');
console.log("UPLOAD TO: DIR " + {{parentid}});
var file = e.originalEvent.dataTransfer.files;
$("#{{parentid}}_div").removeClass('bg-secondary');
uploadAction(e.originalEvent.dataTransfer.files[0], e["currentTarget"]['id'].split("_")[0]);
});
$('.droppable_div').on('dragleave', function (e) {
@ -145,29 +481,190 @@ $('.droppable_div').on('dragleave', function (e) {
$("#{{parentid}}_div").removeClass('bg-secondary');
});
function uploadAction(filetodo, parid){
var formData = new FormData($("#uploadFileForm")[0]);
formData.append("uploadedfile", filetodo);
$.ajax({
url: "{% url 'cloud-adddir' %}" + parid,
headers: {
"X-CSRFTOKEN": "{{ csrf_token }}"
},
data: formData,
type: 'POST',
cache: false,
processData: false,
contentType: false,
success: function() {
window.location = window.location;
}
});
}
</script>
{% endif %}
<script type="text/javascript">
$('#uploadedfile').on('change', function() {
uploadAction($("#uploadedfile")[0]['files'][0], {{parentid}});
});
function uploadButtonPush(){
$("#uploadedfile").click();
}
//FILE OPERATIONS
workingfileid = false;
function delDataFileObje(fileid){
workingfileid = fileid;
$("#delDataFile").modal("toggle");
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "getname_file",
id : workingfileid
},
success: function( data )
{
$("#filenametodel").html("");
$("#filenametodel").html(data["data"]["filename"]);
}
});
}
function doDelDataFile(){
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "del_file",
id : workingfileid
},
success: function( data )
{
window.location = window.location;
}
});
}
workingdirid = false;
// DIR FUNCTIONS
function delDataDirObje(id){
workingdirid = id;
$("#delDataObj").modal("toggle");
}
function doDelDataDir(){
$("#delDataObj").modal("toggle");
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "del_dir",
id : workingdirid
},
success: function( data )
{
if(data["success"]){
window.location = window.location;
}
else{
$("#fileerr").toast("show");
}
}
});
}
function changeDirName(dirid){
$("#changeName").modal("toggle");
workingdirid = dirid;
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "getname_dir",
id : dirid
},
success: function( data )
{
$("#actualName").html("Ordner <b>" + data["data"]['dirname'] + "</b>");
$("#changename").val(data["data"]['dirname']);
$("#doUpdateName").attr("disabled", false);
}
});
}
function updateName(){
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "change_dir_name",
id : workingdirid,
newdirname : $("#changename").val()
},
success: function( data )
{
$("#changeName").modal("toggle");
window.location = window.location;
}
});
}
function addDirModal(){
$("#addDir").modal("toggle");
$("#newdirname").val("");
$("#doActionTaskModal").attr("disabled", true)
}
function validateDirName(newdirname){
if(newdirname.length > 0){
$("#doActionTaskModal").attr("disabled", false);
//VALIDATE FOR CORRECT INPUT IN GROUP
function validateNewName(newdirname){
var letters = /^[A-Za-zßäöüÄÖÜ_\-0-9 ]+$/;
if(newdirname.length > 0){
if(!newdirname.match(letters))
{
$("#doUpdateName").attr("disabled", true);
}
else{
$("#doUpdateName").attr("disabled", false);
}
}
else{
else{
$("#doUpdateName").attr("disabled", true);
}
}
//VALIDATE FOR CORRECT INPUT IN GROUP
function validateDirName(newdirname){
var letters = /^[A-Za-zßäöüÄÖÜ_\-0-9 ]+$/;
if(newdirname.length > 0){
if(!newdirname.match(letters))
{
$("#doActionTaskModal").attr("disabled", true);
}
else{
$("#doActionTaskModal").attr("disabled", false);
}
}
else{
$("#doActionTaskModal").attr("disabled", true);
}
}
function addDirAction(){
$.ajax(
{
type: "GET",
url: "{% url 'cloud-adddir' %}",
url: "{% url 'cloud-adddir' parentid %}",
data:{
action : "adddir",
parent : {{parentid}},

View File

@ -5,4 +5,5 @@ from . import views
urlpatterns = [
path('<slug:pk>', CloudMain, name='cloud-main'),
path('clajax/', views.adddirbyajax, name="cloud-adddir"),
path('clajax/<slug:parent>', views.adddirbyajax, name="cloud-adddir"),
]

View File

@ -13,6 +13,8 @@ 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
@login_required
def CloudMain(request, pk):
@ -20,137 +22,166 @@ def CloudMain(request, pk):
alldirs = []
context = {}
breadcrump = []
files = []
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)
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
'parentid' : diragency.pk,
'files' : DataFile.objects.filter(parent=diragency, agency=request.user.profile.agency),
'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency)
}
else:
alldirs = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=pk)
singleObj = DataDir.objects.get(pk=pk)
while( singleObj.is_root != True):
breadcrump.append(singleObj)
singleObj = DataDir.objects.get(pk=singleObj.parent.pk)
# CHECK IF USER HAS RIGHTS TO SEE THIS DIR
groupsofdir = list(DataDir.objects.filter(pk=pk, agency=request.user.profile.agency))[0]
breadcrump = breadcrump[::-1]
userisingroup = False
context = {
'active_link' : 'cloud',
'dirs' : alldirs,
'parentid' : pk,
'breadcrump' : breadcrump
if len(groupsofdir.visibleby.all()) == 0:
userisingroup = True
else:
for ag in groupsofdir.visibleby.all():
if ag.group in request.user.groups.all():
userisingroup = True
if userisingroup:
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)
while( singleObj.is_root != True):
breadcrump.append(singleObj)
singleObj = DataDir.objects.get(pk=singleObj.parent.pk)
breadcrump = breadcrump[::-1]
context = {
'active_link' : 'cloud',
'dirs' : alldirs,
'parentid' : pk,
'breadcrump' : breadcrump,
'files' : DataFile.objects.filter(parent=vieweddir, agency=request.user.profile.agency),
'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency)
}
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):
def adddirbyajax(request, parent):
success = True
if(request.method == "GET"):
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()
data = {}
return JsonResponse({"success" : success})
''' CLOUD ALT '''
'''
class CloudMain(LoginRequiredMixin, FormView):
form_class = CloudAddFileForm
success_url = '/cloud/home'
def form_valid(self, form):
form = CloudAddFileForm(self.request.POST, self.request.FILES['file'])
tempdata = Data(file=self.request.FILES['file'], subdir="/"+self.request.POST.get("subdirinfo")+"/", agency=self.request.user.profile.agency, owner=self.request.user)
tempdata.save()
return super().form_valid(form)
# Change context and return for template-data
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
agency_id = self.request.user.profile.agency.pk
if self.request.is_ajax() == False:
agencyfiles = Data.objects.filter(agency__pk=agency_id)
dirs = []
files = []
dirs = os.listdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\")
if(self.kwargs['level'] != "home"):
dirs = os.listdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\"+self.kwargs['level'])
# ALLOWED FILETYPES
filecheckarr = [".txt", ".pdf", ".TXT", ".PDF", ".jpg", ".JPG", ".png", ".PNG", ".jpeg", ".JPEG", ".docx", ".odt", ".odf"]
for d in dirs:
for fa in filecheckarr:
if fa in d:
templevel = self.kwargs["level"].split("\\")
templevel_final = templevel[len(self.kwargs["level"].split("\\"))-1]
if(templevel_final == "home"):
templevel_final = ""
tempsearchname = templevel_final+"/"+d
fileob = list(Data.objects.filter(file__endswith=tempsearchname))[0]
files.append(fileob)
dirs.remove(d)
if(self.kwargs['level'] != "home"):
i = 0
for d in dirs:
dirs[i] = self.kwargs["level"] + "\\" + d
i += 1
crumplevel = self.kwargs["level"].split("\\")
context.update({'active_link' : 'cloud', 'files': files, 'dirs' : dirs, 'agencyfiles' : agencyfiles, 'level' : self.kwargs["level"], 'crumplevel' : crumplevel})
return context
else:
context.update({'active_link' : 'cloud'})
adddirname = self.request.GET.get("adddirname")
newdirname = self.request.GET.get("newdirname")
if(adddirname == "home"):
os.mkdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\" + newdirname)
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')).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 DIR
elif(request.GET.get("action") == "movefile"):
tempdatafile = DataFile.objects.get(pk=request.GET.get('fileid'))
tempdatafile.parent = DataDir.objects.get(pk=request.GET.get('newpar'))
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).visibleby.add(AgencyGroup.objects.get(pk=groupid))
else:
os.mkdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\" + adddirname + "\\" + newdirname)
return {}
DataDir.objects.get(pk=dirid).visibleby.remove(AgencyGroup.objects.get(pk=groupid))
# GET GROUPS
elif(request.GET.get("action") == "getgroupsofdir"):
dirid = request.GET.get('dirid')
allgroupsofdir = DataDir.objects.get(pk=dirid).visibleby.all()
grouopsid = []
for ag in allgroupsofdir:
grouopsid.append({"id" : ag.pk})
data = {"gdir" : grouopsid}
elif request.method == 'POST':
tempdir = False
tempdir = DataDir.objects.get(pk=parent)
tempdatafile = DataFile(file=request.FILES['uploadedfile'], name=request.FILES['uploadedfile'].name, owner=request.user, parent=tempdir, agency=request.user.profile.agency)
tempdatafile.save()
return JsonResponse({"success" : success, "data" : data})
def adddirbyajax(request):
return {"success" : success}
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
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

View File

@ -54,7 +54,8 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bootstrap_datepicker_plus'
'bootstrap_datepicker_plus',
'django_cleanup'
]
MIDDLEWARE = [

View File

@ -50,6 +50,7 @@ for(i = 0; i < data.length; i++){
//Creates nested array from data
function unflatten(arr) {
console.log(arr);
var tree = [],
mappedArr = {},
arrElem,

View File

@ -29,6 +29,22 @@ def has_group(user, group_name):
group = Group.objects.get(name=group_name)
return True if group in user.groups.all() else False
groupbool = False
@register.simple_tag
def setbool(value):
global groupbool
groupbool = value
return ''
@register.simple_tag
def getbool():
global groupbool
return groupbool
# usergperm
'''

View File

@ -8,7 +8,8 @@ from notificsys.models import UserNotification
from django.core.mail import send_mail
from django.template.loader import render_to_string
from tasks.models import Tasks
from cloud.models import DataFile
import os
# Deletes all Notifications added to to delete news
@receiver(pre_delete, sender=News)
def del_news_notifications(sender, instance, **kwargs):
@ -96,9 +97,6 @@ def adjust_group_notifications(instance, action, reverse, model, pk_set, using,
)
# SIGNAL FOR NEWS
@receiver(post_save, sender=News)
def save_news(sender, instance, **kwargs):
GLOBALSENDMAILS = True
@ -178,4 +176,12 @@ def adjust_group_notifications_task(instance, action, reverse, model, pk_set, us
[user_touched.email],
html_message=msg_html,
fail_silently=False
)
)
# SIGNLA WHEN FILE IS TO DELETE
#@receiver(pre_delete, sender=DataFile)
#def auto_delete_file_on_delete(sender, instance, **kwargs):
# if instance.file.file:
# if os.path.isfile(instance.file.path):
# os.remove(instance.file.path)