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" %} {% extends "users/base.html" %}
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% load counter_tag %}
{% block content %} {% block content %}
<style>
.icon-hover:hover{
color: gray;
}
</style>
<div class="content-section col-12"> <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> <hr>
<p> {% if user|usergperm:"filesmanager" %}
Hier können Sie Dateien und Ordner für ihre Agentur verwalten.
</p>
<form method="POST" id="fileuploadform" enctype="multipart/form-data" class="col-6"> <form method="POST" id="fileuploadform" enctype="multipart/form-data" class="col-6">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="subdirinfo" value="{{level}}">
{{form.media}} {{form.media}}
{{form|crispy}} {{form|crispy}}
<div class="mt-2"> <div class="mt-2">
<button class="btn btn-primary" type="submit">Hochladen</button> <button class="btn btn-primary" type="submit">Hochladen</button>
<small>Dateien werden immer in das aktuelle Verzeichnis hochgeladen.</small>
</div> </div>
</form> </form>
<div class="mt-4"> {% endif %}
<p> <div class="mt-4">
{% 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"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
@ -29,29 +52,114 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for dir in dirs_level %} {% for dir in dirs %}
<tr> <tr>
<td><i class="fas fa-folder"></i></td> <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> </tr>
{% endfor %} {% endfor %}
{% for ele in files %} {% for ele in files %}
<tr> <tr>
<td><i class="fas fa-file"></i></td> <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.owner.first_name}} {{ele.owner.last_name}}</td>
<td>{{ele.date_created}}</td> <td>{{ele.date_created}}</td>
<td>Optionen</td> <td>
</tr> {% 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 %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% else %}
<div class="alert alert-primary" role="alert">
Für Ihre Agentur wurden noch keine Dateien hochgeladen.
</div>
{% endif %}
</p> </p>
</div> </div>
</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 %} {% endblock content %}

View File

@ -1,6 +1,8 @@
from django.urls import path from django.urls import path
from .views import CloudMain from .views import CloudMain
from . import views
urlpatterns = [ urlpatterns = [
path('<str:level>/', CloudMain.as_view(template_name="cloud/cloud_main.html"), name='cloud-main'), 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,80 +10,73 @@ from .forms import CloudAddFileForm
from django.conf import settings from django.conf import settings
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from digitaleagentur.settings import BASE_DIR from digitaleagentur.settings import BASE_DIR
from django.http import JsonResponse
import os 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): class CloudMain(LoginRequiredMixin, FormView):
form_class = CloudAddFileForm form_class = CloudAddFileForm
success_url = '/cloud/0' success_url = '/cloud/home'
def form_valid(self, form): def form_valid(self, form):
form = CloudAddFileForm(self.request.POST, self.request.FILES['file']) 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() tempdata.save()
return super().form_valid(form) return super().form_valid(form)
# Change context and return for template-data # Change context and return for template-data
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
agency_id = self.request.user.profile.agency.pk agency_id = self.request.user.profile.agency.pk
if(self.kwargs['level'] == "home"): if self.request.is_ajax() == False:
print(list_files(os.path.dirname(BASE_DIR+"/media/agencydata/agency_"+str(agency_id)+"/files/"), 0)) agencyfiles = Data.objects.filter(agency__pk=agency_id)
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)})
return context
dirs = []
files = []
'''
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: dirs = os.listdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\")
tempstr = str(d.file) if(self.kwargs['level'] != "home"):
dirs_level.append(tempstr.split("/")[3]) dirs = os.listdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\"+self.kwargs['level'])
else:
subdir = self.kwargs["level"] # ALLOWED FILETYPES
files = Data.objects.filter(agency__pk=agency_id, file__startswith="agencydata/agency_"+str(agency_id)+"/files/"+subdir) filecheckarr = [".txt", ".pdf", ".TXT", ".PDF", ".jpg", ".JPG", ".png", ".PNG", ".jpeg", ".JPEG", ".docx", ".odt", ".odf"]
dirs = Data.objects.filter(agency__pk=agency_id).exclude(subdir="")
for d in dirs: for d in dirs:
tempstr = str(d.file) for fa in filecheckarr:
dirs_level.append(tempstr.split("/")[4]) 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)
else:
os.mkdir(BASE_DIR+"\\media\\agencydata\\agency_"+str(agency_id)+"\\files\\" + adddirname + "\\" + newdirname)
return {}
context.update({'active_link' : 'cloud', 'files': files, 'dirs_level' : dirs_level})
'''
def adddirbyajax(request):
return {"success" : success}

View File

@ -3,15 +3,12 @@
{% block content %} {% block content %}
{% if request.user.profile.agency.module_quicklinks %} {% if request.user.profile.agency.module_quicklinks %}
<div class="content-section col-12"> <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> <hr>
<p>
Quicklinks helfen zur schnellen Verlinkung von oft genutzten Diensten.
</p>
{% if user|usergperm:"modulequicklinks" %} {% if user|usergperm:"modulequicklinks" %}
<div class="row"> <div class="row">
<div class="content-section col-4"> <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>
</div> </div>
{% endif %} {% endif %}

View File

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

View File

@ -3,15 +3,12 @@
{% block content %} {% block content %}
<div class="content-section col-12"> <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> <small>Sichtbar sind alle veröffentlichten und von {{ user.first_name }} {{ user.last_name}} erstellten Standards.</small>
<hr> <hr>
<p>
Standards dokumentieren und erläutern verschiedenen Verfahren, strukturiert nach Bereichen und Aufgaben.
</p>
<div class="row"> <div class="row">
<div class="content-section col-4"> <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>
</div> </div>
<hr> <hr>

View File

@ -1,6 +1,7 @@
from django import template from django import template
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from users.models import AgencyGroup from users.models import AgencyGroup
import os
register = template.Library() register = template.Library()
b = 0 b = 0
@ -50,6 +51,16 @@ def usergperm(user, perm):
def is_member(id, groupname): def is_member(id, groupname):
usertocheck = User.objects.get(pk=id) usertocheck = User.objects.get(pk=id)
return usertocheck.groups.filter(name=groupname).exists() 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: class Counter:
count = 0 count = 0

View File

@ -194,12 +194,14 @@ class AgencyGroup(models.Model):
permissions = [ permissions = [
('agencyinfo', 'Agenturinformationen verändern'), ('agencyinfo', 'Agenturinformationen verändern'),
('usermanager', 'Benutzer bearbeiten'), ('usermanager', 'Mitarbeiter bearbeiten'),
('groupmanager', 'Gruppen bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'),
('areaconfig', 'Bereiche bearbeiten'), ('structuremanager', 'Struktur bearbeiten'),
('activityconfig', 'Tätigkeiten bearbeiten'),
('standardmanager', 'Standards bearbeiten und freischalten'), ('standardmanager', 'Standards bearbeiten und freischalten'),
('modulenews', 'News bearbeiten und veröffentlichen'), ('modulenews', 'News bearbeiten und veröffentlichen'),
('modulesconfig', 'Module verwalten'), ('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) @receiver(post_save, sender=News)
def save_news(sender, instance, **kwargs): def save_news(sender, instance, **kwargs):
GLOBALSENDMAILS = True
if(kwargs["created"]): if(kwargs["created"]):
usersofagency = User.objects.filter(profile__agency__pk=instance.agency.pk) usersofagency = User.objects.filter(profile__agency__pk=instance.agency.pk)
for user in usersofagency: for user in usersofagency:
@ -126,7 +127,7 @@ def save_news(sender, instance, **kwargs):
# SIGNALS FOR TASK # SIGNALS FOR TASK
@receiver(signal=m2m_changed, sender=Tasks.usersfield.through) @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 # # IF FALSE NO MAILS WILL BE SEND - IN PRODUCTIVITY CHANGE TO TRUE #
GLOBALSENDMAILS = True GLOBALSENDMAILS = True

View File

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