Zwischencommit Agenturverbund
This commit is contained in:
parent
a0ca62c1ee
commit
2497365a61
|
|
@ -36,6 +36,8 @@ notificsys/migrations/*
|
|||
notificsys/__pycache__/*
|
||||
|
||||
dasettings/migrations/*
|
||||
!dasettings/migrations/__init__.py
|
||||
dasettings/__pycache__/*
|
||||
|
||||
news/migrations/*
|
||||
!news/migrations/__init__.py
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -247,8 +246,8 @@ def adddirbyajax(request, parent):
|
|||
datadir_parentid = list(DataDir.objects.filter(is_defaultstandard=True, agency__pk=request.user.profile.agency.pk))[0]
|
||||
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:
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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 %}
|
||||
|
|
@ -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"> </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> <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"> </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">×</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>
|
||||
<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 %}
|
||||
|
|
@ -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> 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 %} <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"> </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>
|
||||
<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> {% endif %} {% if outstanding %}<i class="fas fa-info-circle" data-toggle="tooltip" data-placement="top" title="Es gibt ausstehende Einladung."></i> {% endif %} {{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">×</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)
|
||||
-->
|
||||
|
|
@ -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>
|
||||
<a href="{% url 'dasettings' %}" class="btn btn-success">Abbrechen</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
|
@ -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>
|
||||
<button type="button" class="btn btn-danger" data-dismiss="modal">Abbrechen</button>
|
||||
<button id="saveNewGroup" type="button" class="btn btn-success" data-dismiss="modal" onclick="javascript:updateGroupName()" disabled="true">Speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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 %}
|
||||
|
|
@ -47,12 +47,17 @@
|
|||
<li class="nav-item">
|
||||
<a class="nav-link" id="agency-tab" data-toggle="tab" href="#agency" role="tab" aria-controls="agency" aria-selected="false">Agentur</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if user|usergperm:"agencyinfo" %}
|
||||
<li class="nav-item">
|
||||
<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>
|
||||
|
|
@ -106,6 +111,15 @@
|
|||
{% include "dasettings/calc_content.html" %}
|
||||
{% 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 %} <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">
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
|
||||
]
|
||||
|
|
@ -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)
|
||||
Binary file not shown.
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
<p>
|
||||
{{ compfunc }}
|
||||
</p>
|
||||
<h6><b>Festznetz</b></h6>
|
||||
<h6><b>Festnetz</b></h6>
|
||||
<p>
|
||||
{{ phoneland }}
|
||||
</p>
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
{% load counter_tag %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="content-section col-12">
|
||||
<h3>Standards{% if request.user.profile.showtooltips %} <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">
|
||||
{% endfor %}
|
||||
|
||||
<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>
|
||||
{% endif %}
|
||||
</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>
|
||||
|
|
|
|||
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
|
||||
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
|
||||
|
||||
|
||||
'''
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -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"))
|
||||
|
||||
'''
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue