add a view for groups

This commit is contained in:
Andreas Zweili 2021-12-30 20:51:39 +01:00
parent e4ad765b63
commit 0f87a2730c
13 changed files with 384 additions and 0 deletions

View File

@ -31,6 +31,14 @@ class CustomersTable(CoreTable):
text='Users',
args=[A('pk')],
orderable=False)
ad_groups = tables.LinkColumn('ad_groups',
text='AD Groups',
args=[A('pk')],
orderable=False)
mail_groups = tables.LinkColumn('mail_groups',
text='Mail Groups',
args=[A('pk')],
orderable=False)
delete = tables.LinkColumn('customer_delete',
text='delete',
args=[A('pk')], attrs={

View File

@ -19,6 +19,10 @@ class AdGroup(Group):
ordering = ['name']
verbose_name_plural = "AD Groups"
def get_absolute_url(self):
from django.urls import reverse
return reverse('ad_group', args=[str(self.id)])
class MailGroup(Group):
mail_address = models.EmailField()
@ -26,3 +30,7 @@ class MailGroup(Group):
class Meta:
ordering = ['name']
verbose_name_plural = "Mail Groups"
def get_absolute_url(self):
from django.urls import reverse
return reverse('mail_group', args=[str(self.id)])

View File

@ -3,6 +3,8 @@ from django_tables2.utils import A
from core.tables import CoreTable
from .models import AdGroup
from .models import MailGroup
from .models import User
@ -27,3 +29,31 @@ class UsersTable(CoreTable):
class Meta(CoreTable.Meta):
model = User
class AdGroupsTable(CoreTable):
id = tables.Column(visible=False)
name = tables.Column('AdGroup', linkify=True)
customer = tables.Column('Customer', linkify=True)
delete = tables.LinkColumn('ad_group_delete',
text='delete',
args=[A('pk')], attrs={
'a': {'class': 'delete material-icons', }
}, orderable=False)
class Meta(CoreTable.Meta):
model = AdGroup
class MailGroupsTable(CoreTable):
id = tables.Column(visible=False)
name = tables.Column('MailGroup', linkify=True)
customer = tables.Column('Customer', linkify=True)
delete = tables.LinkColumn('mail_group_delete',
text='delete',
args=[A('pk')], attrs={
'a': {'class': 'delete material-icons', }
}, orderable=False)
class Meta(CoreTable.Meta):
model = MailGroup

View File

@ -0,0 +1,16 @@
{% extends "core/base.html" %}
{% block section_title %}Delete AD group{% endblock %}
{% block content %}
<div class="row">
<form method="post">{% csrf_token %}
<p>Are you sure you want to delete the AD group "{{ object }}"?</p>
<button type="submit" class="btn btn-danger">Delete</button>
<a href="{% url 'ad_groups' object.customer.pk %}" class="btn btn-primary">Cancel</a>
<input type="hidden" id="previous_page" name="previous_page" value="/previous/page/url">
</form>
<script>
prev = document.getElementById("previous_page");
prev.value = document.referrer;
</script>
</div>
{% endblock %}

View File

@ -0,0 +1,17 @@
{% extends "core/base.html" %}
{% block section_title %}{{ group }}{% endblock %}
{% block content %}
<div class="row">
<div class="col">
<div class="card mt-3">
<div class="card-body">
<div class="card-text">
<ul>
<li>Customer: <a href="{% url 'customer' group.customer.id %}">{{ group.customer }}</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,8 @@
{% extends "core/base.html" %}
{% load render_table from django_tables2 %}
{% block section_title %}Groups{% endblock %}
{% block content %}
<div class="table-responsive">
{% render_table groups %}
</div>
{% endblock %}

View File

@ -0,0 +1,16 @@
{% extends "core/base.html" %}
{% block section_title %}Delete Mail group{% endblock %}
{% block content %}
<div class="row">
<form method="post">{% csrf_token %}
<p>Are you sure you want to delete the mail group "{{ object }}"?</p>
<button type="submit" class="btn btn-danger">Delete</button>
<a href="{% url 'mail_groups' object.customer.pk %}" class="btn btn-primary">Cancel</a>
<input type="hidden" id="previous_page" name="previous_page" value="/previous/page/url">
</form>
<script>
prev = document.getElementById("previous_page");
prev.value = document.referrer;
</script>
</div>
{% endblock %}

View File

@ -0,0 +1,41 @@
import pytest
from mixer.backend.django import mixer
from django.test import Client
from core.tests import helper
pytestmark = pytest.mark.django_db
def test_ad_group_detail_view_not_logged_in():
response = Client().get('/ad-group/1/')
assert response.status_code == 302 and 'login' in response.url
def test_ad_group_detail_view(create_admin_user):
create_admin_user()
group = mixer.blend('users.AdGroup', customer=mixer.SELECT)
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/ad-group/' + str(group.id) + '/')
assert (response.status_code == 200
and helper.in_content(response, group))
def test_ad_group_detail_view_not_found(create_admin_user):
create_admin_user()
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/ad-group/230/')
assert response.status_code == 404
def test_ad_group_detail_view_no_permission(create_admin_user):
create_admin_user()
customer = mixer.blend('customers.Customer')
group = mixer.blend('users.AdGroup', customer=customer)
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/ad-group/' + str(group.id) + '/')
assert response.status_code == 404

View File

@ -0,0 +1,58 @@
import pytest
from django.test import Client
from mixer.backend.django import mixer
from core.tests import helper
from customers.models import Customer
pytestmark = pytest.mark.django_db
def test_customer_ad_group_table_not_logged_in():
response = Client().get('/customer/1/ad-groups/')
assert response.status_code == 302 and 'login' in response.url
def test_customer_ad_group_table(create_admin_user):
fixture = create_admin_user()
customer = fixture['customer']
client = Client()
client.login(username="pharma-admin", password="password")
ad_group = mixer.blend('users.AdGroup', customer=customer)
response = client.get('/customer/' + str(customer.id) + '/ad-groups/')
assert (response.status_code == 200
and helper.in_content(response, ad_group))
def test_customer_ad_group_table_no_group(create_admin_user):
fixture = create_admin_user()
customer = fixture['customer']
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/customer/' + str(customer.id) + '/ad-groups/')
assert (response.status_code == 200
and helper.not_in_content(response, customer))
def test_customer_ad_group_table_no_permission(create_admin_user):
create_admin_user()
customer = Customer.objects.create(name='Water Corp.')
client = Client()
client.login(username="pharma-admin", password="password")
mixer.blend('users.AdGroup', customer=customer)
response = client.get('/customer/' + str(customer.id) + '/ad-groups/')
assert response.status_code == 404
def test_customer_ad_group_table_multiple_groups(create_admin_user):
fixture = create_admin_user()
customer = fixture['customer']
client = Client()
client.login(username="pharma-admin", password="password")
group1 = mixer.blend('users.AdGroup', customer=mixer.SELECT)
group2 = mixer.blend('users.AdGroup', customer=mixer.SELECT)
response = client.get('/customer/' + str(customer.id) + '/ad-groups/')
assert (response.status_code == 200
and helper.in_content(response, group1.name)
and helper.in_content(response, group2.name))

View File

@ -0,0 +1,58 @@
import pytest
from django.test import Client
from mixer.backend.django import mixer
from core.tests import helper
from customers.models import Customer
pytestmark = pytest.mark.django_db
def test_customer_mail_group_table_not_logged_in():
response = Client().get('/customer/1/mail-groups/')
assert response.status_code == 302 and 'login' in response.url
def test_customer_mail_group_table(create_admin_user):
fixture = create_admin_user()
customer = fixture['customer']
client = Client()
client.login(username="pharma-admin", password="password")
mail_group = mixer.blend('users.MailGroup', customer=customer)
response = client.get('/customer/' + str(customer.id) + '/mail-groups/')
assert (response.status_code == 200
and helper.in_content(response, mail_group))
def test_customer_mail_group_table_no_group(create_admin_user):
fixture = create_admin_user()
customer = fixture['customer']
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/customer/' + str(customer.id) + '/mail-groups/')
assert (response.status_code == 200
and helper.not_in_content(response, customer))
def test_customer_mail_group_table_no_permission(create_admin_user):
create_admin_user()
customer = Customer.objects.create(name='Water Corp.')
client = Client()
client.login(username="pharma-admin", password="password")
mixer.blend('users.MailGroup', customer=customer)
response = client.get('/customer/' + str(customer.id) + '/mail-groups/')
assert response.status_code == 404
def test_customer_mail_group_table_multiple_groups(create_admin_user):
fixture = create_admin_user()
customer = fixture['customer']
client = Client()
client.login(username="pharma-admin", password="password")
group1 = mixer.blend('users.MailGroup', customer=mixer.SELECT)
group2 = mixer.blend('users.MailGroup', customer=mixer.SELECT)
response = client.get('/customer/' + str(customer.id) + '/mail-groups/')
assert (response.status_code == 200
and helper.in_content(response, group1.name)
and helper.in_content(response, group2.name))

View File

@ -0,0 +1,41 @@
import pytest
from mixer.backend.django import mixer
from django.test import Client
from core.tests import helper
pytestmark = pytest.mark.django_db
def test_mail_group_detail_view_not_logged_in():
response = Client().get('/mail-group/1/')
assert response.status_code == 302 and 'login' in response.url
def test_mail_group_detail_view(create_admin_user):
create_admin_user()
group = mixer.blend('users.MailGroup', customer=mixer.SELECT)
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/mail-group/' + str(group.id) + '/')
assert (response.status_code == 200
and helper.in_content(response, group))
def test_mail_group_detail_view_not_found(create_admin_user):
create_admin_user()
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/mail-group/230/')
assert response.status_code == 404
def test_mail_group_detail_view_no_permission(create_admin_user):
create_admin_user()
customer = mixer.blend('customers.Customer')
group = mixer.blend('users.MailGroup', customer=customer)
client = Client()
client.login(username="pharma-admin", password="password")
response = client.get('/mail-group/' + str(group.id) + '/')
assert response.status_code == 404

View File

@ -3,6 +3,16 @@ from django.urls import path
from . import views
urlpatterns = [
path('customer/<int:pk>/ad-groups/', views.ad_groups_table_view,
name='ad_groups'),
path('customer/<int:pk>/mail-groups/', views.mail_groups_table_view,
name='mail_groups'),
path('ad-group/<int:pk>/', views.ad_group_detail_view, name='ad_group'),
path('mail-group/<int:pk>/', views.mail_group_detail_view, name='mail_group'),
path('delete/ad-group/<int:pk>/', views.delete_ad_group,
name='ad_group_delete'),
path('delete/mail-group/<int:pk>/', views.delete_mail_group,
name='mail_group_delete'),
path('customer/<int:pk>/users/', views.users_table_view,
name='users'),
path('user/<int:pk>/', views.user_detail_view, name='user'),

View File

@ -1,21 +1,28 @@
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import get_object_or_404
from django.shortcuts import redirect
from django.shortcuts import render
from django.template.response import TemplateResponse
from django.urls import reverse
from django.views.generic import DeleteView
from django_tables2 import RequestConfig
from core import utils
from customers.decorators import customer_view_permission
from computers.models import Computer
from licenses.models import LicenseWithUser
from .decorators import user_view_permission
from .models import AdGroup
from .models import MailGroup
from .models import MailAlias
from .models import User
from .models import UserInAdGroup
from .models import UserInMailGroup
from .tables import AdGroupsTable
from .tables import MailGroupsTable
from .tables import UsersTable
@ -50,3 +57,69 @@ class UserDeleteView(LoginRequiredMixin, DeleteView):
def get_success_url(self):
return reverse('users', args=(self.object.customer.pk,))
@login_required
def ad_groups_table_view(request, pk):
table = AdGroupsTable(utils.get_objects_for_customer(AdGroup,
user=request.user,
customer_pk=pk))
RequestConfig(request).configure(table)
return TemplateResponse(request,
'groups/group_list.html',
{'groups': table})
@login_required
def ad_group_detail_view(request, pk):
group = utils.get_object_with_view_permission(AdGroup,
user=request.user,
pk=pk)
return render(request, 'groups/group_details.html',
{'group': group})
@login_required
def mail_groups_table_view(request, pk):
table = MailGroupsTable(utils.get_objects_for_customer(MailGroup,
user=request.user,
customer_pk=pk))
RequestConfig(request).configure(table)
return TemplateResponse(request,
'groups/group_list.html',
{'groups': table})
@login_required
def mail_group_detail_view(request, pk):
group = utils.get_object_with_view_permission(MailGroup,
user=request.user,
pk=pk)
return render(request, 'groups/group_details.html',
{'group': group})
@login_required
def delete_ad_group(request, pk):
group = utils.get_object_with_view_permission(AdGroup,
user=request.user,
pk=pk)
if request.method == 'POST':
group.delete()
return redirect('ad_groups', pk=group.customer.pk)
return TemplateResponse(request,
'groups/ad_group_confirm_delete.html',
{'object': group})
@login_required
def delete_mail_group(request, pk):
group = utils.get_object_with_view_permission(MailGroup,
user=request.user,
pk=pk)
if request.method == 'POST':
group.delete()
return redirect('mail_groups', pk=group.customer.pk)
return TemplateResponse(request,
'groups/mail_group_confirm_delete.html',
{'object': group})