Zwischencommit 2 Agenturverbund

This commit is contained in:
holger.trampe 2020-04-11 14:41:03 +02:00
parent 2497365a61
commit 963f308126
23 changed files with 718 additions and 117 deletions

View File

@ -52,7 +52,7 @@ a.disabled {
</ol>
</nav>
{% if user|usergperm:"filesviewer" %}
<table class="table table-hover" id="dirfilestable">
<table class="table hover" id="dirfilestable">
<thead>
<tr>
<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>
@ -438,6 +438,13 @@ a.disabled {
</div>
</div>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
<script>
var actquotasize = {{actquota}};
@ -466,6 +473,28 @@ if ( isIE ) {
autohide: true,
delay : 5000
});
$('#dirfilestable').DataTable({
responsive : true,
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ of _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
});
function clearSearchfieldAddFile(){

View File

@ -18,6 +18,7 @@ from django.conf import settings
from django.http import FileResponse
from standards.models import Standards
from django.contrib import messages
import os
'''
Prüft, ob ein Nutzer in diesen Ordner Zugriffsrechte hat. Läuft den gesamten Strang bis nach oben,

View File

@ -19,10 +19,12 @@
</thead>
<tbody id="">
{% for agn_s in outstanding %}
<tr>
<tr id="agnprep_{{agn_s.pk}}">
<td>{{agn_s.wanted_agency.name}}</td>
<td>
<a type="button" href="{% url 'acceptinvite' agn_s.target_network.pk agn_s.wanted_agency.pk agn_s.pk %}" class="btn btn-primary">Annehmen</a>&nbsp;<a href="{% url 'delinvite' agn_s.pk %}" type="button" class="btn btn-secondary">Ablehnen</a>
<a type="button" href="{% url 'acceptinvite' agn_s.target_network.pk agn_s.wanted_agency.pk agn_s.pk %}" class="btn btn-primary">Annehmen</a>
&nbsp;<button onclick="javascript:checkRemInv('{{agn_s.wanted_agency.name}}', {{agn_s.pk}})" type="button" class="btn btn-secondary">Ablehnen</button>
</td>
</tr>
{% endfor %}
@ -32,34 +34,49 @@
{% endif %}
<hr>
<h5>Agenturen im Verbund</h5>
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Agenturname</th>
<th scope="col">Nur Mitglied</th>
<th scope="col">Inhalte teilen</th>
<th scope="col">Administratives Mitglied</th>
<th scope="col">&nbsp;</th>
</tr>
</thead>
<tbody id="">
{% for agn_s in allagofagn %}
<tr>
<td>{{agn_s.name}}</td>
<td style="text-align: center;"><input class="form-check-input" type="radio" name="inlineRadioOptions_{{agn_s.pk}}" id="" value="option1"></td>
<td style="text-align: center;"><input class="form-check-input" type="radio" name="inlineRadioOptions_{{agn_s.pk}}" id="" value="option2"></td>
<td style="text-align: center;"><input class="form-check-input" type="radio" name="inlineRadioOptions_{{agn_s.pk}}" id="" value="option3"></td>
<td>
<button style="float: right" class="btn btn-secondary btn-sm " onclick="javascript:showDelAgFromAgn('{{agn_s.name}}')"><small><i class="fas fa-trash"></i></small></button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<hr>
<h5>Agenturen im Verbund{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Verwalten Sie die Agenturen in Ihrem Verbund. Wählen Sie aus, ob Agenturen nur Mitglied sind oder ob sie Inhalte in den Verbund teilen dürfen. Alternativ können Sie eine Agentur als Administratives Mitglied festlegen. Dann kann diese Agentur ebenfalls alle Einstellungen des Agenturverbunds anpassen." class="far fa-question-circle"></i></small>{% endif %}</h5>
<div class="table-responsive">
<table class="table hover" id="agnetworkagencys">
<thead>
<tr>
<th scope="col">Agenturname</th>
<th scope="col" style="text-align: center;">Nur Mitglied</th>
<th scope="col" style="text-align: center;">Inhalte teilen</th>
<th scope="col" style="text-align: center;">Administratives Mitglied</th>
<th scope="col">&nbsp;</th>
</tr>
</thead>
<tbody>
{% for agn_s in allagofagn %}
{% ifaginadminagn agn.pk agn_s.pk as is_adminag %}
{% ifmember agn.pk agn_s.pk as is_member %}
{% ifsharemember agn.pk agn_s.pk as is_sharemember %}
<tr id="agn_{{agn_s.pk}}">
<td>{{agn_s.name}}</td>
<td style="text-align: center;"><input class="form-check-input" type="radio" name="inlineRadioOptions_{{agn_s.pk}}" id="" value="option1" onchange="javascript:updateAgAgnRights({{agn_s.pk}}, 0)" {% if agn_s == request.user.profile.agency %} disabled="true" {% endif %}
{% if is_member %} checked {% endif %}
></td>
<td style="text-align: center;"><input class="form-check-input" type="radio" name="inlineRadioOptions_{{agn_s.pk}}" id="" value="option2" onchange="javascript:updateAgAgnRights({{agn_s.pk}}, 1)" {% if agn_s == request.user.profile.agency %} disabled="true" {% endif %}
{% if is_sharemember %} checked {% endif %}
></td>
<td style="text-align: center;"><input class="form-check-input" type="radio" name="inlineRadioOptions_{{agn_s.pk}}" id="" value="option3" onchange="javascript:updateAgAgnRights({{agn_s.pk}}, 2)" {% if agn_s == request.user.profile.agency %} disabled="true" checked {% endif %}
{% if is_adminag %} checked {% endif %}
></td>
<td>
{% if agn_s != request.user.profile.agency %}
<button style="float: right" class="btn btn-secondary btn-sm " onclick="javascript:showDelAgFromAgn('{{agn_s.name}}', {{agn_s.pk}})"><small><i class="fas fa-trash"></i></small></button>
{%endif%}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<a href="{% url 'dasettings' %}" type="button" class="btn btn-primary">Zurück zu Verbünden</a>
</div>
@ -76,16 +93,127 @@
Agentur <span id="agname">NAME</span> aus Verbund {{agn.name}} entfernen?
</div>
<div class="modal-footer">
<a type="button" class="btn btn-secondary" data-dismiss="modal" href="#">Agentur entfernen</a>&nbsp;
<button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="javascript:doRemAgFromAgn()">Agentur entfernen</button>&nbsp;
<button type="button" class="btn btn-success" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="checkInv" 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="exampleModalLongTitle">Anfrage ablehnen</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">
Agentur <span id="agname_invite">NAME</span> wirklich nicht zum Agenturverbund {{agn.name}} hinzufügen?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="javascript:doRemInv()">Anfrage löschen</button>&nbsp;
<button type="button" class="btn btn-success" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
<script type="text/javascript">
function showDelAgFromAgn(name)
$(document).ready(function(){
$('#agnetworkagencys').DataTable({
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
});
var workingagid = "";
function updateAgAgnRights(agency, newstatus){
$.ajax(
{
type: "GET",
url: "{% url 'dasettings-agnajax' %}",
data:{
action: "changeagrights",
agency : agency,
newstatus : newstatus,
agnid : {{agn.pk}}
},
success: function( data )
{
}
});
}
function checkRemInv(name, id){
workingagid = id;
$("#agname_invite").html(name);
$("#checkInv").modal("toggle");
}
function doRemInv(){
$.ajax(
{
type: "GET",
url: "{% url 'dasettings-agnajax' %}",
data:{
action: "removeinv",
agn_inv : workingagid,
},
success: function( data )
{
location.href = location.href;
}
});
}
function doRemAgFromAgn(){
$.ajax(
{
type: "GET",
url: "{% url 'dasettings-agnajax' %}",
data:{
action: "remove_ag_from_agn",
agid : workingagid,
agnid : {{agn.pk}}
},
success: function( data )
{
$("#delAgFromAgn").modal("toggle");
$("#agn_" + workingagid).remove();
}
});
}
function showDelAgFromAgn(name, id)
{
workingagid = id;
$("#agname").html(name);
$("#delAgFromAgn").modal("toggle");
}

View File

@ -8,7 +8,7 @@
<h4>Ihre Agenturverbünde</h4>
<div class="table-responsive">
<table class="table table-hover">
<table class="table hover" id="agntable">
<thead>
<tr>
<th scope="col">Name</th>
@ -24,11 +24,10 @@
</thead>
<tbody id="">
{% for agn in agencynetworks %}
{% getsumofallag agn.pk as agsum %}
{% getsumofallstandards agn.pk as ag_standardsum %}
{% getsumofallag agn.pk as agsum %}
{% getoutstandinginvites agn.pk as outstanding %}
{% ifaginadminagn agn.pk request.user.profile.agency.pk as is_adminag %}
<tr>
<tr id="agn_{{agn.pk}}">
<td>{{agn.name}}</td>
<td>
{% if is_adminag %}
@ -40,13 +39,15 @@
<td>{{agn.creator_agency.name }}</td>
<td>{{agn.creator.first_name }} {{agn.creator.last_name }}</td>
<td>{{agn.created_on }}</td>
<td>{{agn.last_activity}}</td>
<td>{{agn.lastactivity}}</td>
<td>{% if is_adminag %} <a href="{% url 'managagn' agn.pk %}"><i class="far fa-eye"></i>&nbsp;&nbsp;{% endif %} {% if outstanding %}<i class="fas fa-info-circle" data-toggle="tooltip" data-placement="top" title="Es gibt ausstehende Einladung."></i> {% endif %}&nbsp;&nbsp;{{agsum}}{% if is_adminag %}</a>{% endif %}</td>
<td>{{ag_standardsum}}</td>
<td>{{agn.standards.all|length}}</td>
<td>
{% if is_adminag %}
<a style="float: right; margin-left: 5px" class="btn btn-secondary btn-sm" href="{% url 'updateagn' agn.pk %}"><small><i class="fas fa-pen"></i></small></a>
<a style="float: right" class="btn btn-secondary btn-sm " href="{% url 'delagn' agn.pk %}"><small><i class="fas fa-trash"></i></small></a>
<a style="float: right; margin-left: 5px" class="btn btn-secondary btn-sm" href="{% url 'updateagn' agn.pk %}" data-toggle="tooltip" data-placement="top" title="Verbund bearbeiten"><small><i class="fas fa-pen"></i></small></a>
<a style="float: right; margin-left: 5px" class="btn btn-secondary btn-sm " data-toggle="tooltip" data-placement="top" title="Verbund löschen" href="{% url 'delagn' agn.pk %}"><small><i class="fas fa-trash"></i></small></a>
{% else %}
<button style="float: right; margin-left: 5px" class="btn btn-secondary btn-sm " data-toggle="tooltip" data-placement="top" title="Treten Sie aus diesem Verbund aus." onclick="javascript:showDelAgFromAgn('{{agn.name}}', {{agn.pk}})"><small><i class="fas fa-door-open"></i></small></button>
{% endif %}
</td>
</tr>
@ -79,7 +80,36 @@
</div>
<div class="modal fade" id="delAgFromAgn" 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="exampleModalLongTitle">Aus Agenturverbund austreten</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">
Möchten Sie den Agenturverbund <b><span id="agname">NAME</span></b> verlassen?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="javascript:doRemAgFromAgn()">Ja, Agenturverbund verlassen</button>&nbsp;
<button type="button" class="btn btn-success" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var workingid = "";
function showDelAgFromAgn(name, id){
workingid = id;
$("#delAgFromAgn").modal("toggle");
$("#agname").html(name);
}
function copyLinkToCB(tocopy, id){
var val = "{{baseurl}}dasettings/agnni/" + tocopy;
var $temp = $("<input>");
@ -90,6 +120,24 @@
$("#aglink_" + id).show();
}
function doRemAgFromAgn(){
$.ajax(
{
type: "GET",
url: "{% url 'dasettings-agnajax' %}",
data:{
action: "remove_ag_from_agn",
agid : {{request.user.profile.agency.pk}},
agnid : workingid
},
success: function( data )
{
$("#delAgFromAgn").modal("toggle");
$("#agn_" + workingid).remove();
}
});
}
function showAgnLink(name, tocopy, id){
$("#aglink_mod").hide();
$("#agn_name").html(name);
@ -97,7 +145,39 @@
$("#showAGNLink").modal("toggle");
}
$(document).ready(function(){
$('#agntable').DataTable({
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
});
</script>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
<!--
name = models.CharField(default="", max_length=200)
adminagencys = models.ManyToManyField("Agency", related_name="AdministrationAgencys")

View File

@ -15,8 +15,8 @@
<h6><b>Gegründet von</b> {{agn.creator.first_name }} {{agn.creator.last_name }}</h6>
<h6><b>Grüdungsdatum</b> {{agn.created_on }}</h6>
<h6><b>Agenturen</b> {{agsum}}</h6>
<h6><b>Standards</b> {{ag_standardsum}}</h6>
<h6><b>Letzte Aktivität</b> {{agn.last_activity}}</h6>
<h6><b>Standards</b> {{agn.standards.all|length}}</h6>
<h6><b>Letzte Aktivität</b> {{agn.lastactivity}}</h6>
</div>
</div>
{% if agn.publicjoin %}

View File

@ -45,8 +45,8 @@ noclickeffect:active { border-style: outset !important;}
</div>
<div id="area_content_{{area.pk}}" class="collapse" data-labelledby="area_{{area.pk}}" data-parent="#sortableAreas">
<div class="card-body">
<button class="btn btn-primary" onclick="javascript:addTask({{area.pk}})" data-toggle="tooltip" data-placement="top" title="Neue Tätigkeit hinzufügen."><i class="fas fa-plus"></i>&nbsp;Tätigkeit</button>
<table class="table table-hover mt-2" id="areatask_{{area.pk}}_table">
<button class="btn btn-primary mb-4" onclick="javascript:addTask({{area.pk}})" data-toggle="tooltip" data-placement="top" title="Neue Tätigkeit hinzufügen."><i class="fas fa-plus"></i>&nbsp;Tätigkeit</button>
<table class="table hover" id="areatask_{{area.pk}}_table">
<thead>
<tr>
<th scope="col">Name</th>
@ -251,6 +251,15 @@ noclickeffect:active { border-style: outset !important;}
</div>
</div>
</div>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
<script>
var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);
@ -745,4 +754,31 @@ function mainmodalAreaSave(){
});
}
}
$(document).ready(function(){
{% for area in agencyareas %}
$('#areatask_{{area.pk}}_table').DataTable({
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
{% endfor %}
});
</script>

View File

@ -1,12 +1,9 @@
{% load counter_tag %}
<a href="{% url 'newuserfirst' %}"class="btn btn-primary active" data-toggle="tooltip" data-placement="top" title="Fügen Sie hier einen weiteren Mitarbeiter Ihrer Agentur hinzu."><i class="fas fa-plus"></i>&nbsp;Mitarbeiter</a>
<hr>
<div class="row">
<div class="form-group mb-2">
<input class="form-control" id="tableSearch" size="50" type="text" placeholder="Suche in Tabelle...">
</div>
<div class="row">
<div class="table-responsive">
<table class="table table-hover">
<table class="table hover" id="usertableall">
<thead>
<tr>
<th scope="col">Name</th>
@ -40,14 +37,42 @@
</table>
</div>
</div>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
<script>
$(document).ready(function(){
$("#tableSearch").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#tableresults tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
$('#usertableall').DataTable({
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
});
});
</script>

View File

@ -15,12 +15,13 @@ urlpatterns = [
path('delagn/<int:pk>', permission_required('users.agencynetwork')(views.DelAgencyNetwork), name='delagn'),
path('changeus/<int:pk>/', permission_required('users.usermanager')(views.UserChangeMain), name='changeusermaindata'),
path('ajax/', views.SettingsAjaxRouter, name="dasettings-ajax"),
path('agnafjax/', views.AgencyNetworkAjaxSettings, name="dasettings-agnajax"),
path('usprof/<int:pk>/<int:newuser>', permission_required('users.usermanager')(views.UserProfileUpdate), name="user_updateprofile"),
path('agnni/<slug:networkid>/', permission_required('users.agencynetwork')(views.AddMyAgencyToAgn), name='addagnecytoagnetwork'),
path('joinagn/<int:pk>', permission_required('users.agencynetwork')(views.JoinAGN), name='joinagn'),
path('managnag/<int:pk>', permission_required('users.agencynetwork')(views.ManageAgInAgn), name='managagn'),
path('managnag/acceptinv/<int:network>/<int:targetag>/<int:aginvpk>', permission_required('users.agencynetwork')(views.AddAgToNetwork), name='acceptinvite'),
path('managnag/deli/<int:pk>', permission_required('users.agencynetwork')(views.DelAgInv), name='delinvite'),
path('managnag/delfromagn/<int:agn>/<int:ag>', permission_required('users.agencynetwork')(views.DelFromAgn), name='delagfromagn'),
#path('managnag/delfromagn/<int:agn>/<int:ag>', permission_required('users.agencynetwork')(views.DelFromAgn), name='delagfromagn'),
]

View File

@ -708,13 +708,7 @@ def AddAgToNetwork(request, network, targetag, aginvpk):
agn.members.add(Agency.objects.get(pk=targetag))
AgencyNetworkPreperation.objects.get(pk=aginvpk).delete()
context = {
'active_link' : 'dasettings',
'agn' : agn,
'outstanding': AgencyNetworkPreperation.objects.filter(target_network=network)
}
return render(request, 'dasettings/agencynetwork_agmanagement_content.html', context)
return redirect('managagn', network)
@login_required
def DelAgInv(request, pk):
@ -725,4 +719,42 @@ def DelAgInv(request, pk):
@login_required
def DelFromAgn(request, agn, ag):
return redirect('managagn', agn)
return redirect('managagn', agn)
@login_required
def AgencyNetworkAjaxSettings(request):
success = False
data = {}
if request.method == 'GET' and request.GET['action'] == "remove_ag_from_agn":
agency = Agency.objects.get(pk=request.GET['agid'])
agencynetwork = AgencyNetwork.objects.get(pk=request.GET['agnid'])
if(agency != None and agencynetwork != None):
agencynetwork.members.remove(agency)
agencynetwork.adminagencys.remove(agency)
agencynetwork.sharemembers.remove(agency)
success = True
elif request.method == 'GET' and request.GET['action'] == "removeinv":
AgencyNetworkPreperation.objects.get(pk=request.GET['agn_inv']).delete()
success = True
elif request.method == 'GET' and request.GET['action'] == "changeagrights":
print("UPDATE")
agency = Agency.objects.get(pk=request.GET['agency'])
agn = AgencyNetwork.objects.get(pk=request.GET['agnid'])
if(agency != None and agn != None):
agn.members.remove(agency)
agn.adminagencys.remove(agency)
agn.sharemembers.remove(agency)
if (request.GET['newstatus'] == "0"):
agn.members.add(agency)
elif (request.GET['newstatus'] == "1"):
agn.sharemembers.add(agency)
elif (request.GET['newstatus'] == "2"):
agn.adminagencys.add(agency)
success = True
else:
success = False
return JsonResponse(data)

View File

@ -4,14 +4,13 @@
<div class="content-section col-10">
<div class="row"><div class="content-section col-9">
{% if user|usergperm:"moduleorganizer" %}
<a class="btn btn-primary mb-3" href="{% url 'add-agpass' %}"><i class="fas fa-plus"></i>&nbsp;Passwort</a>
<a class="btn btn-primary " href="{% url 'add-agpass' %}"><i class="fas fa-plus"></i>&nbsp;Passwort</a>
{% endif %}
<div class="form-group mb-2">
<input class="form-control" id="passwords_search" style="max-width: 400px;" size="20" type="text" onkeyup="" placeholder="Suche nach Passwort...">
</div>
</div></div>
<hr>
<div class="table-responsive" style="min-height: 400px;">
<table class="table table-hover">
<table class="table hover" id="pstable">
<thead>
<tr>
<th scope="col">Name</th>
@ -204,12 +203,26 @@ function changeGroup(groupid, value){
}
$(document).ready(function(){
$("#passwords_search").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#table_passwords tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
$('#pstable').DataTable({
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
});
$('[data-toggle="popover"]').popover();
@ -217,4 +230,12 @@ function changeGroup(groupid, value){
});
</script>
</script>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>

View File

@ -4,16 +4,14 @@
<div class="content-section col-4">
<a class="btn btn-primary" href="{% url 'ql-addql' %}"><i class="fas fa-plus"></i>&nbsp;Quicklink</a>
<div class="form-group mb-2 mt-3">
<input class="form-control" id="quicklinks_search" size="50" type="text" placeholder="Suche nach Qiucklinks...">
</div>
</div>
</div>
{% endif %}
<div class="row col-9" >
<hr>
<div class="row col-9 " >
<div class="table-responsive">
<table class="table table-hover">
<table class="table table-hover" id="qltable">
<thead>
<tr>
<th scope="col">Name</th>
@ -57,15 +55,30 @@
<script>
$(document).ready(function(){
$("#quicklinks_search").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#table_quicklinks tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
$('#qltable').DataTable({
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
});
});
function saveDefQL(){
/*
$.ajax(
@ -82,3 +95,11 @@ function saveDefQL(){
});*/
}
</script>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>

View File

@ -10,6 +10,14 @@ import datetime
from django.utils import timezone
#from ckeditor_uploader.fields import RichTextUploadingField
class StandardComments(models.Model):
standard = models.ForeignKey("Standards", on_delete=models.CASCADE)
content = models.CharField(max_length=200, blank=False, default="")
comment_by = models.ForeignKey(User, on_delete=models.CASCADE)
comment_on = models.DateTimeField(default=timezone.now, blank=True)
last_modified_on = models.DateTimeField(default=timezone.now, blank=True)
rated = models.IntegerField()
class Standards(models.Model):
agency = models.ForeignKey(Agency, on_delete=models.CASCADE)
@ -54,6 +62,11 @@ class Standards(models.Model):
indi_name = models.CharField(max_length=200, blank=False, default="")
indi_conmtent = models.CharField(max_length=500, blank=False, default="")
# FIELD FOR AGENCYNETWORK
comments = models.ManyToManyField("StandardComments", blank=True, related_name='comments')
parent_standard = models.ForeignKey("Standards", related_name='partentedstandard', on_delete=models.PROTECT, blank=True, null=True, default=None)
agencynetworkcounter = models.IntegerField(default=0)
def __str__(self):
return f'{self.name}'

View File

@ -9,8 +9,8 @@
</nav>
<h4>Standards aus dem Bereich {{areaname}}</h4>
<hr>
<div class="row">
<table class="table">
<div class="row ml-1">
<table class="table hover" id="standardstable">
<thead>
<tr>
<th scope="col">Titel</th>
@ -50,6 +50,37 @@
</table>
</div>
</div>
<script type="text/javascript">
$(document).ready( function () {
$('#standardstable').DataTable({
responsive: true,
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
} );
</script>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
{% endblock content %}

View File

@ -10,8 +10,8 @@
</nav>
<h4>Standards aus dem Aufgabenbereich {{taskname}} des Bereichs {{areaname}}</h4>
<hr>
<div class="row">
<table class="table">
<div class="row ml-1">
<table class="table hover " id="standardstable">
<thead>
<tr>
<th scope="col">Titel</th>
@ -51,4 +51,35 @@
</table>
</div>
</div>
<script type="text/javascript">
$(document).ready( function () {
$('#standardstable').DataTable({
responsive: true,
"language": {
"search" : "Suche",
"info": "Zeige _START_ bis _END_ of _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
} );
</script>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
{% endblock content %}

View File

@ -166,6 +166,21 @@
</div>
</div>
<div class="card">
<div class="card-header" id="st_agencynetwork">
<h5 class="mb-0">
<button class="btn btn-link collapsed" type="button" data-toggle="collapse" data-target="#agnetwork_content" aria-expanded="false" aria-controls="agnetwork_content">
<i class="fas fa-users"></i>&nbsp;Agenturverbund{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Wählen Sie hier aus, in welchen Agenturverbund dieser Standard geteilt werden soll." class="far fa-question-circle"></i></small>{% endif %}
</button>
</h5>
</div>
<div id="agnetwork_content" class="collapse" aria-labelledby="st_agencynetwork" data-parent="#additionalStandardInfos">
<div class="card-body">
Das Zuweisen zu einem Agenturverbund ist erst nach dem Anlegen eines neuen Standards möglich.
</div>
</div>
</div>
</div></div>
<p>Wenn ein Standard erstellt wurde, kann er nur von einer Person mit dem Recht <i>Standards bearbeiten und freischalten</i> veröffentlicht werden.</p>
<hr>

View File

@ -81,11 +81,9 @@
{% endfor %}
<div class="tab-pane fade" id="t_userown" role="tabpanel" aria-labelledby="userown">
<h4 class="mt-4 mb-4">Eigene Standards</h4>
<div class="form-group mb-2">
<input class="form-control" id="tableSearch" size="20" type="text" placeholder="Suche in Tabelle...">
</div>
<div class="table-responsive">
<table class="table table-hover">
<table class="table hover" id="userownstandards">
<thead>
<tr>
<th scope="col">Titel</th>
@ -134,11 +132,9 @@
</div>
<div class="tab-pane fade" id="t_agencys" role="tabpanel" aria-labelledby="userown">
<h4 class="mt-4 mb-4">Unveröffentlichte Standards</h4>
<div class="form-group mb-2">
<input class="form-control" id="tableSearch_s" size="20" type="text" placeholder="Suche in Tabelle...">
</div>
<div class="table-responsive">
<table class="table table-hover">
<table class="table hover" id="unpubstandardsofuser">
<thead>
<tr>
<th scope="col">Titel</th>
@ -222,19 +218,47 @@
$('[data-toggle="popover"]').popover();
$("#tableSearch").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#tableresults tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
});
$('#userownstandards').DataTable({
responsive: true,
"language": {
"search" : "Suche",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
$('#unpubstandardsofuser').DataTable({
responsive: true,
"language": {
"search" : "Suche",
"zeroRecords": "Nichts gefunden",
"infoEmpty": "Keine Einträge",
"info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
"lengthMenu": "Zeige _MENU_ Einträge",
"paginate": {
"first": "Erste",
"last": "Letzte",
"next": "Nächste",
"previous": "Zurück"
},
},
"buttons" : {
"className" : "btn-danger"
}
});
$("#tableSearch_s").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#tableresults_s tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
});
})
@ -244,4 +268,12 @@
});
</script>
<style>
/* DATATABLES */
.paginate_button {
padding: 0px !important;
border: 0px !important;
}
</style>
{% endblock content %}

View File

@ -162,6 +162,45 @@
</div>
</div>
<div class="card">
<div class="card-header" id="st_agencynetwork">
<h5 class="mb-0">
<button class="btn btn-link collapsed" type="button" data-toggle="collapse" data-target="#agnetwork_content" aria-expanded="false" aria-controls="agnetwork_content">
<i class="fas fa-users"></i>&nbsp;Agenturverbund{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Wählen Sie hier aus, in welchen Agenturverbund dieser Standard geteilt werden soll." class="far fa-question-circle"></i></small>{% endif %}
</button>
</h5>
</div>
<div id="agnetwork_content" class="collapse" aria-labelledby="st_agencynetwork" data-parent="#additionalStandardInfos">
<div class="card-body">
{% if not standard.public %}
Nur veröffentlichte Standards können geteilt werden.
{% else %}
{% for agn in agencynetworks %}
{% ifaginadminagn agn.pk request.user.profile.agency.pk as is_admin %}
{% ifsharemember agn.pk request.user.profile.agency.pk as is_sharemember %}
{% ifstandardinagn agn.pk standard.pk as standard_in_agn %}
{% if is_admin or is_sharemember %}
<div class="custom-control custom-checkbox mb-2">
<input type="checkbox" class="custom-control-input groupclass" onclick="javascript:standardAgn({{agn.pk}}, this.checked)" name="agn_{{agn.pk}}" id="agn_{{agn.pk}}" {% if standard_in_agn %} checked {% endif %} >
<label class="custom-control-label" for="agn_{{agn.pk}}" >{{agn.name}}</label>
</div>
{% else %}
<i class="fas fa-lock" data-toggle="tooltip" data-placement="top" title="In diesen Verbund dürfen Sie nichts teilen."></i>&nbsp;{{agn.name}}
{% endif %}
{% endfor %}
{% endif %}
</div>
</div>
</div>
</div>
<p>Wenn ein Standard bearbeitet wurde, kann er nur von einer Person mit dem Recht <i>Standards bearbeiten und freischalten</i> wieder veröffentlicht werden. Ein Standard wird nach Bearbeitung als <i>Nicht veröffentlicht</i> gesetzt.</p>
<hr>
@ -313,6 +352,20 @@
<script type="text/javascript">
function standardAgn(id, newstat){
console.log(id, newstat);
$.ajax({
url: "{% url 'update_standard_by_ajax' standard.pk %}",
data: {
action : 's_addtonetwork',
agn_id : id,
newstat : newstat
},
success: function (data) {}
});
}
var ua = window.navigator.userAgent;
var isIE = /MSIE|Trident/.test(ua);
if ( isIE ) {

View File

@ -120,6 +120,39 @@ def ifaginadminagn(agn_id, agencyid):
return agency_is_admin
@register.simple_tag
def ifmember(agn_id, agencyid):
agn = AgencyNetwork.objects.get(pk=agn_id)
ag = Agency.objects.get(pk=agencyid)
ismember = False
if ag in agn.members.all():
ismember = True
return ismember
@register.simple_tag
def ifsharemember(agn_id, agencyid):
agn = AgencyNetwork.objects.get(pk=agn_id)
ag = Agency.objects.get(pk=agencyid)
sharemember = False
if ag in agn.sharemembers.all():
sharemember = True
return sharemember
@register.simple_tag
def ifstandardinagn(agn_id, standardid):
agn = AgencyNetwork.objects.get(pk=agn_id)
s = Standards.objects.get(pk=standardid)
isin = False
if s in agn.standards.all():
isin = True
return isin
@register.simple_tag
def getoutstandinginvites(agnetwork):
outstanding = False

View File

@ -10,7 +10,7 @@ from django.contrib.auth.decorators import login_required
from tasks.models import Tasks
from areas.models import Areas
from datetime import datetime
from users.models import AgencyGroup
from users.models import AgencyGroup, AgencyNetwork
from cloud.models import DataFile, DataDir
from django.contrib.auth.decorators import login_required
@ -283,6 +283,9 @@ def StandardUpdate(request, id):
if pv not in standard.representative.all():
possible_ver_final.append(pv)
agencynetworks = AgencyNetwork.objects.filter(creator_agency=request.user.profile.agency) | AgencyNetwork.objects.filter(adminagencys__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(members__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(sharemembers__in=[request.user.profile.agency.pk])
context = {
'normalForm' : normalForm,
@ -297,7 +300,8 @@ def StandardUpdate(request, id):
'poss_verant' : possible_verant_final,
'poss_ex' : possible_ex_final,
'poss_ver' : possible_ver_final,
'possiblestandards' : possiblestandards_final
'possiblestandards' : possiblestandards_final,
"agencynetworks" : agencynetworks
}
return render(request, 'standards/standards_update.html', context)
@ -440,7 +444,18 @@ def updatesbyajax(request, pk):
workingstandard.representative.remove(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency))
elif(request.GET["action"] == "s_addver"):
workingstandard.representative.add(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency))
else:
# ADD STANDARD TO AGENCYNETWORK
elif(request.GET["action"] == "s_addtonetwork"):
if workingstandard.public and request.user.profile.agency == workingstandard.agency:
agn = AgencyNetwork.objects.get(pk=request.GET["agn_id"])
if(request.GET["newstat"] == "true"):
agn.standards.add(workingstandard)
else:
agn.standards.remove(workingstandard)
agn.lastactivity = datetime.now()
agn.save()
else:
success = False
return JsonResponse({"success" : success})
return JsonResponse({"success" : success})

View File

@ -57,6 +57,7 @@ class AgencyNetwork(models.Model):
sharemembers = models.ManyToManyField("Agency", related_name="ShareMemberAgencys", blank=True)
publicjoin = models.BooleanField(default=False)
networkid = models.CharField(default="", max_length=30)
standards = models.ManyToManyField("standards.Standards", related_name="sharedstandards", blank=True)
def __str__(self):
return f'{self.name}'

View File

@ -192,4 +192,6 @@ right connector from last child*/
/*Thats all. I hope you enjoyed it.
Thanks :)*/
Thanks :)*/

View File

@ -52,8 +52,9 @@
<!--<link rel="stylesheet" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css">-->
<!-- DATATABLES -->
<!--<link href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css" rel="stylesheet">
<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet">-->
<link href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css" rel="stylesheet">
<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet">
<!-- Custom styles for this template-->
<link href="{% static 'users/css/sb-admin-2.css' %}" rel="stylesheet">