add a view for groups
This commit is contained in:
parent
e4ad765b63
commit
0f87a2730c
|
@ -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={
|
||||
|
|
|
@ -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)])
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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
|
|
@ -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))
|
|
@ -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))
|
|
@ -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
|
|
@ -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'),
|
||||
|
|
|
@ -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})
|
||||
|
|
Loading…
Reference in New Issue