Dateisystem angefangen und weitergemacht, ein Bug bei Notifications behoben und Rechtesystem erweitert

This commit is contained in:
holger.trampe 2020-02-13 22:36:40 +01:00
parent 52dc3e444e
commit c4570154ff
16 changed files with 212 additions and 100 deletions

View File

@ -1,23 +1,46 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% load counter_tag %}
{% block content %}
<style>
.icon-hover:hover{
color: gray;
}
</style>
<div class="content-section col-12">
<h3>Dateien</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>
<p>
Hier können Sie Dateien und Ordner für ihre Agentur verwalten.
</p>
{% 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">
<p>
{% if files %}
<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" active>{{cr}}</li>
{% else %}
<li class="breadcrumb-item"><a href="{% url 'cloud-main' cr %}">{{cr}}</a></li>
{% endif %}
{% 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 %}
</ol>
</nav>
<table class="table table-hover">
<thead>
<tr>
@ -29,29 +52,114 @@
</tr>
</thead>
<tbody>
{% for dir in dirs_level %}
{% for dir in dirs %}
<tr>
<td><i class="fas fa-folder"></i></td>
<td><a href="{% url 'cloud-main' dir %}">{{dir}}</a></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>{{ele.file}}</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>Optionen</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 %}
</tbody>
</table>
{% else %}
<div class="alert alert-primary" role="alert">
Für Ihre Agentur wurden noch keine Dateien hochgeladen.
</div>
{% endif %}
</p>
</div>
</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>
<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="newdirname" type="text" value="" placeholder="Ordnername" onkeyup="javascript:validateDirName(this.value, 0)">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Abrechen</button>&nbsp;
<button id="doActionTaskModal" type="button" class="btn btn-success" data-dismiss="modal" onclick="javascript:addDirAction()" disabled="true">Ordner anlegen</button>
</div>
</div>
</div>
</div>
<script>
function tryDelFile(dataid){
console.log("FILE " + dataid);
}
function changeFileName(dataid){
console.log("FILE " + dataid);
}
function tryDelDir(dataid){
console.log("DIR " + dataid);
}
function changeDirName(dataid){
console.log("DIR " + dataid);
}
function addDirModal(){
$("#addDir").modal("toggle");
$("#newdirname").val("");
}
function validateDirName(newdirname){
if(newdirname.length > 0){
$("#doActionTaskModal").attr("disabled", false);
}
else{
$("#doActionTaskModal").attr("disabled", true);
}
}
function addDirAction(){
$.ajax(
{
type: "GET",
url: "/cloud/clajax",
data:{
adddirname : "{{level}}",
newdirname : $("#newdirname").val()
},
success: function( data )
{
window.location = window.location;
}
});
}
</script>
{% endblock content %}

View File

@ -1,6 +1,8 @@
from django.urls import path
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"),
]

View File

@ -10,39 +10,18 @@ from .forms import CloudAddFileForm
from django.conf import settings
from django.core.files.storage import default_storage
from digitaleagentur.settings import BASE_DIR
from django.http import JsonResponse
import os
'''
import os
def list_files(startpath):
for root, dirs, files in os.walk(startpath):
level = root.replace(startpath, '').count(os.sep)
indent = ' ' * 4 * (level)
print('{}{}/'.format(indent, os.path.basename(root)))
subindent = ' ' * 4 * (level + 1)
for f in files:
print('{}{}'.format(subindent, f))
'''
def list_files(startpath, deep):
for root, dirs, files in os.walk(startpath):
level = root.replace(startpath, '').count(os.sep)
if(level <= deep+1 and (deep != 0 and(level > 0))):
print(level)
print(os.path.basename(root))
for f in files:
print(f)
class CloudMain(LoginRequiredMixin, FormView):
form_class = CloudAddFileForm
success_url = '/cloud/0'
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="", agency=self.request.user.profile.agency, owner=self.request.user)
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)
@ -50,40 +29,54 @@ class CloudMain(LoginRequiredMixin, FormView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
agency_id = self.request.user.profile.agency.pk
if(self.kwargs['level'] == "home"):
print(list_files(os.path.dirname(BASE_DIR+"/media/agencydata/agency_"+str(agency_id)+"/files/"), 0))
else:
print(list_files(os.path.dirname(BASE_DIR+"/media/agencydata/agency_"+str(agency_id)+"/files/"+self.kwargs['level']),2))
context.update({'active_link' : 'cloud', 'files': list_files("agencydata/agency_"+str(agency_id)+"/", 2)})
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
'''
dirs_level = []
files = ""
subdir = ""
files_correcteddirname = []
agency_id = self.request.user.profile.agency.pk
if(self.kwargs["level"] == "home"):
files = Data.objects.filter(agency__pk=agency_id, subdir="")
for f in files:
tempstr = str(f.file)
files_correcteddirname.append(tempstr.split("/")[3])
dirs = Data.objects.filter(agency__pk=agency_id).exclude(subdir="")
for d in dirs:
tempstr = str(d.file)
dirs_level.append(tempstr.split("/")[3])
else:
subdir = self.kwargs["level"]
files = Data.objects.filter(agency__pk=agency_id, file__startswith="agencydata/agency_"+str(agency_id)+"/files/"+subdir)
dirs = Data.objects.filter(agency__pk=agency_id).exclude(subdir="")
for d in dirs:
tempstr = str(d.file)
dirs_level.append(tempstr.split("/")[4])
context.update({'active_link' : 'cloud'})
adddirname = self.request.GET.get("adddirname")
newdirname = self.request.GET.get("newdirname")
context.update({'active_link' : 'cloud', 'files': files, 'dirs_level' : dirs_level})
'''
if(adddirname == "home"):
os.mkdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\" + newdirname)
else:
os.mkdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\" + adddirname + "\\" + newdirname)
return {}
def adddirbyajax(request):
return {"success" : success}

View File

@ -3,15 +3,12 @@
{% block content %}
{% if request.user.profile.agency.module_quicklinks %}
<div class="content-section col-12">
<h3>Quicklinks</h3>
<h3>Quicklinks&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Quicklinks helfen zur schnellen Verlinkung von oft genutzten Diensten." class="far fa-question-circle"></i></small></h3>
<hr>
<p>
Quicklinks helfen zur schnellen Verlinkung von oft genutzten Diensten.
</p>
{% if user|usergperm:"modulequicklinks" %}
<div class="row">
<div class="content-section col-4">
<a class="btn btn-primary" href="{% url 'ql-addql' %}">Quicklink anlegen</a>
<a class="btn btn-primary" href="{% url 'ql-addql' %}"><i class="fas fa-plus"></i>&nbsp;Quicklink</a>
</div>
</div>
{% endif %}

View File

@ -1,7 +1,7 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section col-6">
<div class="content-section col-8">
<h3>Neuen Standard anlegen</h3>
<hr>
<form method="POST" id="taskareaform">

View File

@ -3,15 +3,12 @@
{% block content %}
<div class="content-section col-12">
<h3>Standards</h3>
<h3>Standards&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Standards dokumentieren und erläutern verschiedenen Verfahren, strukturiert nach Bereichen und Aufgaben." class="far fa-question-circle"></i></small></h3>
<small>Sichtbar sind alle veröffentlichten und von {{ user.first_name }} {{ user.last_name}} erstellten Standards.</small>
<hr>
<p>
Standards dokumentieren und erläutern verschiedenen Verfahren, strukturiert nach Bereichen und Aufgaben.
</p>
<div class="row">
<div class="content-section col-4">
<a class="btn btn-primary" href="{% url 'standard-add' %}">Standard anlegen</a>
<a class="btn btn-primary" href="{% url 'standard-add' %}"><i class="fas fa-plus"></i>&nbsp;Standard</a>
</div>
</div>
<hr>

View File

@ -1,6 +1,7 @@
from django import template
from django.contrib.auth.models import Group, User
from users.models import AgencyGroup
import os
register = template.Library()
b = 0
@ -50,6 +51,16 @@ def usergperm(user, perm):
def is_member(id, groupname):
usertocheck = User.objects.get(pk=id)
return usertocheck.groups.filter(name=groupname).exists()
# Return a Filename splitted to only see the LAST element!
@register.filter(name="splitdirstyle")
def split_dir_style(dirtosplit):
tempsplit = dirtosplit.split("\\")
return tempsplit[len(tempsplit)-1]
@register.filter(name="filename")
def filename(value):
return os.path.basename(value.file.name)
'''
class Counter:
count = 0

View File

@ -194,12 +194,14 @@ class AgencyGroup(models.Model):
permissions = [
('agencyinfo', 'Agenturinformationen verändern'),
('usermanager', 'Benutzer bearbeiten'),
('usermanager', 'Mitarbeiter bearbeiten'),
('groupmanager', 'Gruppen bearbeiten'),
('areaconfig', 'Bereiche bearbeiten'),
('activityconfig', 'Tätigkeiten bearbeiten'),
('structuremanager', 'Struktur bearbeiten'),
('standardmanager', 'Standards bearbeiten und freischalten'),
('modulenews', 'News bearbeiten und veröffentlichen'),
('modulesconfig', 'Module verwalten'),
('modulequicklinks', 'Quicklinks bearbeiten')
('modulequicklinks', 'Quicklinks bearbeiten'),
('filesmanager', 'Dateien bearbeiten'),
('filedirmanager', 'Ordner bearbeiten'),
('filesviewer', 'Dateien lesen')
]

View File

@ -101,6 +101,7 @@ def adjust_group_notifications(instance, action, reverse, model, pk_set, using,
@receiver(post_save, sender=News)
def save_news(sender, instance, **kwargs):
GLOBALSENDMAILS = True
if(kwargs["created"]):
usersofagency = User.objects.filter(profile__agency__pk=instance.agency.pk)
for user in usersofagency:
@ -126,7 +127,7 @@ def save_news(sender, instance, **kwargs):
# SIGNALS FOR TASK
@receiver(signal=m2m_changed, sender=Tasks.usersfield.through)
def adjust_group_notifications(instance, action, reverse, model, pk_set, using, *args, **kwargs):
def adjust_group_notifications_task(instance, action, reverse, model, pk_set, using, *args, **kwargs):
# IF FALSE NO MAILS WILL BE SEND - IN PRODUCTIVITY CHANGE TO TRUE #
GLOBALSENDMAILS = True

View File

@ -1,4 +1,5 @@
{% load static %}
{% load counter_tag %}
<!DOCTYPE html>
<html lang="de">
<head>
@ -126,14 +127,14 @@
</li>
{% endif %}
{% if request.user.profile.agency.module_files %}
{% if request.user.profile.agency.module_files and request.user|usergperm:"filesviewer" %}
{% if active_link == 'cloud' %}
<li class="nav-item active">
{% else%}
<li class="nav-item">
{%endif%}
<a class="nav-link " href="{% url 'cloud-main' level='home' %}" aria-expanded="true">
<i class="fas fa-cloud"></i>
<i class="fas fa-file"></i>
<span>Dateien</span>
</a>
</li>