Dateisystem angefangen und weitergemacht, ein Bug bei Notifications behoben und Rechtesystem erweitert
This commit is contained in:
parent
52dc3e444e
commit
c4570154ff
Binary file not shown.
Binary file not shown.
|
|
@ -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 <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>{{ele.owner.first_name}} {{ele.owner.last_name}}</td>
|
||||
<td>{{ele.date_created}}</td>
|
||||
<td>Optionen</td>
|
||||
</tr>
|
||||
<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 %}
|
||||
</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">×</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>
|
||||
<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 %}
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
]
|
||||
|
|
|
|||
103
cloud/views.py
103
cloud/views.py
|
|
@ -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)})
|
||||
return context
|
||||
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'])
|
||||
|
||||
'''
|
||||
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="")
|
||||
# ALLOWED FILETYPES
|
||||
filecheckarr = [".txt", ".pdf", ".TXT", ".PDF", ".jpg", ".JPG", ".png", ".PNG", ".jpeg", ".JPEG", ".docx", ".odt", ".odf"]
|
||||
|
||||
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])
|
||||
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)
|
||||
|
||||
context.update({'active_link' : 'cloud', 'files': files, 'dirs_level' : dirs_level})
|
||||
'''
|
||||
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 {}
|
||||
|
||||
|
||||
|
||||
def adddirbyajax(request):
|
||||
return {"success" : success}
|
||||
|
|
|
|||
|
|
@ -3,15 +3,12 @@
|
|||
{% block content %}
|
||||
{% if request.user.profile.agency.module_quicklinks %}
|
||||
<div class="content-section col-12">
|
||||
<h3>Quicklinks</h3>
|
||||
<h3>Quicklinks <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> Quicklink</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -3,15 +3,12 @@
|
|||
|
||||
{% block content %}
|
||||
<div class="content-section col-12">
|
||||
<h3>Standards</h3>
|
||||
<h3>Standards <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> Standard</a>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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')
|
||||
]
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue