0.8.2 für QS mit Gruppen für Passwort

This commit is contained in:
holger.trampe 2020-03-26 18:48:23 +01:00
parent 485782b43c
commit 166b6ff1fc
21 changed files with 166 additions and 33 deletions

18
.gitignore vendored
View File

@ -1,6 +1,6 @@
media/agencydata/* media/agencydata/*
media/agencymain/*
!media/agencymain/default.jpg !media/agencymain/default.jpg
!media/agencymain/ag_default.jpg
!media/agencymain/linkdefault.png !media/agencymain/linkdefault.png
digitaleagentur/__pycache__/* digitaleagentur/__pycache__/*
@ -14,14 +14,6 @@ areas/migrations/*
!areas/migrations/__init__.py !areas/migrations/__init__.py
areas/__pycache__/* areas/__pycache__/*
news/migrations/*
!news/migrations/__init__.py
news/__pycache__/*
quicklinks/migrations/*
!quicklinks/migrations/__init__.py
quicklinks/__pycache__/*
standards/migrations/* standards/migrations/*
!standards/migrations/__init__.py !standards/migrations/__init__.py
standards/__pycache__/* standards/__pycache__/*
@ -43,6 +35,14 @@ notificsys/migrations/*
notificsys/__pycache__/* notificsys/__pycache__/*
dasettings/migrations/* dasettings/migrations/*
news/migrations/*
!news/migrations/__init__.py
news/__pycache__/*
quicklinks/migrations/*
!quicklinks/migrations/__init__.py
quicklinks/__pycache__/*
!dasettings/migrations/__init__.py !dasettings/migrations/__init__.py
dasettings/__pycache__/* dasettings/__pycache__/*

View File

@ -325,7 +325,7 @@ a.disabled {
<div class="modal-dialog " role="document"> <div class="modal-dialog " role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Zugriffe einschränken</h5> <h5 class="modal-title" id="exampleModalLongTitle">Zugriff einschränken</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Schließen"> <button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>

View File

@ -19,6 +19,7 @@
-o-transition: all linear .2s; -o-transition: all linear .2s;
transition: all linear .2s; transition: all linear .2s;
} }
noclickeffect:active { border-style: outset !important;}
.colorPickSelector:hover { transform: scale(1.1); } .colorPickSelector:hover { transform: scale(1.1); }
</style> </style>
@ -34,8 +35,8 @@
<h5 class="mb-0" style="opacity:1.0;"> <h5 class="mb-0" style="opacity:1.0;">
<small><span style="color: #FFFFFF;"><i class="fas fa-sort"></i>&nbsp;&nbsp;&nbsp;&nbsp;</span></small> <small><span style="color: #FFFFFF;"><i class="fas fa-sort"></i>&nbsp;&nbsp;&nbsp;&nbsp;</span></small>
<button class="btn btn-link " data-toggle="collapse" data-target="#area_content_{{area.pk}}" aria-expanded="false" aria-controls="area_content_{{area.pk}}"><small><span style="color: #FFFFFF;"><i class="fas fa-chevron-down"></i></span></small></button> <button class="btn noclickeffect" data-toggle="collapse" data-target="#area_content_{{area.pk}}" aria-expanded="false" aria-controls="area_content_{{area.pk}}"><small><span style="color: #FFFFFF;"><i class="fas fa-chevron-down"></i></span></small></button>
<button class="btn btn-link" data-toggle="collapse" data-target="#area_content_{{area.pk}}" aria-expanded="false" aria-controls="area_content_{{area.pk}}"> <button class="btn noclickeffect" data-toggle="collapse" data-target="#area_content_{{area.pk}}" aria-expanded="false" aria-controls="area_content_{{area.pk}}">
<span id="areaname_{{area.pk}}" style="color: #ffffff">Bereich <b>{{area.name}}&nbsp;</b></span> <span id="areaname_{{area.pk}}" style="color: #ffffff">Bereich <b>{{area.name}}&nbsp;</b></span>
</button> </button>
<button type="button" style="float: right" class="btn btn-light btn-sm" onclick="javascript:addArea({{area.pk}})" data-toggle="tooltip" data-placement="top" title="Bereichsnamen und -farbe ändern"><small><i class="fas fa-pen"></i></small></button> <button type="button" style="float: right" class="btn btn-light btn-sm" onclick="javascript:addArea({{area.pk}})" data-toggle="tooltip" data-placement="top" title="Bereichsnamen und -farbe ändern"><small><i class="fas fa-pen"></i></small></button>

View File

@ -175,21 +175,14 @@ GRAPPELLI_CLEAN_INPUT_TYPES = False
# EMAILs # EMAILs
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
'''
EMAIL_HOST = 'smtp.strato.de' EMAIL_HOST = 'smtp.strato.de'
EMAIL_PORT = 587 EMAIL_PORT = 587
EMAIL_USE_TLS = True EMAIL_USE_TLS = True
EMAIL_HOST_USER = "support@digitale-agentur.com" EMAIL_HOST_USER = "support@digitale-agentur.com"
EMAIL_HOST_PASSWORD = "aPx9m3!7x3m@8o!t" EMAIL_HOST_PASSWORD = "aPx9m3!7x3m@8o!t"
DEFAULT_FROM_EMAIL = "support@digitale-agentur.com" DEFAULT_FROM_EMAIL = "support@digitale-agentur.com"
'''
EMAIL_HOST = 'gymhum.de'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "holger.trampe"
EMAIL_HOST_PASSWORD = "Motte2016_!"
DEFAULT_FROM_EMAIL = "holger.trampe@gymhum.de"
# FOR DATEPICKER # FOR DATEPICKER
BOOTSTRAP4 = { BOOTSTRAP4 = {

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -10,7 +10,7 @@
<input class="form-control" id="passwords_search" style="max-width: 400px;" size="20" type="text" onkeyup="" placeholder="Suche nach Passwort..."> <input class="form-control" id="passwords_search" style="max-width: 400px;" size="20" type="text" onkeyup="" placeholder="Suche nach Passwort...">
</div> </div>
</div></div> </div></div>
<div class="table-responsive"> <div class="table-responsive" style="min-height: 400px;">
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
@ -28,6 +28,23 @@
</thead> </thead>
<tbody id="table_passwords"> <tbody id="table_passwords">
{% for ap in agpass %} {% for ap in agpass %}
{% setbool False %}
{% for passgrous in ap.visibleby.all %}
{% if user|has_group:passgrous.group.name %}
{% setbool True %}
{% endif %}
{% endfor %}
{% if ap.visibleby.all|length == 0 %}
{% setbool True %}
{% endif %}
{% getbool as groupchecker %}
{% if groupchecker %}
<tr> <tr>
<td>{{ap.name }}</td> <td>{{ap.name }}</td>
<td><a href="{{ap.link }}" target="_blank">{{ap.link}}</a></td> <td><a href="{{ap.link }}" target="_blank">{{ap.link}}</a></td>
@ -51,6 +68,7 @@
</a> </a>
<div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink"> <div class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" href="{% url 'aggpass-update' ap.pk %}">Bearbeiten</a> <a class="dropdown-item" href="{% url 'aggpass-update' ap.pk %}">Bearbeiten</a>
<a class="dropdown-item" href="javascript:showGroupChangeModal({{ap.pk}})">Zugriff einschränken</a>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="{% url 'pass-delete' ap.pk %}" >Löschen</a> <a class="dropdown-item text-danger" href="{% url 'pass-delete' ap.pk %}" >Löschen</a>
</div> </div>
@ -59,6 +77,10 @@
</div> </div>
</td> </td>
</tr> </tr>
{% else %}
<tr><td id="pass_{{ap.pk}}" class="droppable_tr" data-toggle="popover" data-placement="top" data-trigger="hover" title="Zugriffsbeschränkung" data-content="Zugriff beschränkt auf {% for passgroup in ap.visibleby.all %}{{passgroup.agencygroupname}}{% if forloop.counter < d.visibleby.all|length %}, {%endif%}{% endfor %}">
<span class="text-secondary"><i class="fas fa-lock"></i>&nbsp;{{ap.name}}</span></td><td></td><td></td><td></td><td></td></tr>
{% endif %}
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
@ -68,7 +90,94 @@
</div> </div>
</div> </div>
<div class="modal fade" id="changeGroupOfPass" 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">Zugriff einschränken</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">
Welche Gruppen dürfen auf dieses Passwort zugreifen?
<p><small>Ist keine Gruppe ausgewählt, darf jeder der Agentur diese Daten sehen!</small></p>
<div class="row">
<div class="col-6">
{% for g in agencygroups %}
{% if forloop.counter|divisibleby:6 %}
</div> <div class="col-6">
<div class="custom-control custom-checkbox mb-2">
<input type="checkbox" class="custom-control-input groupclass" name="group_{{g.pk}}" id="group_{{g.pk}}" onchange="javascript:changeGroup({{g.pk}}, this.checked)">
<label class="custom-control-label" for="group_{{g.pk}}" >{{g.agencygroupname}}</label>
</div>
{% else %}
<div class="custom-control custom-checkbox mb-2">
<input type="checkbox" class="custom-control-input groupclass" name="group_{{g.pk}}" id="group_{{g.pk}}" onchange="javascript:changeGroup({{g.pk}}, this.checked)">
<label class="custom-control-label" for="group_{{g.pk}}" >{{g.agencygroupname}}</label>
</div>
{% endif %}
{% endfor %}
</div></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-success" data-dismiss="modal">Beenden</button>
</div>
</div>
</div>
</div>
<script> <script>
var workingpass = "";
//GROUPS
function showGroupChangeModal(tochangeid){
console.log("HI!");
$("#changeGroupOfPass").modal("toggle");
$(".groupclass").attr("checked", false);
workingpass = tochangeid;
$.ajax(
{
type: "GET",
url: "{% url 'ql-ajaxloaddef' %}",
data:{
action : "loadpassg",
passid : workingpass
},
success: function( data )
{
for(i = 0; i < data["passgroups"].length; i++){
$("#group_" + data["passgroups"][i]['id']).attr("checked", true);
}
}
});
}
$('#changeGroupOfPass').on('hidden.bs.modal', function (e) {
window.location = window.location
})
function changeGroup(groupid, value){
$.ajax(
{
type: "GET",
url: "{% url 'ql-ajaxloaddef' %}",
data:{
action : "changepassg",
groupid : groupid,
workingpass : workingpass,
value : value
},
success: function( data )
{
}
});
}
function showAgPass(id){ function showAgPass(id){
$("#pass_" + id).toggle(); $("#pass_" + id).toggle();
$("#pass_cl_" + id).toggle(); $("#pass_cl_" + id).toggle();
@ -101,6 +210,10 @@
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1) $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
}); });
}); });
$('[data-toggle="popover"]').popover();
}); });

View File

@ -3,15 +3,15 @@
<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' %}"><i class="fas fa-plus"></i>&nbsp;Quicklink</a> <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>
</div> </div>
{% endif %} {% endif %}
<div class="row mt-3">
<div class="form-group mb-2"> <div class="row col-9" >
<input class="form-control" id="quicklinks_search" size="50" type="text" placeholder="Suche in Tabelle...">
</div>
</div>
<div class="row mt-3 col-9" >
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
@ -49,9 +49,9 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% if user|usergperm:"moduleorganizer" %} <!-- {% if user|usergperm:"moduleorganizer" %}
<a class="btn btn-primary" href="#" onclick="saveDefQL()">ERGO-Quicklinks laden</a> <a class="btn btn-primary" href="#" onclick="saveDefQL()">ERGO-Quicklinks laden</a>
{% endif %} {% endif %}-->
</div> </div>
</div> </div>
<script> <script>
@ -67,6 +67,7 @@ $(document).ready(function(){
}); });
function saveDefQL(){ function saveDefQL(){
/*
$.ajax( $.ajax(
{ {
type: "GET", type: "GET",
@ -78,6 +79,6 @@ function saveDefQL(){
{ {
location.reload(); location.reload();
} }
}); });*/
} }
</script> </script>

View File

@ -5,9 +5,11 @@ from .models import QuickLinks, AGContacts, AGPassword
from .forms import OrganizerAddQlForm, OrganizerAddContact, OrganizerUpdateContact, AddAGPassword from .forms import OrganizerAddQlForm, OrganizerAddContact, OrganizerUpdateContact, AddAGPassword
from django.contrib import messages from django.contrib import messages
from django.shortcuts import redirect from django.shortcuts import redirect
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.urls import reverse_lazy from django.urls import reverse_lazy
from users.models import AgencyGroup
# Create your views here. # Create your views here.
class OrganizerManagement(LoginRequiredMixin, ListView): class OrganizerManagement(LoginRequiredMixin, ListView):
@ -18,7 +20,7 @@ class OrganizerManagement(LoginRequiredMixin, ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
quicklinks = QuickLinks.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name') quicklinks = QuickLinks.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name')
context.update({'active_link' : 'organizer', 'quicklinks' : quicklinks, 'contacts' : AGContacts.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('last_name'), 'agpass' : AGPassword.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name')}) context.update({'active_link' : 'organizer', 'quicklinks' : quicklinks, 'contacts' : AGContacts.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('last_name'), 'agpass' : AGPassword.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name'), 'agencygroups' : AgencyGroup.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('agencygroupname') })
return context return context
class OrganizerAdd(LoginRequiredMixin, CreateView): class OrganizerAdd(LoginRequiredMixin, CreateView):
@ -193,4 +195,27 @@ def loaddefaultql(request):
tempql = QuickLinks(agency=request.user.profile.agency, name=ele[0], link=ele[1]) tempql = QuickLinks(agency=request.user.profile.agency, name=ele[0], link=ele[1])
tempql.save() tempql.save()
return redirect("ql-addql") return redirect("ql-addql")
elif request.GET["action"] == "loadpassg":
data = {}
agpass = list(AGPassword.objects.filter(pk=request.GET["passid"], agency=request.user.profile.agency))
if(len(agpass) == 1):
agpass_ele = agpass[0]
groupsid = []
for ag in agpass_ele.visibleby.all():
groupsid.append({"id" : ag.pk})
data = {'success' : True, 'passgroups' : groupsid}
else:
data = {'success' : False}
return JsonResponse(data)
elif request.GET["action"] == "changepassg":
groupid = request.GET.get('groupid')
workingpass = request.GET.get('workingpass')
value = request.GET.get('value')
if(value == "true"):
AGPassword.objects.get(pk=workingpass, agency=request.user.profile.agency).visibleby.add(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency))
else:
AGPassword.objects.get(pk=workingpass, agency=request.user.profile.agency).visibleby.remove(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency))
data = {'success' : False}
return JsonResponse(data)
return redirect("ql-addql") return redirect("ql-addql")

View File

@ -538,4 +538,4 @@ $(window).click(function() {
</script> </script>