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 import forms
from django.forms import ModelForm from django.forms import ModelForm
from .models import Data from .models import Data, DataFile
class CloudAddFileForm(forms.ModelForm): class CloudAddFileForm(forms.ModelForm):

View File

@ -8,7 +8,7 @@ from django.utils import timezone
def user_directory_path(instance, filename): def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/agency_<id>/files/<subdirs>/<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): class Data(models.Model):
@ -28,7 +28,6 @@ class DataDir(models.Model):
name = models.CharField(max_length=2000, default="", blank=True, null=True) name = models.CharField(max_length=2000, default="", blank=True, null=True)
is_root = models.BooleanField(default=False) is_root = models.BooleanField(default=False)
dirs = models.ManyToManyField('self', blank=True, related_name='dirs_in_dirs', symmetrical = 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') visibleby = models.ManyToManyField(AgencyGroup, blank=True, related_name='visible_by_user')
date_created = models.DateTimeField(default = timezone.now) date_created = models.DateTimeField(default = timezone.now)
date_last_modified = 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): class DataFile(models.Model):
name = models.CharField(max_length=2000, default="", blank=True, null=True) 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_created = models.DateTimeField(default = timezone.now)
date_last_modified = models.DateTimeField(default = timezone.now) date_last_modified = models.DateTimeField(default = timezone.now)
owner = models.ForeignKey(User, on_delete=models.PROTECT) owner = models.ForeignKey(User, on_delete=models.PROTECT, default=None, blank=True, null=True)
agency = models.ForeignKey(Agency, on_delete=models.CASCADE, default=None) 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') parent = models.ForeignKey(DataDir, on_delete=models.PROTECT, related_name='thisfileindir', blank=True, null=True)
def __str__(self): def __str__(self):
return str(self.name) return str(self.name)

View File

@ -1,13 +1,32 @@
{% extends "users/base.html" %} {% extends "users/base.html" %}
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% load counter_tag %} {% load counter_tag %}
{% load static %}
{% block content %} {% block content %}
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <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> <style>
.icon-hover:hover{ .icon-hover:hover{
color: gray; color: gray;
} }
a.disabled {
pointer-events: none;
cursor: default;
}
</style> </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"> <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> <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> <hr>
@ -23,45 +42,215 @@
<li class="breadcrumb-item"><a href="{% url 'cloud-main' cr.pk %}">{{cr.name}}</a></li> <li class="breadcrumb-item"><a href="{% url 'cloud-main' cr.pk %}">{{cr.name}}</a></li>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% if user|usergperm:"filedirmanager" %}
<li class="breadcrumb-item" active><i onclick="javascript:addDirModal()" class="fas fa-folder-plus icon-hover"></i></li> <li class="breadcrumb-item" active><i onclick="javascript:addDirModal()" class="fas fa-folder-plus icon-hover"></i></li>
{% endif %}
</ol> </ol>
</nav> </nav>
{% if user|usergperm:"filesviewer" %}
<table class="table table-hover" id="dirfilestable"> <table class="table table-hover" id="dirfilestable">
<thead> <thead>
<tr> <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">Name</th>
<th scope="col">Eigentümer</th> <th scope="col">Eigentümer</th>
<th scope="col">Datum</th> <th scope="col">Erstellt</th>
<th scope="col"></th> <th scope="col">Geändert</th>
<th></th>
</tr> </tr>
</thead> </thead>
<tbody> <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"> <tr id="dir_{{d.pk}}" class="droppable_tr">
<td id="dir_{{d.pk}}_icon"><i class="fas fa-folder" ></i></td> <td id="dir_{{d.pk}}_icon"><i class="fas fa-folder" ></i>
<td><a href="{% url 'cloud-main' d.pk %}">{{d.name}}</a></td> </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> </tr>
{% endfor %} {% endfor %}
{% for file in dir.DataFiles %} {% for file in files %}
<tr> <tr>
<td> <td>
<i class="fas fa-file" ></i>{{file}} <i class="fas fa-file" ></i>
</td> </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> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </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;"> {% endif %}
<i class="fas fa-plus"></i>&nbsp;Dateien ins aktuelle Verzeichnis hier hineinziehen. {% 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> </div>
{% endif %}
<!-- MODEAL ADD DIR --> <!-- MODAL CHANGE DIRNAME -->
<div class="modal fade" id="addDir" tabindex="-1" role="dialog" data-backdrop="static" aria-labelledby="" aria-hidden="true"> <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-dialog " role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <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"> <button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
@ -79,8 +268,153 @@
</div> </div>
</div> </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> <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 // preventing page from redirecting
$("html").on("dragover", function(e) { $("html").on("dragover", function(e) {
@ -91,6 +425,10 @@
$("html").on("drop", function(e) { e.preventDefault(); e.stopPropagation(); }); $("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) { $( ".droppable_tr" ).on('dragenter', function (e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
@ -104,8 +442,8 @@
$('.droppable_tr').on('drop', function (e) { $('.droppable_tr').on('drop', function (e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
console.log("UPLOAD TO: DIR" + e["currentTarget"]['id']); uploadtoparent = e["currentTarget"]['id'].split("_")[1];
var file = e.originalEvent.dataTransfer.files; uploadAction(e.originalEvent.dataTransfer.files[0], e["currentTarget"]['id'].split("_")[1]);
$("#" + currentid).removeClass('table-secondary'); $("#" + currentid).removeClass('table-secondary');
$("#" + currentid + "_icon").html(""); $("#" + currentid + "_icon").html("");
$("#" + currentid + "_icon").html('<i class="fas fa-folder"></i>'); $("#" + 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) { $('.droppable_div').on('drop', function (e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
$("#{{parentid}}_div").removeClass('bg-secondary'); $("#{{parentid}}_div").removeClass('bg-secondary');
console.log("UPLOAD TO: DIR " + {{parentid}}); uploadAction(e.originalEvent.dataTransfer.files[0], e["currentTarget"]['id'].split("_")[0]);
var file = e.originalEvent.dataTransfer.files;
}); });
$('.droppable_div').on('dragleave', function (e) { $('.droppable_div').on('dragleave', function (e) {
@ -145,29 +481,190 @@ $('.droppable_div').on('dragleave', function (e) {
$("#{{parentid}}_div").removeClass('bg-secondary'); $("#{{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 // 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(){ function addDirModal(){
$("#addDir").modal("toggle"); $("#addDir").modal("toggle");
$("#newdirname").val(""); $("#newdirname").val("");
$("#doActionTaskModal").attr("disabled", true)
} }
function validateDirName(newdirname){
if(newdirname.length > 0){ //VALIDATE FOR CORRECT INPUT IN GROUP
$("#doActionTaskModal").attr("disabled", false); 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); $("#doActionTaskModal").attr("disabled", true);
} }
} }
function addDirAction(){ function addDirAction(){
$.ajax( $.ajax(
{ {
type: "GET", type: "GET",
url: "{% url 'cloud-adddir' %}", url: "{% url 'cloud-adddir' parentid %}",
data:{ data:{
action : "adddir", action : "adddir",
parent : {{parentid}}, parent : {{parentid}},

View File

@ -5,4 +5,5 @@ from . import views
urlpatterns = [ urlpatterns = [
path('<slug:pk>', CloudMain, name='cloud-main'), path('<slug:pk>', CloudMain, name='cloud-main'),
path('clajax/', views.adddirbyajax, name="cloud-adddir"), 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 from django.http import JsonResponse
import os import os
from .models import DataDir, DataFile from .models import DataDir, DataFile
from datetime import datetime
from users.models import AgencyGroup
@login_required @login_required
def CloudMain(request, pk): def CloudMain(request, pk):
@ -20,137 +22,166 @@ def CloudMain(request, pk):
alldirs = [] alldirs = []
context = {} context = {}
breadcrump = [] breadcrump = []
files = []
if(pk == "first"): if(pk == "first"):
diragency = list(DataDir.objects.filter(is_root=True, agency=request.user.profile.agency))[0] 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 = { context = {
'active_link' : 'cloud', 'active_link' : 'cloud',
'dirs' : alldirs, '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: else:
alldirs = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=pk)
singleObj = DataDir.objects.get(pk=pk) # CHECK IF USER HAS RIGHTS TO SEE THIS DIR
while( singleObj.is_root != True): groupsofdir = list(DataDir.objects.filter(pk=pk, agency=request.user.profile.agency))[0]
breadcrump.append(singleObj)
singleObj = DataDir.objects.get(pk=singleObj.parent.pk)
breadcrump = breadcrump[::-1] userisingroup = False
context = { if len(groupsofdir.visibleby.all()) == 0:
'active_link' : 'cloud', userisingroup = True
'dirs' : alldirs, else:
'parentid' : pk, for ag in groupsofdir.visibleby.all():
'breadcrump' : breadcrump 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) return render(request, 'cloud/cloud_main.html', context)
@login_required @login_required
def adddirbyajax(request): def adddirbyajax(request, parent):
success = True success = True
if(request.method == "GET"): data = {}
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 JsonResponse({"success" : success}) 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"):
''' CLOUD ALT ''' data = {'agencydirlist' : loadAgencyDirList(request)}
''' # RETURN FILENAME
class CloudMain(LoginRequiredMixin, FormView): elif(request.GET.get("action") == "getname_file"):
form_class = CloudAddFileForm fileobj = DataFile.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency)
success_url = '/cloud/home' data = {'filename' : fileobj.name}
# DELETE FILE
def form_valid(self, form): elif(request.GET.get("action") == "del_file"):
form = CloudAddFileForm(self.request.POST, self.request.FILES['file']) DataFile.objects.filter(pk=request.GET.get('id')).delete()
tempdata = Data(file=self.request.FILES['file'], subdir="/"+self.request.POST.get("subdirinfo")+"/", agency=self.request.user.profile.agency, owner=self.request.user) # CHANGE DIR NAME
tempdata.save() elif(request.GET.get("action") == "change_dir_name"):
return super().form_valid(form) dirobj = DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency)
dirobj.name = request.GET.get("newdirname")
# Change context and return for template-data dirobj.date_last_modified = datetime.now()
def get_context_data(self, **kwargs): dirobj.save()
context = super().get_context_data(**kwargs) # DELETE DIR
agency_id = self.request.user.profile.agency.pk elif(request.GET.get("action") == "del_dir"):
if self.request.is_ajax() == False: try:
agencyfiles = Data.objects.filter(agency__pk=agency_id) 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()
dirs = [] DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency).delete()
files = [] except:
success = False
dirs = os.listdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\") # MOVE DIR
if(self.kwargs['level'] != "home"): elif(request.GET.get("action") == "movefile"):
dirs = os.listdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\"+self.kwargs['level']) tempdatafile = DataFile.objects.get(pk=request.GET.get('fileid'))
tempdatafile.parent = DataDir.objects.get(pk=request.GET.get('newpar'))
# ALLOWED FILETYPES tempdatafile.date_last_modified = datetime.now()
filecheckarr = [".txt", ".pdf", ".TXT", ".PDF", ".jpg", ".JPG", ".png", ".PNG", ".jpeg", ".JPEG", ".docx", ".odt", ".odf"] tempdatafile.save()
# GROUPS
for d in dirs: # DIR
for fa in filecheckarr: elif(request.GET.get("action") == "changedirgroups"):
if fa in d: dirid = request.GET.get('dirid')
templevel = self.kwargs["level"].split("\\") groupid = request.GET.get('groupid')
templevel_final = templevel[len(self.kwargs["level"].split("\\"))-1] value = request.GET.get('value')
if(templevel_final == "home"): if(value == "true"):
templevel_final = "" DataDir.objects.get(pk=dirid).visibleby.add(AgencyGroup.objects.get(pk=groupid))
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)
else: else:
os.mkdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\" + adddirname + "\\" + newdirname) DataDir.objects.get(pk=dirid).visibleby.remove(AgencyGroup.objects.get(pk=groupid))
# GET GROUPS
return {}
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): def loadAgencyDirList(request):
return {"success" : success} 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.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'bootstrap_datepicker_plus' 'bootstrap_datepicker_plus',
'django_cleanup'
] ]
MIDDLEWARE = [ MIDDLEWARE = [

View File

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

View File

@ -29,6 +29,22 @@ def has_group(user, group_name):
group = Group.objects.get(name=group_name) group = Group.objects.get(name=group_name)
return True if group in user.groups.all() else False 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 # usergperm
''' '''

View File

@ -8,7 +8,8 @@ from notificsys.models import UserNotification
from django.core.mail import send_mail from django.core.mail import send_mail
from django.template.loader import render_to_string from django.template.loader import render_to_string
from tasks.models import Tasks from tasks.models import Tasks
from cloud.models import DataFile
import os
# Deletes all Notifications added to to delete news # Deletes all Notifications added to to delete news
@receiver(pre_delete, sender=News) @receiver(pre_delete, sender=News)
def del_news_notifications(sender, instance, **kwargs): 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 # SIGNAL FOR NEWS
@receiver(post_save, sender=News) @receiver(post_save, sender=News)
def save_news(sender, instance, **kwargs): def save_news(sender, instance, **kwargs):
GLOBALSENDMAILS = True GLOBALSENDMAILS = True
@ -178,4 +176,12 @@ def adjust_group_notifications_task(instance, action, reverse, model, pk_set, us
[user_touched.email], [user_touched.email],
html_message=msg_html, html_message=msg_html,
fail_silently=False 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)