Dateisystem einmal umgeschrieben und auf Objekte umgestellt, dragndrop angefangen

This commit is contained in:
holger.trampe 2020-02-15 00:21:57 +01:00
parent c4570154ff
commit 670b2bce6c
10 changed files with 221 additions and 92 deletions

View File

@ -1,6 +1,6 @@
from django.db import models
from django.contrib.auth.models import User
from users.models import Agency
from users.models import Agency, AgencyGroup
# Create your models here.
from django.db import models
from django.utils import timezone
@ -19,6 +19,36 @@ class Data(models.Model):
owner = models.ForeignKey(User, on_delete=models.PROTECT)
agency = models.ForeignKey(Agency, on_delete=models.CASCADE, default=None)
def __str__(self):
print(self.file.name)
def __str__(self):
return str(self.file.name)
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)
owner = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True)
agency = models.ForeignKey(Agency, on_delete=models.CASCADE)
parent = models.ForeignKey('DataDir', on_delete=models.CASCADE, blank=True, null=True, related_name='dir_in_dir')
def __str__(self):
return str(self.name)
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)
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')
def __str__(self):
return str(self.name)

View File

@ -2,6 +2,7 @@
{% load crispy_forms_tags %}
{% load counter_tag %}
{% block content %}
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<style>
.icon-hover:hover{
color: gray;
@ -10,38 +11,22 @@
<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>
{% if user|usergperm:"filesmanager" %}
<form method="POST" id="fileuploadform" enctype="multipart/form-data" class="col-6">
{% csrf_token %}
<input type="hidden" name="subdirinfo" value="{{level}}">
{{form.media}}
{{form|crispy}}
<div class="mt-2">
<button class="btn btn-primary" type="submit">Hochladen</button>
<small>Dateien werden immer in das aktuelle Verzeichnis hochgeladen.</small>
</div>
</form>
{% endif %}
<div class="mt-4">
<nav aria-label="breadcrumb">
</div>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item" aria-current="page"><a href="{% url 'cloud-main' level='home' %}"><i class="fas fa-home"></i></a></li>
{% for cr in crumplevel %}
{% if cr != 'home' %}
{{forloop.counter1|add:1}}
{% if forloop.last %}
<li class="breadcrumb-item" aria-current="page"><a href="{% url 'cloud-main' 'first' %}"><i class="fas fa-home"></i></a></li>
{% for cr in breadcrump %}
{% if forloop.last %}
<li class="breadcrumb-item" active>{{cr}}</li>
{% else %}
<li class="breadcrumb-item"><a href="{% url 'cloud-main' cr %}">{{cr}}</a></li>
{% endif %}
{% endif %}
{% else %}
<li class="breadcrumb-item"><a href="{% url 'cloud-main' cr.pk %}">{{cr.name}}</a></li>
{% endif %}
{% endfor %}
{% if user|usergperm:"filedirmanager" and user|usergperm:"filesviewer" %}
<li class="breadcrumb-item" active><i onclick="javascript:addDirModal()" class="fas fa-folder-plus icon-hover"></i></li>
{% endif %}
<li class="breadcrumb-item" active><i onclick="javascript:addDirModal()" class="fas fa-folder-plus icon-hover"></i></li>
</ol>
</nav>
<table class="table table-hover">
<table class="table table-hover" id="dirfilestable">
<thead>
<tr>
<th scope="col"></th>
@ -52,47 +37,31 @@
</tr>
</thead>
<tbody>
{% for dir in dirs %}
<tr>
<td><i class="fas fa-folder"></i></td>
<td><a href="{% url 'cloud-main' dir %}">{{dir|splitdirstyle}}</a></td>
<td></td>
<td></td>
<td>
{% if user|usergperm:"filedirmanager" and user|usergperm:"filesviewer" %}
<button type="button" class="btn btn-danger btn-sm" onclick="javascript:tryDelDir('{{dir|splitdirstyle}}')" data-toggle="tooltip" data-placement="top" title="Ordner löschen"><i class="fas fa-trash-alt"></i></button>
<button type="button" class="btn btn-primary btn-sm" onclick="javascript:changeDirName('{{dir|splitdirstyle}}')" data-toggle="tooltip" data-placement="top" title="Ordnernnamen andern"><small><i class="fas fa-pen"></i></small></button>
{% endif %}
</td>
</tr>
{% endfor %}
{% for ele in files %}
<tr>
<td><i class="fas fa-file"></i></td>
<td><a href="{{ele.file.url}}" download>{{ele.file|filename}}</a></td>
<td>{{ele.owner.first_name}} {{ele.owner.last_name}}</td>
<td>{{ele.date_created}}</td>
<td>
{% if user|usergperm:"filesmanager" and user|usergperm:"filesviewer" %}
<button type="button" class="btn btn-danger btn-sm" onclick="javascript:tryDelFile({{ele.pk}})" data-toggle="tooltip" data-placement="top" title="Datei löschen"><i class="fas fa-trash-alt"></i></button>
<button type="button" class="btn btn-primary btn-sm" onclick="javascript:changeFileName({{ele.pk}})" data-toggle="tooltip" data-placement="top" title="Dateinamen andern"><small><i class="fas fa-pen"></i></small></button>
{% endif %}
</td>
</tr>
{% endfor %}
{% for d in dirs %}
<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>
</tr>
{% endfor %}
{% for file in dir.DataFiles %}
<tr>
<td>
<i class="fas fa-file" ></i>{{file}}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</p>
</div>
</div>
<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.
</div>
<!-- MODEAL ADD DIR -->
<div class="modal fade" id="addDir" 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 {{crumplevel|last}} erstellen</h5>
<h5 class="modal-title" id="mainmodalArea_title">Ordner in TODO erstellen</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span>
</button>
@ -110,26 +79,77 @@
</div>
</div>
</div>
<script>
function tryDelFile(dataid){
console.log("FILE " + dataid);
}
//DROPPABLE
function changeFileName(dataid){
console.log("FILE " + dataid);
}
// preventing page from redirecting
$("html").on("dragover", function(e) {
e.preventDefault();
e.stopPropagation();
});
function tryDelDir(dataid){
console.log("DIR " + dataid);
}
$("html").on("drop", function(e) { e.preventDefault(); e.stopPropagation(); });
function changeDirName(dataid){
console.log("DIR " + dataid);
}
$( ".droppable_tr" ).on('dragenter', function (e) {
e.stopPropagation();
e.preventDefault();
currentid = e["currentTarget"]['id'];
$("#" + currentid + "_icon").html("");
$("#" + currentid + "_icon").html('<i class="fas fa-folder-open"></i>');
$("#" + currentid).addClass('table-secondary');
});
$('.droppable_tr').on('drop', function (e) {
e.stopPropagation();
e.preventDefault();
console.log("UPLOAD TO: DIR" + e["currentTarget"]['id']);
var file = e.originalEvent.dataTransfer.files;
$("#" + currentid).removeClass('table-secondary');
$("#" + currentid + "_icon").html("");
$("#" + currentid + "_icon").html('<i class="fas fa-folder"></i>');
});
$('.droppable_tr').on('dragleave', function (e) {
e.stopPropagation();
e.preventDefault();
currentid = e["currentTarget"]['id'];
$("#" + currentid + "_icon").html("");
$("#" + currentid + "_icon").html('<i class="fas fa-folder"></i>');
$("#" + currentid).removeClass('table-secondary');
});
$( ".droppable_div" ).on('dragenter', function (e) {
e.stopPropagation();
e.preventDefault();
currentid = e["currentTarget"]['id'];
$("#{{parentid}}_div").addClass('bg-secondary');
});
$('.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;
});
$('.droppable_div').on('dragleave', function (e) {
e.stopPropagation();
e.preventDefault();
currentid = e["currentTarget"]['id'];
$("#{{parentid}}_div").removeClass('bg-secondary');
});
// DIR FUNCTIONS
function addDirModal(){
$("#addDir").modal("toggle");
$("#newdirname").val("");
@ -143,23 +163,21 @@ function validateDirName(newdirname){
$("#doActionTaskModal").attr("disabled", true);
}
}
function addDirAction(){
$.ajax(
{
type: "GET",
url: "/cloud/clajax",
url: "{% url 'cloud-adddir' %}",
data:{
adddirname : "{{level}}",
newdirname : $("#newdirname").val()
action : "adddir",
parent : {{parentid}},
newdirname : $("#newdirname").val()
},
success: function( data )
{
window.location = window.location;
{
window.location = window.location;
}
});
}
</script>
{% endblock content %}
{% endblock %}

View File

@ -3,6 +3,6 @@ from .views import CloudMain
from . import views
urlpatterns = [
path('<str:level>/', CloudMain.as_view(template_name="cloud/cloud_main.html"), name='cloud-main'),
path('clajax/', views.adddirbyajax, name="cloud-ajax"),
path('<slug:pk>', CloudMain, name='cloud-main'),
path('clajax/', views.adddirbyajax, name="cloud-adddir"),
]

View File

@ -12,9 +12,79 @@ from django.core.files.storage import default_storage
from digitaleagentur.settings import BASE_DIR
from django.http import JsonResponse
import os
from .models import DataDir, DataFile
@login_required
def CloudMain(request, pk):
diragency = []
alldirs = []
context = {}
breadcrump = []
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)
context = {
'active_link' : 'cloud',
'dirs' : alldirs,
'parentid' : diragency.pk
}
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)
breadcrump = breadcrump[::-1]
context = {
'active_link' : 'cloud',
'dirs' : alldirs,
'parentid' : pk,
'breadcrump' : breadcrump
}
return render(request, 'cloud/cloud_main.html', context)
@login_required
def adddirbyajax(request):
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()
return JsonResponse({"success" : success})
''' CLOUD ALT '''
'''
class CloudMain(LoginRequiredMixin, FormView):
form_class = CloudAddFileForm
success_url = '/cloud/home'
@ -80,3 +150,7 @@ class CloudMain(LoginRequiredMixin, FormView):
def adddirbyajax(request):
return {"success" : success}
'''

View File

@ -133,7 +133,7 @@
{% else%}
<li class="nav-item">
{%endif%}
<a class="nav-link " href="{% url 'cloud-main' level='home' %}" aria-expanded="true">
<a class="nav-link " href="{% url 'cloud-main' 'first' %}" aria-expanded="true">
<i class="fas fa-file"></i>
<span>Dateien</span>
</a>

View File

@ -29,7 +29,7 @@ from django.template.loader import render_to_string
from io import StringIO
from users.models import AgencyJob, AgencyGroup
from django.contrib.auth.models import Group
from cloud.models import DataDir
def randomString(stringLength=10):
"""Generate a random string of fixed length """
@ -87,7 +87,16 @@ def toUpdate(request):
else:
print("default groups existing")
# INITIAL ROOT DIR
rootdir = DataDir.objects.filter(is_root=True, agency__pk=request.user.profile.agency.pk)
if(len(rootdir) == 0):
print("NO MAIN DIR FOUND - CREATE")
rootdir = DataDir(is_root=True, agency=request.user.profile.agency)
rootdir.save()
print("AGENCY ROOT DIR CREATED")
else:
print("MAIN ROOT DIR FOUND - FILESMODULE READY")
'''
DASHBOARD-View
@ -126,8 +135,6 @@ class AgencyCreateView(CreateView):
@login_required
def dashboard(request):