Zwischencommit Agenturverbund

This commit is contained in:
holger.trampe 2020-04-10 23:32:51 +02:00
parent a0ca62c1ee
commit 2497365a61
22 changed files with 612 additions and 34 deletions

2
.gitignore vendored
View File

@ -36,6 +36,8 @@ notificsys/migrations/*
notificsys/__pycache__/*
dasettings/migrations/*
!dasettings/migrations/__init__.py
dasettings/__pycache__/*
news/migrations/*
!news/migrations/__init__.py

View File

@ -11,7 +11,6 @@ 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
from .models import DataDir, DataFile
from datetime import datetime
from users.models import AgencyGroup
@ -248,7 +247,7 @@ def adddirbyajax(request, parent):
else:
datadir_parentid = tempdir
tempdatafile = DataFile(file=request.FILES['uploadedfile'], name=request.FILES['uploadedfile'].name, owner=request.user, parent=datadir_parentid, agency=request.user.profile.agency)
tempdatafile = DataFile(file=request.FILES['uploadedfile'], name=str(request.FILES['uploadedfile'].name), owner=request.user, parent=datadir_parentid, agency=request.user.profile.agency)
tempdatafile.save()
data = {'savedobj_id' : tempdatafile.pk, 'savedobj_name' : tempdatafile.name}
else:

View File

@ -1,9 +1,21 @@
from django import forms
from django.db import models
from django.contrib.auth.models import User
from users.models import AgencyGroup, Agency, Profile, AgencyJob
from users.models import AgencyGroup, Agency, Profile, AgencyJob, AgencyNetwork
from PIL import Image
class AgencyNetworkForm(forms.ModelForm):
class Meta:
model = AgencyNetwork
fields = ['name', 'publicjoin']
labels = {
"name" : "Name des Agentuverbunds",
"publicjoin" : "Beitritt ohne Bestätigung"
}
# Change logged Users Data (Usernamen an Email) NUR HIER MÖGLICH!
class UsersSelfChangeForm(forms.ModelForm):
email = forms.EmailField()

View File

@ -0,0 +1,24 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section col-6">
<h3>Agenturverbund</h3>
<hr>
<h4>Informationen zum Agenturverbund</h4>
<p>
Ein Agenturverbund schließt mehrere Agenturen zusammen. Dabei legen Sie als Ersteller fest, wie der Verbund heißt und wie andere Agenturen beitreten können. Nachdem der Verbund angelegt ist, erhalten Sie einen Link. Mit diesem Link können andere Agenturen beitreten, in dem sie auf den Link klicken. Anschließend erhalten Sie eine Informationen, welche Agenturen beitreten wollen und können diese dann aufnehmen.
</p>
<p>
Wollen Sie einen öffentlichen Verbund, in der jede Agentur ohne Ihre Bestätigung beitreten kann, aktivieren Sie die Checkbox "Beitritt ohne Bestätigung". Standardmäßig können diese Agenturen nur Standards übernehmen, aber nicht eigene in den Verbund teilen. In unserem Wiki erhalten Sie dazu weitere Informationen.
</p>
<hr>
<form method="POST">
{% csrf_token %}
{{ form|crispy }}
<hr>
<a class="btn" href="{% url 'dasettings' %} ">Abbrechen</a>
<button type="submit" class="btn btn-primary" style="float: right">Agenturverbund speichern</button>
</form>
</div>
</div>
{% endblock content %}

View File

@ -0,0 +1,93 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% load counter_tag %}
{% load static %}
{% block content %}
<div class="content-section col-8">
<h4>Agenturen in Verbund {{agn.name}}</h4>
{% if outstanding|length > 0 %}
<hr>
<h5>Ausstehende Einladungen</h5>
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Agenturname</th>
<th scope="col">&nbsp;</th>
</tr>
</thead>
<tbody id="">
{% for agn_s in outstanding %}
<tr>
<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>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% 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>
</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">Agentur aus Verbund entfernen</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">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-success" data-dismiss="modal">Abbrechen</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function showDelAgFromAgn(name)
{
$("#agname").html(name);
$("#delAgFromAgn").modal("toggle");
}
</script>
{% endblock content %}

View File

@ -0,0 +1,111 @@
{% load crispy_forms_tags %}
{% load counter_tag %}
{% load static %}
<a type="button" class="btn btn-primary" href="{% url 'newagn' %}" data-toggle="tooltip" data-placement="top" title="Erstellen Sie einen neuen Agenturverbund und teilen Sie Ihre Standards."><i class="fas fa-plus"></i>&nbsp;Agenturverbund erstellen</a>
<hr>
<h4>Ihre Agenturverbünde</h4>
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Link{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Kopieren Sie den Link hier in Ihre Zwischenablage." class="far fa-question-circle"></i></small>{% endif %}</th>
<th scope="col">Erstelleragentur</th>
<th scope="col">Erstellt durch</th>
<th scope="col">Erstellt am</th>
<th scope="col">Letzte Aktivität am</th>
<th scope="col">Agenturen</th>
<th scope="col">Standards</th>
<th scope="col">&nbsp;</th>
</tr>
</thead>
<tbody id="">
{% for agn in agencynetworks %}
{% getsumofallag agn.pk as agsum %}
{% getsumofallstandards agn.pk as ag_standardsum %}
{% getoutstandinginvites agn.pk as outstanding %}
{% ifaginadminagn agn.pk request.user.profile.agency.pk as is_adminag %}
<tr>
<td>{{agn.name}}</td>
<td>
{% if is_adminag %}
<a href="#" onclick="javascript:showAgnLink('{{agn.name}}', '{{agn.networkid}}', {{agn.pk}})"><i class="far fa-eye"></i></a>
&nbsp;&nbsp;&nbsp;<a href="#" onclick="javascript:copyLinkToCB('{{agn.networkid}}', {{agn.pk}})"><i class="far fa-copy"></i></a>
<span id="aglink_{{agn.pk}}" style="display: none;">Kopiert!</span>
{% endif %}
</td>
<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>{% 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>
{% 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>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="modal fade" id="showAGNLink" 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">Agenturverbundslink</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">
Agenturverbund <b><span id="agn_name">NAME</span></b><br />
Link für die Einladung:<br/> <b><span id="agn_link">LINK</span></b>
<br />
<p class="mt-2">Leiten Sie den Link an Agenturen weiter, die Sie zu Ihrem Verbund einladen möchten.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-success" data-dismiss="modal">Schließen</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function copyLinkToCB(tocopy, id){
var val = "{{baseurl}}dasettings/agnni/" + tocopy;
var $temp = $("<input>");
$("body").append($temp);
$temp.val(val).select();
document.execCommand("copy");
$temp.remove();
$("#aglink_" + id).show();
}
function showAgnLink(name, tocopy, id){
$("#aglink_mod").hide();
$("#agn_name").html(name);
$("#agn_link").html("{{baseurl}}dasettings/agnni/" + tocopy);
$("#showAGNLink").modal("toggle");
}
</script>
<!--
name = models.CharField(default="", max_length=200)
adminagencys = models.ManyToManyField("Agency", related_name="AdministrationAgencys")
creator = models.ForeignKey(User, on_delete=models.PROTECT, blank=True)
creator_agency = models.ForeignKey("Agency", on_delete=models.PROTECT, blank=True)
created_on = models.DateTimeField(default=timezone.now)
members = models.ManyToManyField("Agency", related_name="MemberAgencys", blank=True)
sharemembers = models.ManyToManyField("Agency", related_name="ShareMemberAgencys", blank=True)
publicjoin = models.BooleanField(default=False)
networkid = models.CharField(default="", max_length=30)
-->

View File

@ -0,0 +1,16 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section col-6">
<h3>Agenturverbund löschen</h3>
<hr>
Achtung! Wenn Sie den Agenturverbund löschen, können die Agenturen innerhalb des Verbunds keine Informationen mehr austauschen.
<form method="POST">
{% csrf_token %}
<div class="form-group">
<button type="submit" class="btn btn-danger">Verbund löschen</button>&nbsp;
<a href="{% url 'dasettings' %}" class="btn btn-success">Abbrechen</a>
</div>
</form>
</div>
{% endblock content %}

View File

@ -447,7 +447,7 @@ function validateGroupName(groupname){
<div id="groupnameerr" class="alert alert-danger mt-3" style="display: none">Falsche Eingabe! Keine Sonderzeichen!</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Abrechen</button>&nbsp;
<button type="button" class="btn btn-danger" data-dismiss="modal">Abbrechen</button>&nbsp;
<button id="saveNewGroup" type="button" class="btn btn-success" data-dismiss="modal" onclick="javascript:updateGroupName()" disabled="true">Speichern</button>
</div>
</div>

View File

@ -0,0 +1,34 @@
{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% load counter_tag %}
{% block content %}
<div class="content-section col-8">
<h3>Agenturverbund {{agn.name}} beitreten</h3>
<hr>
<h4>Verbundinfos</h4>
{% getsumofallag agn.pk as agsum %}
{% getsumofallstandards agn.pk as ag_standardsum %}
<div class="row mt-3">
<div class="col-8">
<h6><b>Gründeragentur</b> {{agn.creator_agency.name }}</h6>
<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>
</div>
</div>
{% if agn.publicjoin %}
Das Beitreten zu diesem Verbund ist öffentlich. Sie können daher sofort nach Beitritt die geteilten Informationen einsehen, aber selber keine Informationen in den Verbund teilen.
{% endif %}
<hr>
Möchten Sie diesem Verbund beitreten?
<br />
<div class="mt-2">
<a type="button" class="btn btn-secondary" data-dismiss="modal" href="{% url 'dasettings' %}">Abbrechen</a>
<a type="button" class="btn btn-success" data-dismiss="modal" href="{% url 'joinagn' agn.pk %}">Verbund beitreten</a>
</div>
</div>
{% endblock content %}

View File

@ -53,6 +53,11 @@
<a class="nav-link" id="calc-tab" data-toggle="tab" href="#calc" role="tab" aria-controls="calc" aria-selected="false">Abrechnung</a>
</li>
{% endif %}
{% if user|usergperm:"agencynetwork" %}
<li class="nav-item">
<a class="nav-link" id="agencynetwork-tab" data-toggle="tab" href="#agencynetwork" role="tab" aria-controls="agencynetwork" aria-selected="false">Agenturverbund</a>
</li>
{% endif %}
{% if user|usergperm:"structuremanager" %}
<li class="nav-item">
<a class="nav-link" id="structure-tab" data-toggle="tab" href="#structure" role="tab" aria-controls="structure" aria-selected="false">Struktur</a>
@ -107,6 +112,15 @@
{% endblock %}
</div>
{% endif %}
{% if user|usergperm:"agencynetwork" %}
<div class="tab-pane fade" id="agencynetwork" role="tabpanel" aria-labelledby="agencynetwork-tab">
<h5 class="mt-3">Agenturverbünde{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Verwalten Sie hier Ihre eigenen Agenturverbünde und in welchen Sie Mitglied sind." class="far fa-question-circle"></i></small>{% endif %}</h5>
<hr>
{% block agencynetwork_content %}
{% include "dasettings/agencynetwork_content.html" %}
{% endblock %}
</div>
{% endif %}
{% if user|usergperm:"structuremanager" %}
<div class="tab-pane fade" id="structure" role="tabpanel" aria-labelledby="structure-tab">
<h5 class="mt-3">Struktur{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Richten Sie hier Bereiche und Tätigkeiten ein, um diese in Standards und Organigramm als Agenturstruktur zu nutzen." class="far fa-question-circle"></i></small>{% endif %}</h5>

View File

@ -10,7 +10,17 @@ Permissions definiert in models.py bei USERS und dann hier vor die View geschrie
urlpatterns = [
path('main/', views.DASettings, name='dasettings'),
path('newuser/s1', permission_required('users.usermanager')(views.NewUserFirstStep), name='newuserfirst'),
path('newagn/', permission_required('users.agencynetwork')(views.AddAgencyNetwork), name='newagn'),
path('updateagn/<int:pk>', permission_required('users.agencynetwork')(views.UpdateAgencyNetwork), name='updateagn'),
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('usprof/<int:pk>/<int:newuser>', permission_required('users.usermanager')(views.UserProfileUpdate), name="user_updateprofile")
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'),
]

View File

@ -1,12 +1,12 @@
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect,HttpResponse, JsonResponse
from .forms import UsersSelfChangeForm, UsersNotificationForm, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm
from .forms import UsersSelfChangeForm, UsersNotificationForm, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm, AgencyNetworkForm
from django.contrib import messages
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.forms import PasswordChangeForm
from users.usersforms import AgencyUpdateForm
from users.models import AgencyJob, AgencyGroup
from users.models import AgencyJob, AgencyGroup, AgencyNetwork, Agency, AgencyNetworkPreperation
from django.contrib.auth.models import User, Group, Permission
import random
import string
@ -21,6 +21,7 @@ import webcolors
from datetime import datetime
from standards.models import Standards
from django.core.mail import send_mail
from django.conf import settings
def randomString(stringLength=10):
"""Generate a random string of fixed length """
@ -71,7 +72,8 @@ def getAllForms(request, context):
@login_required
def DASettings(request):
context = {
'active_link' : 'dasettings'
'active_link' : 'dasettings',
'baseurl' : settings.BASE_URL
}
context = getAllForms(request, context)
@ -90,6 +92,10 @@ def DASettings(request):
agencyareas = Areas.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('areaorder')
context.update({"agencyareas" : agencyareas})
# LOAD AGENCYNETWORKS
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.update({"agencynetworks" : agencynetworks})
# LOAD TASKS
alltasks = Tasks.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('name')
context.update({"alltasks" : alltasks})
@ -556,3 +562,167 @@ def NewUserFirstStep(request):
context.update({'newuserform' : newuserform})
return render(request, 'dasettings/user_newuser_step1.html', context)
# NEUER AGENTURVERBUND
@login_required
def AddAgencyNetwork(request):
if request.method == 'POST':
newagn = AgencyNetworkForm(request.POST)
if(newagn.is_valid()):
newagn_object = AgencyNetwork(name=newagn.cleaned_data.get("name"), publicjoin=newagn.cleaned_data.get("publicjoin"), creator=request.user, creator_agency=request.user.profile.agency, networkid=randomString(20))
newagn_object.save()
newagn_object.adminagencys.add(request.user.profile.agency)
messages.success(request, f'Agenturverbund ' + newagn_object.name + ' angelegt!')
return redirect('dasettings')
else:
context = {
'active_link' : 'dasettings',
'form' : AgencyNetworkForm(),
}
return render(request, 'dasettings/addagencynetwork_content.html', context)
@login_required
def UpdateAgencyNetwork(request, pk):
if request.method == 'POST':
agn = AgencyNetwork.objects.get(pk=pk)
formdata = AgencyNetworkForm(request.POST)
if(formdata.is_valid()):
agn.name = formdata.cleaned_data.get("name")
agn.publicjoin= formdata.cleaned_data.get("publicjoin")
agn.save()
#newagn_object.adminagencys.add(request.user.profile.agency)
messages.success(request, f'Agenturverbund ' + agn.name + ' aktualisiert!')
return redirect('dasettings')
else:
context = {
'active_link' : 'dasettings',
'form' : AgencyNetworkForm(instance=AgencyNetwork.objects.get(pk=pk)),
}
return render(request, 'dasettings/addagencynetwork_content.html', context)
@login_required
def DelAgencyNetwork(request, pk):
agn = AgencyNetwork.objects.get(pk=pk)
if request.method == 'POST':
if request.user.profile.agency in agn.adminagencys.all():
agn.delete()
messages.success(request, f'Agenturverbund erfolgreich gelöscht!')
return redirect('dasettings')
else:
messages.success(request, f'Sie dürfen diesen Agenturverbund nicht löschen!')
return redirect('dasettings')
else:
context = {
'active_link' : 'dasettings',
'agn' : agn
}
return render(request, 'dasettings/delagencynetwork_content.html', context)
@login_required
def AddMyAgencyToAgn(request, networkid):
agn = AgencyNetwork.objects.filter(networkid=networkid)
if len(agn) == 0:
messages.info(request, f'Agenturverband nicht gefunden!')
return redirect('dasettings')
else:
context = {
'active_link' : 'dasettings',
'agn' : list(agn)[0]
}
return render(request, 'dasettings/joinagn_first.html', context)
def IsAgencyInAgNetwork(agencyid, agnetworkid):
is_in = False
agn = AgencyNetwork.objects.get(pk=agnetworkid)
agency = Agency.objects.get(pk=agencyid)
if agency in agn.adminagencys.all():
is_in = True
if agency in agn.members.all():
is_in = True
if agency in agn.sharemembers.all():
is_in = True
return is_in
@login_required
def JoinAGN(request, pk):
if IsAgencyInAgNetwork(request.user.profile.agency.pk, pk):
messages.success(request, f'Ihre Agentur ist bereits in diesem Verbund!')
else:
agn = AgencyNetwork.objects.get(pk=pk)
if(agn.publicjoin):
messages.success(request, f'Verbund erfolgreich beigetreten!')
agn.members.add(request.user.profile.agency)
else:
# STATUS
# 1 WANTED AG ASKED TO TARGET NETWORK
agnp = AgencyNetworkPreperation(target_network=AgencyNetwork.objects.get(pk=pk), wanted_agency=request.user.profile.agency, status=1)
agnp.save()
messages.success(request, f'Ihre Anfrage zum Beitritt wurde versendet. Sie erhalten eine Information, wenn die Anfrage angenommen wurde!')
return redirect('dasettings')
@login_required
def ManageAgInAgn(request, pk):
agn = AgencyNetwork.objects.filter(pk=pk)
if len(agn) == 0:
messages.info(request, f'Agenturverband nicht gefunden!')
return redirect('dasettings')
else:
network = list(agn)[0]
allagofagn = network.members.all() | network.sharemembers.all() | network.adminagencys.all()
context = {
'active_link' : 'dasettings',
'agn' : list(agn)[0],
'outstanding': AgencyNetworkPreperation.objects.filter(target_network=list(agn)[0]) ,
'allagofagn' : allagofagn
}
return render(request, 'dasettings/agencynetwork_agmanagement_content.html', context)
@login_required
def AddAgToNetwork(request, network, targetag, aginvpk):
if IsAgencyInAgNetwork(Agency.objects.get(pk=targetag).pk, network):
messages.info(request, f'Sie sind bereits in der Agentur!')
return redirect('dasettings')
else:
messages.info(request, f'Einladung angenommen!')
agn = AgencyNetwork.objects.get(pk=network)
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)
@login_required
def DelAgInv(request, pk):
AgencyNetworkPreperation.objects.get(pk=pk).delete()
messages.info(request, f'Einladung abgelehnt!')
return redirect('dasettings')
@login_required
def DelFromAgn(request, agn, ag):
return redirect('managagn', agn)

View File

@ -15,9 +15,8 @@ import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
BASE_URL = "https://digitale-agentur.com/"
#BASE_URL = "http://localhost:8000/"
#BASE_URL = "https://digitale-agentur.com/"
BASE_URL = "http://localhost:8000/"
CRONAPIKEY = "gCddsaz6NOnE9QbXZM5LasdEk122D"
# FOR SUMMERNOTE ORIGIN
@ -175,13 +174,20 @@ GRAPPELLI_CLEAN_INPUT_TYPES = False
# EMAILs
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
'''
EMAIL_HOST = 'smtp.strato.de'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "support@digitale-agentur.com"
EMAIL_HOST_PASSWORD = "aPx9m3!7x3m@8o!t"
DEFAULT_FROM_EMAIL = "support@digitale-agentur.com"
'''
EMAIL_HOST = 'gymhum.de'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "holger.trampe@gymhum.de"
EMAIL_HOST_PASSWORD = "Motte2016_!"
DEFAULT_FROM_EMAIL = "holger.trampe@gymhum.de"
# FOR DATEPICKER

View File

@ -32,7 +32,7 @@
<p>
{{ compfunc }}
</p>
<h6><b>Festznetz</b></h6>
<h6><b>Festnetz</b></h6>
<p>
{{ phoneland }}
</p>

View File

@ -2,6 +2,7 @@
{% load counter_tag %}
{% block content %}
<div class="content-section col-12">
<h3>Standards{% if request.user.profile.showtooltips %}&nbsp;<small><i data-toggle="tooltip" data-placement="top" title="Standards dokumentieren und erläutern verschiedenen Verfahren, strukturiert nach Bereichen und Tätigkeiten." class="far fa-question-circle"></i></small>{% endif %}</h3>
<small>Sichtbar sind alle veröffentlichten und von {{ user.first_name }} {{ user.last_name}} erstellten Standards.</small>
@ -14,23 +15,25 @@
<hr>
<div class="row">
<div class="col-12">
<ul class="nav nav-tabs" id="area_tabs" role="tablist">
<ul class="nav nav-tabs" id="area_tabs" role="tablist" >
{% for area in areas %}
<li class="nav-item">
<a class="nav-link" id="{{area.id}}" data-toggle="tab" href="#t_{{area.id}}" role="tab" aria-controls="t_{{area.id}}" aria-selected="false">{{area.name}}</a>
</li>
{% endfor %}
<li class="nav-item">
<li class="nav-item ml-auto" >
<a class="nav-link" id="userown" data-toggle="tab" href="#t_userown" role="tab" aria-controls="t_userown" aria-selected="false">Eigene Standards</a>
</li>
{% if perms.users.standard_management %}
<li class="nav-item">
<a class="nav-link" id="agencys" data-toggle="tab" href="#t_agencys" role="tab" aria-controls="t_agencys" aria-selected="false">Unveröffentlichte Standards</a>
<li class="nav-item" style="float: right !important;">
<a class="nav-link" id="agencys" data-toggle="tab" href="#t_agencys" role="tab" aria-controls="t_agencys" aria-selected="false">Unveröffentlichte Standards {% if unpubstandards_of_user|length > 0 %} ({{unpubstandards_of_user|length}}) {%endif%}</a>
</li>
{% endif %}
</ul>
</div>
<div class="col">
<div class="tab-content" id="area_contents">
{% for area in areas %}
@ -77,7 +80,7 @@
</div>
{% endfor %}
<div class="tab-pane fade" id="t_userown" role="tabpanel" aria-labelledby="userown">
<h4 class="mt-4 mb-4">Ihre Standards</h4>
<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>

View File

@ -1,6 +1,7 @@
from django import template
from django.contrib.auth.models import Group, User
from users.models import AgencyGroup
from users.models import AgencyGroup, Agency, AgencyNetwork, AgencyNetworkPreperation
from standards.models import Standards
from message.models import Message
import os
register = template.Library()
@ -87,6 +88,47 @@ def split_dir_style(dirtosplit):
def filename(value):
return os.path.basename(value.file.name)
# Gibt die Summe aller Agenturen eines Agentuverbundes zurück
@register.simple_tag
def getsumofallag(agn_id):
return len(AgencyNetwork.objects.get(pk=agn_id).adminagencys.all()) + len(AgencyNetwork.objects.get(pk=agn_id).members.all()) + len(AgencyNetwork.objects.get(pk=agn_id).sharemembers.all())
# Gibt die Summe aller Standards in einem Agenturverband zurück
@register.simple_tag
def getsumofallstandards(agn_id):
agn = AgencyNetwork.objects.get(pk=agn_id)
final_standard_count = 0
for a in agn.adminagencys.all():
final_standard_count += len(Standards.objects.filter(agency=a))
for a in agn.members.all():
final_standard_count += len(Standards.objects.filter(agency=a))
for a in agn.sharemembers.all():
final_standard_count += len(Standards.objects.filter(agency=a))
return final_standard_count
@register.simple_tag
def ifaginadminagn(agn_id, agencyid):
agn = AgencyNetwork.objects.get(pk=agn_id)
ag = Agency.objects.get(pk=agencyid)
agency_is_admin = False
if ag in agn.adminagencys.all():
agency_is_admin = True
return agency_is_admin
@register.simple_tag
def getoutstandinginvites(agnetwork):
outstanding = False
if len(AgencyNetworkPreperation.objects.filter(target_network=agnetwork)) > 0:
outstanding = True
return outstanding
'''

View File

@ -1,5 +1,5 @@
from django.contrib import admin
from .models import Profile, Agency, AgencyGroup, AgencyJob
from .models import Profile, Agency, AgencyGroup, AgencyJob, AgencyNetwork, AgencyNetworkPreperation
from .priomodel import Prio
from django.contrib.auth.models import Permission
from message.models import Message
@ -10,4 +10,6 @@ admin.site.register(AgencyGroup)
admin.site.register(AgencyJob)
admin.site.register(Prio)
admin.site.register(Message)
admin.site.register(AgencyNetwork)
admin.site.register(AgencyNetworkPreperation)

View File

@ -23,6 +23,45 @@ def picturepath_agency(instance, filename):
def picturepath_user(instance, filename):
return 'agencydata/agency_{0}/agencystats/profilepics/{1}'.format(instance.agency.pk, filename)
'''
Class AgencyNetworkPreperation
Regelt den Join-Prozess einer Agentur in einen Verbund, um Anfrage und Status der Anfrage zu prüfen.
Kommt nur zum tragen, wenn ein AgenturVerbund auf publicjoin=False ist!
'''
class AgencyNetworkPreperation(models.Model):
target_network = models.ForeignKey("AgencyNetwork", on_delete=models.CASCADE)
wanted_agency = models.ForeignKey("Agency", on_delete=models.PROTECT, blank=True)
status = models.IntegerField()
'''
Class AgencyNetwork
Bildet einen Agenturverbund ab
'''
class AgencyNetwork(models.Model):
name = models.CharField(default="", max_length=200)
adminagencys = models.ManyToManyField("Agency", related_name="AdministrationAgencys")
creator = models.ForeignKey(User, on_delete=models.PROTECT, blank=True)
creator_agency = models.ForeignKey("Agency", on_delete=models.PROTECT, blank=True)
created_on = models.DateTimeField(default=timezone.now)
lastactivity = models.DateTimeField(default=timezone.now)
members = models.ManyToManyField("Agency", related_name="MemberAgencys", blank=True)
sharemembers = models.ManyToManyField("Agency", related_name="ShareMemberAgencys", blank=True)
publicjoin = models.BooleanField(default=False)
networkid = models.CharField(default="", max_length=30)
def __str__(self):
return f'{self.name}'
'''
Class Agency
@ -203,6 +242,7 @@ class AgencyGroup(models.Model):
permissions = [
('agencyinfo', 'Agenturinformationen verändern'),
('agencynetwork', 'Agenturverbund bearbeiten'),
('usermanager', 'Mitarbeiter bearbeiten'),
('groupmanager', 'Gruppen bearbeiten'),
('structuremanager', 'Struktur bearbeiten'),
@ -212,7 +252,8 @@ class AgencyGroup(models.Model):
('moduleorganizer', 'Organizer bearbeiten'),
('filesmanager', 'Dateien bearbeiten'),
('filedirmanager', 'Ordner bearbeiten'),
('filesviewer', 'Dateien lesen')
('filesviewer', 'Dateien lesen'),
]
# SUBCLASS

View File

@ -1,7 +1,7 @@
from django.db.models.signals import post_save, pre_delete, m2m_changed, pre_save
from django.contrib.auth.models import User, Group
from django.dispatch import receiver
from .models import Profile, Agency, AgencyGroup
from .models import Profile, Agency, AgencyGroup, AgencyNetworkPreperation
from news.models import News
from django.contrib.auth.models import Permission
from notificsys.models import UserNotification
@ -14,6 +14,7 @@ from django.conf import settings
from django.utils import timezone
from standards.models import Standards
# Deletes all Notifications added to to delete news
@receiver(pre_delete, sender=News)
def del_news_notifications(sender, instance, **kwargs):
@ -234,10 +235,7 @@ def adjust_group_notifications_task(instance, action, reverse, model, pk_set, us
fail_silently=False
)
# SIGNLA WHEN FILE IS TO DELETE
#@receiver(pre_delete, sender=DataFile)
#def auto_delete_file_on_delete(sender, instance, **kwargs):
# if instance.file.file:
# if os.path.isfile(instance.file.path):
# os.remove(instance.file.path)
@receiver(signal=post_save, sender=AgencyNetworkPreperation)
def save_agjoin_prep(sender, instance, **kwargs):
newnotification = UserNotification(touser=instance.target_network.creator, notificationtext="Eine Agentur möchte Ihrem Verbund beitreten.", notificationtype="wantedag")
newnotification.save()

View File

@ -118,6 +118,7 @@ def toUpdate(request):
admingroups = AgencyGroup.objects.filter(is_admin=True)
for a in admingroups:
a.group.permissions.add(Permission.objects.get(codename="moduleorganizer"))
a.group.permissions.add(Permission.objects.get(codename="agencynetwork"))
'''