Struktur inkl. Bereiche und Tätigkeiten sowie Benachrichtigungen für Tätigkeiten fertig
This commit is contained in:
parent
750b36dd2c
commit
ea33eaaffd
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -10,10 +10,9 @@ class TasksAddTaskForm(forms.ModelForm):
|
||||||
labels = {
|
labels = {
|
||||||
"name" : "Aufgabenname",
|
"name" : "Aufgabenname",
|
||||||
"area" : "Übergeordneter Bereich",
|
"area" : "Übergeordneter Bereich",
|
||||||
"desc" : "Beschreibung",
|
|
||||||
"visible": "Im Organigramm sichtbar"
|
"visible": "Im Organigramm sichtbar"
|
||||||
}
|
}
|
||||||
fields = ['name', 'area', 'desc', 'visible']
|
fields = ['name', 'area', 'visible']
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
user = kwargs.pop('user')
|
user = kwargs.pop('user')
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,15 @@
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="content-section col-6">
|
<div class="content-section col-6">
|
||||||
<h3>Neue Aufgabe anlegen</h3>
|
<h3>Neue Tätigkeit anlegen</h3>
|
||||||
<hr>
|
<hr>
|
||||||
<form method="POST">
|
<form method="POST">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{{ form|crispy }}
|
{{ form|crispy }}
|
||||||
<p>Nachdem Erstellen der Aufgabe können Mitarbeiter zugewiesen werden.</p>
|
<p>Nachdem Erstellen der Aufgabe können Mitarbeiter zugewiesen werden.</p>
|
||||||
<hr>
|
<hr>
|
||||||
<button type="submit" class="btn btn-success" href="{% url 'areas-addarea' %} ">Aufgabe anlegen</button>
|
<button type="submit" class="btn btn-success" href="{% url 'dasettings' %} ">Tätigkeit anlegen</button>
|
||||||
<a class="btn" href="{% url 'tasks-management' %} ">Abbrechen</a>
|
<a class="btn" href="{% url 'dasettings' %} ">Abbrechen</a>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
<p>Alle unter dieser Aufgabe erstellten Standards werden gelöscht!</p>
|
<p>Alle unter dieser Aufgabe erstellten Standards werden gelöscht!</p>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<button type="submit" class="btn btn-danger">Aufgabe löschen</button>
|
<button type="submit" class="btn btn-danger">Aufgabe löschen</button>
|
||||||
<a href="{% url 'tasks-management' %}" class="btn btn-success">Abbrechen</a>
|
<a href="{% url 'dasettings' %}" class="btn btn-success">Abbrechen</a>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<button type="submit" class="btn btn-success">Aufgabe aktualisieren</button>
|
<button type="submit" class="btn btn-success">Aufgabe aktualisieren</button>
|
||||||
<a class="btn" href="{% url 'tasks-management' %} ">Abbrechen</a>
|
<a class="btn" href="{% url 'dasettings' %} ">Abbrechen</a>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,13 @@
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
from .views import TasksManagement, TasksAddTask, TasksDeleteView, TasksUpdateView
|
from .views import TasksAddTask, TasksDeleteView, TasksUpdateView
|
||||||
from . import views
|
from . import views
|
||||||
'''
|
'''
|
||||||
Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben!
|
Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben!
|
||||||
'''
|
'''
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', permission_required('users.tasks_management')(TasksManagement.as_view(template_name="tasks/tasks_management.html")), name='tasks-management'),
|
|
||||||
path('addtask/', permission_required('users.tasks_management')(TasksAddTask.as_view(template_name="tasks/tasks_add.html")), name='tasks-addtask'),
|
path('addtask/', permission_required('users.tasks_management')(TasksAddTask.as_view(template_name="tasks/tasks_add.html")), name='tasks-addtask'),
|
||||||
path('tasks/<int:pk>/delete', permission_required('users.tasks_management')(TasksDeleteView.as_view()), name='tasks-delete'),
|
path('tasks/<int:pk>/delete', permission_required('users.tasks_management')(TasksDeleteView.as_view()), name='tasks-delete'),
|
||||||
path('tasks/<int:pk>/', permission_required('users.tasks_management')(TasksUpdateView.as_view()), name='tasks-manage'),
|
path('tasks/<int:pk>/', permission_required('users.tasks_management')(TasksUpdateView.as_view()), name='tasks-manage'),
|
||||||
|
|
|
||||||
|
|
@ -8,23 +8,11 @@ from django.contrib import messages
|
||||||
from django.http import HttpResponse, JsonResponse
|
from django.http import HttpResponse, JsonResponse
|
||||||
from users.priomodel import Prio
|
from users.priomodel import Prio
|
||||||
|
|
||||||
# Create your views here.
|
|
||||||
class TasksManagement(LoginRequiredMixin, ListView):
|
|
||||||
model = Tasks
|
|
||||||
|
|
||||||
# Adding active_link
|
|
||||||
# Loading only user same agency
|
|
||||||
# Change context and return for template-data
|
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
context = super().get_context_data(**kwargs)
|
|
||||||
# # Get all Users of the Same Agency as logged user
|
|
||||||
tasks_of_agency = Tasks.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name')
|
|
||||||
context.update({'active_link' : 'tasksmanagement', 'tasks_of_agency':tasks_of_agency})
|
|
||||||
return context
|
|
||||||
|
|
||||||
class TasksAddTask(LoginRequiredMixin, CreateView):
|
class TasksAddTask(LoginRequiredMixin, CreateView):
|
||||||
model = Tasks
|
model = Tasks
|
||||||
success_url = '/tasks'
|
success_url = '/dasettings/main'
|
||||||
form_class = TasksAddTaskForm
|
form_class = TasksAddTaskForm
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
|
|
@ -34,12 +22,12 @@ class TasksAddTask(LoginRequiredMixin, CreateView):
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
context.update({'active_link' : 'tasksmanagement'})
|
context.update({'active_link' : 'dasettings'})
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
# Send message to the site
|
# Send message to the site
|
||||||
messages.success(self.request, f'Aufgabe angelegt!')
|
messages.success(self.request, f'Tätigkeit angelegt!')
|
||||||
# SAVE OBJECTS TO SIGNALE!
|
# SAVE OBJECTS TO SIGNALE!
|
||||||
form.instance.agency = self.request.user.profile.agency
|
form.instance.agency = self.request.user.profile.agency
|
||||||
form.instance.created_area_by = self.request.user
|
form.instance.created_area_by = self.request.user
|
||||||
|
|
@ -47,14 +35,14 @@ class TasksAddTask(LoginRequiredMixin, CreateView):
|
||||||
|
|
||||||
class TasksDeleteView(LoginRequiredMixin, DeleteView):
|
class TasksDeleteView(LoginRequiredMixin, DeleteView):
|
||||||
model = Tasks
|
model = Tasks
|
||||||
success_url = '/tasks'
|
success_url = '/dasettings/main'
|
||||||
template_name = 'tasks/tasks_confirm_delete.html'
|
template_name = 'tasks/tasks_confirm_delete.html'
|
||||||
|
|
||||||
def delete(self, request, *args, **kwargs):
|
def delete(self, request, *args, **kwargs):
|
||||||
area = Tasks.objects.get(pk=kwargs['pk'])
|
area = Tasks.objects.get(pk=kwargs['pk'])
|
||||||
response = super(TasksDeleteView, self).delete(request, *args, **kwargs)
|
response = super(TasksDeleteView, self).delete(request, *args, **kwargs)
|
||||||
name = area.name
|
name = area.name
|
||||||
messages.success(request, f'Aufgabe ' +name+ ' wurde gelöscht!')
|
messages.success(request, f'Tätigkeit ' +name+ ' wurde gelöscht!')
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
|
@ -66,7 +54,7 @@ class TasksDeleteView(LoginRequiredMixin, DeleteView):
|
||||||
class TasksUpdateView(LoginRequiredMixin, UpdateView):
|
class TasksUpdateView(LoginRequiredMixin, UpdateView):
|
||||||
model = Tasks
|
model = Tasks
|
||||||
template_name = 'tasks/tasks_update.html'
|
template_name = 'tasks/tasks_update.html'
|
||||||
success_url = '/tasks'
|
success_url = '/dasettings/main'
|
||||||
form_class = TasksAddTaskForm
|
form_class = TasksAddTaskForm
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
|
|
@ -76,19 +64,19 @@ class TasksUpdateView(LoginRequiredMixin, UpdateView):
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
# Send message to the site
|
# Send message to the site
|
||||||
messages.success(self.request, f'Aufgabe aktualisiert!')
|
messages.success(self.request, f'Tätigkeit aktualisiert!')
|
||||||
return super().form_valid(form)
|
return super().form_valid(form)
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(TasksUpdateView, self).get_context_data(**kwargs)
|
context = super(TasksUpdateView, self).get_context_data(**kwargs)
|
||||||
tasks = Tasks.objects.get(pk=context['object'].pk)
|
tasks = Tasks.objects.get(pk=context['object'].pk)
|
||||||
# User still in Area
|
# User still in Area
|
||||||
context['added_users'] = tasks.usersfield.all()
|
user_in_task = tasks.usersfield.all()
|
||||||
# Get all Users from same Agency which are NOT in context_added_users
|
# Get all Users from same Agency which are NOT in context_added_users
|
||||||
possible_users = User.objects.filter(profile__agency__pk=self.request.user.profile.agency.pk).exclude(pk__in=context['added_users'])
|
possible_users = User.objects.filter(profile__agency__pk=self.request.user.profile.agency.pk).exclude(pk__in=context['added_users'])
|
||||||
context['possible_users'] = possible_users
|
context['possible_users'] = possible_users
|
||||||
# Active-Link for Base-Design
|
# Active-Link for Base-Design
|
||||||
context['active_link'] = 'tasksmanagement'
|
context['active_link'] = 'dasettings'
|
||||||
# Area ID
|
# Area ID
|
||||||
context['objectid'] = context['object'].pk
|
context['objectid'] = context['object'].pk
|
||||||
return context
|
return context
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -137,6 +137,11 @@ class Profile(models.Model):
|
||||||
add_new_group_mail = models.BooleanField(default=False)
|
add_new_group_mail = models.BooleanField(default=False)
|
||||||
add_new_group_push = models.BooleanField(default=True)
|
add_new_group_push = models.BooleanField(default=True)
|
||||||
|
|
||||||
|
# TASKS
|
||||||
|
# Einer neuen Tätigkeit zugewiesen
|
||||||
|
add_task_mail = models.BooleanField(default=False)
|
||||||
|
add_task_push = models.BooleanField(default=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'{self.user.last_name}'
|
return f'{self.user.last_name}'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,14 @@ from django.contrib.auth.models import Permission
|
||||||
from notificsys.models import UserNotification
|
from notificsys.models import UserNotification
|
||||||
from django.core.mail import send_mail
|
from django.core.mail import send_mail
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
|
from tasks.models import Tasks
|
||||||
|
|
||||||
|
# Deletes all Notifications added to to delete news
|
||||||
|
@receiver(pre_delete, sender=News)
|
||||||
|
def del_news_notifications(sender, instance, **kwargs):
|
||||||
|
UserNotification.objects.filter(elementid=instance.pk).delete()
|
||||||
|
|
||||||
|
|
||||||
# SIGNALS FOR USER
|
# SIGNALS FOR USER
|
||||||
'''
|
'''
|
||||||
@receiver(post_save, sender=User)
|
@receiver(post_save, sender=User)
|
||||||
|
|
@ -38,8 +46,6 @@ def adjust_group_notifications(instance, action, reverse, model, pk_set, using,
|
||||||
|
|
||||||
# IF FALSE NO MAILS WILL BE SEND - IN PRODUCTIVITY CHANGE TO TRUE #
|
# IF FALSE NO MAILS WILL BE SEND - IN PRODUCTIVITY CHANGE TO TRUE #
|
||||||
GLOBALSENDMAILS = True
|
GLOBALSENDMAILS = True
|
||||||
|
|
||||||
|
|
||||||
# GROUPSETTINGS FOR SOME USER WAS CHANGED
|
# GROUPSETTINGS FOR SOME USER WAS CHANGED
|
||||||
if isinstance(instance, Group):
|
if isinstance(instance, Group):
|
||||||
group_touched = AgencyGroup.objects.get(group=instance)
|
group_touched = AgencyGroup.objects.get(group=instance)
|
||||||
|
|
@ -91,10 +97,7 @@ def adjust_group_notifications(instance, action, reverse, model, pk_set, using,
|
||||||
|
|
||||||
# SIGNAL FOR NEWS
|
# SIGNAL FOR NEWS
|
||||||
|
|
||||||
# Deletes all Notifications added to to delete news
|
|
||||||
@receiver(pre_delete, sender=News)
|
|
||||||
def del_news_notifications(sender, instance, **kwargs):
|
|
||||||
UserNotification.objects.filter(elementid=instance.pk).delete()
|
|
||||||
|
|
||||||
@receiver(post_save, sender=News)
|
@receiver(post_save, sender=News)
|
||||||
def save_news(sender, instance, **kwargs):
|
def save_news(sender, instance, **kwargs):
|
||||||
|
|
@ -120,3 +123,58 @@ def save_news(sender, instance, **kwargs):
|
||||||
if(user.profile.news_push):
|
if(user.profile.news_push):
|
||||||
newnotification = UserNotification(touser=user, notificationtext="Neue Agenturnews: " + instance.name, notificationtype="agencynews", elementid=instance.pk)
|
newnotification = UserNotification(touser=user, notificationtext="Neue Agenturnews: " + instance.name, notificationtype="agencynews", elementid=instance.pk)
|
||||||
newnotification.save()
|
newnotification.save()
|
||||||
|
|
||||||
|
# SIGNALS FOR TASK
|
||||||
|
@receiver(signal=m2m_changed, sender=Tasks.usersfield.through)
|
||||||
|
def adjust_group_notifications(instance, action, reverse, model, pk_set, using, *args, **kwargs):
|
||||||
|
|
||||||
|
# IF FALSE NO MAILS WILL BE SEND - IN PRODUCTIVITY CHANGE TO TRUE #
|
||||||
|
GLOBALSENDMAILS = True
|
||||||
|
|
||||||
|
# A USER WAS TOUCHED ATT HIS TASKS
|
||||||
|
user_touched = User.objects.get(pk=list(pk_set)[0])
|
||||||
|
taskname = instance.name
|
||||||
|
|
||||||
|
# PUSH NOTIFICATION FOR GROUOPCHANGES
|
||||||
|
if(user_touched.profile.add_task_push):
|
||||||
|
if(action == 'post_remove'):
|
||||||
|
newnotification = UserNotification(touser=user_touched, notificationtext="Sie wurden von der Tätigkeit " + taskname + " entfernt.", notificationtype="taskchange")
|
||||||
|
newnotification.save()
|
||||||
|
# A USER WAS ADDED TO A GROUP
|
||||||
|
elif(action == 'post_add'):
|
||||||
|
newnotification = UserNotification(touser=user_touched, notificationtext="Sie wurden der Tätigkeit " + taskname + " zugeordnet.", notificationtype="taskchange")
|
||||||
|
newnotification.save()
|
||||||
|
|
||||||
|
# E-MAILNOTIFICATIONS FOR GROUPCHANGES
|
||||||
|
if(user_touched.profile.add_task_mail):
|
||||||
|
notificationtext = ""
|
||||||
|
if(action == 'post_remove'):
|
||||||
|
notificationtext = "Sie wurden von der Tätigkeit " + taskname + " entfernt."
|
||||||
|
|
||||||
|
username = user_touched.first_name + " " + user_touched.last_name
|
||||||
|
msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext})
|
||||||
|
if(GLOBALSENDMAILS):
|
||||||
|
send_mail(
|
||||||
|
'Agentur-Benachrichtigung',
|
||||||
|
'Hallo ' + user_touched.first_name + ' ' + user_touched.last_name + '! ' + notificationtext,
|
||||||
|
'support@digitale-agentur.com',
|
||||||
|
[user_touched.email],
|
||||||
|
html_message=msg_html,
|
||||||
|
fail_silently=False
|
||||||
|
)
|
||||||
|
|
||||||
|
# A USER WAS ADDED TO A GROUP
|
||||||
|
elif(action == 'post_add'):
|
||||||
|
notificationtext = "Sie wurden der Tätigkeit " + taskname + " zugeordnet."
|
||||||
|
|
||||||
|
username = user_touched.first_name + " " + user_touched.last_name
|
||||||
|
msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext})
|
||||||
|
if(GLOBALSENDMAILS):
|
||||||
|
send_mail(
|
||||||
|
'Agentur-Benachrichtigung',
|
||||||
|
'Hallo ' + user_touched.first_name + ' ' + user_touched.last_name + '! ' + notificationtext,
|
||||||
|
'support@digitale-agentur.com',
|
||||||
|
[user_touched.email],
|
||||||
|
html_message=msg_html,
|
||||||
|
fail_silently=False
|
||||||
|
)
|
||||||
|
|
@ -139,13 +139,7 @@
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if perms.users.users_usermanagement or perms.users.areas_management or perms.users.tasks_management or perms.user.news_management %}
|
|
||||||
<hr class="sidebar-divider">
|
|
||||||
<!-- Heading -->
|
|
||||||
<div class="sidebar-heading">
|
|
||||||
Agenturorga
|
|
||||||
</div>
|
|
||||||
{%endif%}
|
|
||||||
<!--
|
<!--
|
||||||
{% if perms.users.users_usermanagement %}
|
{% if perms.users.users_usermanagement %}
|
||||||
{% if active_link == 'usersmanagement' %}
|
{% if active_link == 'usersmanagement' %}
|
||||||
|
|
@ -159,18 +153,7 @@
|
||||||
</li>
|
</li>
|
||||||
{%endif%}
|
{%endif%}
|
||||||
-->
|
-->
|
||||||
{% if perms.users.tasks_management %}
|
|
||||||
{% if active_link == 'tasksmanagement' %}
|
|
||||||
<li class="nav-item active">
|
|
||||||
{% else%}
|
|
||||||
<li class="nav-item">
|
|
||||||
{%endif%}
|
|
||||||
<a class="nav-link " href="{% url 'tasks-management' %}" aria-expanded="true">
|
|
||||||
<i class="fas fa-fw fa-tasks"></i>
|
|
||||||
<span>Aufgaben</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{%endif%}
|
|
||||||
<!--
|
<!--
|
||||||
{% if perms.users.news_management %}
|
{% if perms.users.news_management %}
|
||||||
{% if active_link == 'newsmanagement' %}
|
{% if active_link == 'newsmanagement' %}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue