Dateilösung fertig inkl. Rechte usw, DIV-Bug bei Module gelöst, Profil zweispaltig gemacht
This commit is contained in:
parent
670b2bce6c
commit
de04d397bb
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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):
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 <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> {{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> 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> 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> Umbenennen
|
||||
</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
|
||||
<span aria-hidden="true">×</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>
|
||||
<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">×</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>
|
||||
<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">×</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>
|
||||
<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">×</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">×</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">×</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> <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+')"> '+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}},
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
]
|
||||
|
|
|
|||
251
cloud/views.py
251
cloud/views.py
|
|
@ -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
|
||||
Binary file not shown.
|
|
@ -54,7 +54,8 @@ INSTALLED_APPS = [
|
|||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'bootstrap_datepicker_plus'
|
||||
'bootstrap_datepicker_plus',
|
||||
'django_cleanup'
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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
|
||||
'''
|
||||
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue