Use default line length of black

This commit is contained in:
Andreas Zweili 2023-07-10 16:47:01 +02:00
parent bfb5c19931
commit 729cf08cea
49 changed files with 122 additions and 312 deletions

View File

@ -1,8 +0,0 @@
[flake8]
exclude =
*migrations*,
__init__.py,
*cache*,
venv/,
src/manage.py,
src/network_inventory/settings/*

View File

@ -68,8 +68,8 @@
checkInputs = [ pkgs.inventoryDevEnv ]; checkInputs = [ pkgs.inventoryDevEnv ];
checkPhase = '' checkPhase = ''
mkdir -p $out mkdir -p $out
pylint --errors-only src/
cd src/ && mypy --config-file=../pyproject.toml . cd src/ && mypy --config-file=../pyproject.toml .
flake8 . --count --show-source --statistics
''; '';
}; };
tests = pkgs.stdenv.mkDerivation { tests = pkgs.stdenv.mkDerivation {

View File

@ -1,7 +1,5 @@
[tool.black]
line-length = 79
[tool.pylint] [tool.pylint]
max-line-length = 88
load-plugins = [ load-plugins = [
"pylint_django", "pylint_django",
] ]
@ -21,6 +19,24 @@ exclude = [
"tests/", "tests/",
] ]
plugins = ["mypy_django_plugin.main"] plugins = ["mypy_django_plugin.main"]
mypy_path = "./src"
# Start off with these
warn_unused_configs = true
warn_redundant_casts = true
warn_unused_ignores = true
# Getting these passing should be easy
strict_equality = true
strict_concatenate = true
# Strongly recommend enabling this one as soon as you can
#check_untyped_defs = true
# These shouldn't be too much additional work, but may be tricky to
# get passing if you use a lot of untyped libraries
#disallow_subclassing_any = true
#disallow_untyped_decorators = true
#disallow_any_generics = true
[tool.django-stubs] [tool.django-stubs]
django_settings_module = "network_inventory.settings.local" django_settings_module = "network_inventory.settings.local"

View File

@ -11,8 +11,6 @@ def backup_view_permission(old_fuction):
if user.has_perm("customers.view_customer", backup.computer.customer): if user.has_perm("customers.view_customer", backup.computer.customer):
return old_fuction(request, pk) return old_fuction(request, pk)
else: else:
return HttpResponseForbidden( return HttpResponseForbidden("You're not allowed to access this device.")
"You're not allowed to access this device."
)
return new_function return new_function

View File

@ -20,18 +20,12 @@ class Backup(models.Model):
computer = models.ForeignKey( computer = models.ForeignKey(
Computer, related_name="source_computer", on_delete=models.CASCADE Computer, related_name="source_computer", on_delete=models.CASCADE
) )
method = models.ForeignKey( method = models.ForeignKey(BackupMethod, models.SET_NULL, blank=True, null=True)
BackupMethod, models.SET_NULL, blank=True, null=True software = models.ForeignKey(Software, models.SET_NULL, blank=True, null=True)
)
software = models.ForeignKey(
Software, models.SET_NULL, blank=True, null=True
)
source_path = models.CharField(max_length=200, blank=True) source_path = models.CharField(max_length=200, blank=True)
exec_time = models.TimeField(null=True, blank=True) exec_time = models.TimeField(null=True, blank=True)
exec_days = models.ManyToManyField(Weekday, blank=True) exec_days = models.ManyToManyField(Weekday, blank=True)
target_device = models.ManyToManyField( target_device = models.ManyToManyField(Computer, through="TargetDevice", blank=True)
Computer, through="TargetDevice", blank=True
)
class Meta: class Meta:
ordering = ["name"] ordering = ["name"]
@ -50,9 +44,7 @@ class Backup(models.Model):
class TargetDevice(models.Model): class TargetDevice(models.Model):
device = models.ForeignKey( device = models.ForeignKey(Computer, models.SET_NULL, blank=True, null=True)
Computer, models.SET_NULL, blank=True, null=True
)
backup = models.ForeignKey(Backup, on_delete=models.CASCADE) backup = models.ForeignKey(Backup, on_delete=models.CASCADE)
target_path = models.CharField(max_length=200, blank=True) target_path = models.CharField(max_length=200, blank=True)

View File

@ -53,9 +53,7 @@ def test_backup_detail_view_with_target_device(create_admin_user):
software=mixer.SELECT, software=mixer.SELECT,
method=mixer.SELECT, method=mixer.SELECT,
) )
mixer.blend( mixer.blend("backups.TargetDevice", device=target_computer, backup=mixer.SELECT)
"backups.TargetDevice", device=target_computer, backup=mixer.SELECT
)
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/backup/" + str(backup.id) + "/") response = client.get("/backup/" + str(backup.id) + "/")
@ -79,9 +77,7 @@ def test_backup_detail_view_with_notification(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/backup/" + str(backup.id) + "/") response = client.get("/backup/" + str(backup.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, notification)
response, notification
)
def test_backup_detail_view_with_day_relation(create_admin_user): def test_backup_detail_view_with_day_relation(create_admin_user):

View File

@ -23,9 +23,7 @@ def test_customer_backup_table(create_admin_user):
computer = mixer.blend("computers.Computer", customer=customer) computer = mixer.blend("computers.Computer", customer=customer)
backup = mixer.blend("backups.Backup", computer=computer) backup = mixer.blend("backups.Backup", computer=computer)
response = client.get("/customer/" + str(customer.id) + "/backups/") response = client.get("/customer/" + str(customer.id) + "/backups/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, backup.name)
response, backup.name
)
def test_customer_backup_table_no_backup(create_admin_user): def test_customer_backup_table_no_backup(create_admin_user):

View File

@ -3,9 +3,7 @@ from django.urls import path
from . import views from . import views
urlpatterns = [ urlpatterns = [
path( path("customer/<int:pk>/backups/", views.backups_table_view, name="backups"),
"customer/<int:pk>/backups/", views.backups_table_view, name="backups"
),
path("backup/<int:pk>/", views.backup_detail_view, name="backup"), path("backup/<int:pk>/", views.backup_detail_view, name="backup"),
path( path(
"create/backup-for-computer/<int:pk>/", "create/backup-for-computer/<int:pk>/",

View File

@ -47,7 +47,7 @@ def backup_detail_view(request, pk):
class BackupCreateView(LoginRequiredMixin, CreateView): class BackupCreateView(LoginRequiredMixin, CreateView):
model = Backup model = Backup
template_name = "backups/backup_create.html" template_name = "backups/backup_create.html"
fields = "__all__" fields = "__all__" # type: ignore
def get_success_url(self): def get_success_url(self):
return reverse("computer", args=(self.computer.pk,)) return reverse("computer", args=(self.computer.pk,))

View File

@ -41,15 +41,9 @@ class ComputerUpdateForm(forms.ModelForm):
def __init__(self, request, *args, **kwargs): def __init__(self, request, *args, **kwargs):
super(ComputerUpdateForm, self).__init__(*args, **kwargs) super(ComputerUpdateForm, self).__init__(*args, **kwargs)
customers = utils.objects_for_allowed_customers( customers = utils.objects_for_allowed_customers(Customer, user=request.user)
Customer, user=request.user locations = utils.objects_for_allowed_customers(Location, user=request.user)
) hosts = utils.objects_for_allowed_customers(Computer, user=request.user)
locations = utils.objects_for_allowed_customers(
Location, user=request.user
)
hosts = utils.objects_for_allowed_customers(
Computer, user=request.user
)
users = utils.objects_for_allowed_customers(User, user=request.user) users = utils.objects_for_allowed_customers(User, user=request.user)
self.fields["customer"].queryset = customers self.fields["customer"].queryset = customers
self.fields["location"].queryset = locations self.fields["location"].queryset = locations

View File

@ -23,12 +23,8 @@ class Computer(Device):
ram = models.ManyToManyField(Ram, through="ComputerRamRelation") ram = models.ManyToManyField(Ram, through="ComputerRamRelation")
gpu = models.ManyToManyField(Gpu, through="ComputerGpuRelation") gpu = models.ManyToManyField(Gpu, through="ComputerGpuRelation")
disks = models.ManyToManyField(Disk, through="ComputerDiskRelation") disks = models.ManyToManyField(Disk, through="ComputerDiskRelation")
software = models.ManyToManyField( software = models.ManyToManyField(Software, through="ComputerSoftwareRelation")
Software, through="ComputerSoftwareRelation" host = models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE)
)
host = models.ForeignKey(
"self", null=True, blank=True, on_delete=models.CASCADE
)
allocated_space = models.IntegerField(null=True, blank=True) allocated_space = models.IntegerField(null=True, blank=True)
def __str__(self): def __str__(self):

View File

@ -12,9 +12,7 @@ class RaidType(Category):
class Raid(models.Model): class Raid(models.Model):
usable_space = models.IntegerField(blank=True, null=True) usable_space = models.IntegerField(blank=True, null=True)
raid_type = models.ForeignKey( raid_type = models.ForeignKey(RaidType, models.SET_NULL, blank=True, null=True)
RaidType, models.SET_NULL, blank=True, null=True
)
computer = models.ForeignKey(Computer, on_delete=models.CASCADE) computer = models.ForeignKey(Computer, on_delete=models.CASCADE)
def __str__(self): def __str__(self):

View File

@ -15,15 +15,11 @@ def test_computer_detail_view_not_logged_in():
def test_computer_detail_view(create_admin_user): def test_computer_detail_view(create_admin_user):
create_admin_user() create_admin_user()
computer = mixer.blend( computer = mixer.blend("computers.Computer", customer=mixer.SELECT, os=mixer.SELECT)
"computers.Computer", customer=mixer.SELECT, os=mixer.SELECT
)
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/computer/" + str(computer.id) + "/") response = client.get("/computer/" + str(computer.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, computer)
response, computer
)
def test_computer_detail_view_not_found(create_admin_user): def test_computer_detail_view_not_found(create_admin_user):
@ -43,9 +39,7 @@ def test_computer_detail_view_ram_relation(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/computer/" + str(computer.id) + "/") response = client.get("/computer/" + str(computer.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, "RAM Modules:")
response, "RAM Modules:"
)
def test_computer_detail_view_raid_relation(create_admin_user): def test_computer_detail_view_raid_relation(create_admin_user):
@ -53,9 +47,7 @@ def test_computer_detail_view_raid_relation(create_admin_user):
computer = mixer.blend("computers.Computer", customer=mixer.SELECT) computer = mixer.blend("computers.Computer", customer=mixer.SELECT)
raid_type = mixer.blend("computers.RaidType") raid_type = mixer.blend("computers.RaidType")
disk = mixer.blend("computers.Disk") disk = mixer.blend("computers.Disk")
raid = mixer.blend( raid = mixer.blend("computers.Raid", computer=computer, raid_type=raid_type)
"computers.Raid", computer=computer, raid_type=raid_type
)
mixer.blend("computers.DisksInRaid", raid=raid, disk=disk) mixer.blend("computers.DisksInRaid", raid=raid, disk=disk)
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")

View File

@ -12,9 +12,7 @@ def test_computer_create_form(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
user = mixer.blend("core.InventoryUser", customer=fixture["customer"]) user = mixer.blend("core.InventoryUser", customer=fixture["customer"])
form = forms.ComputerCreateForm(user=user, data={}) form = forms.ComputerCreateForm(user=user, data={})
assert ( assert form.is_valid() is False, "Should be false because no data was given"
form.is_valid() is False
), "Should be false because no data was given"
data = {"name": "pharma-pc1", "customer": 3} data = {"name": "pharma-pc1", "customer": 3}
form = forms.ComputerCreateForm(user=user, data=data) form = forms.ComputerCreateForm(user=user, data=data)
@ -32,9 +30,7 @@ def test_computer_update_form(create_admin_user):
request = HttpRequest() request = HttpRequest()
request.user = fixture["admin"] request.user = fixture["admin"]
form = forms.ComputerUpdateForm(request, data={}) form = forms.ComputerUpdateForm(request, data={})
assert ( assert form.is_valid() is False, "Should be false because no data was given"
form.is_valid() is False
), "Should be false because no data was given"
data = {"name": "pharma-pc1", "customer": 20356} data = {"name": "pharma-pc1", "customer": 20356}
form = forms.ComputerUpdateForm(request, data=data) form = forms.ComputerUpdateForm(request, data=data)

View File

@ -27,6 +27,4 @@ def test_computer_list_view(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/computers/all/") response = client.get("/computers/all/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, computer)
response, computer
)

View File

@ -21,9 +21,7 @@ def test_customer_computer_table(create_admin_user):
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
computer = mixer.blend("computers.Computer", customer=mixer.SELECT) computer = mixer.blend("computers.Computer", customer=mixer.SELECT)
response = client.get("/customer/" + str(customer.id) + "/computers/") response = client.get("/customer/" + str(customer.id) + "/computers/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, computer)
response, computer
)
def test_customer_computer_table_no_computer(create_admin_user): def test_customer_computer_table_no_computer(create_admin_user):

View File

@ -41,9 +41,7 @@ from .tables import ComputersTable
@login_required @login_required
def computer_detail_view(request, pk): def computer_detail_view(request, pk):
device = utils.get_object_with_view_permission( device = utils.get_object_with_view_permission(Computer, user=request.user, pk=pk)
Computer, user=request.user, pk=pk
)
disks_relations = ComputerDiskRelation.objects.filter(computer=pk) disks_relations = ComputerDiskRelation.objects.filter(computer=pk)
warranty_relations = Warranty.objects.filter(device=pk) warranty_relations = Warranty.objects.filter(device=pk)
ram_relations = ComputerRamRelation.objects.filter(computer=pk) ram_relations = ComputerRamRelation.objects.filter(computer=pk)
@ -76,9 +74,7 @@ def computer_detail_view(request, pk):
@login_required @login_required
def computers_table_view(request, pk): def computers_table_view(request, pk):
table = ComputersTable( table = ComputersTable(
utils.get_objects_for_customer( utils.get_objects_for_customer(Computer, user=request.user, customer_pk=pk)
Computer, user=request.user, customer_pk=pk
)
) )
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render( return render(
@ -139,9 +135,7 @@ def computer_update_view(request, pk):
A view to create a customer. A view to create a customer.
""" """
template_name = "computers/computer_update.html" template_name = "computers/computer_update.html"
computer = utils.get_object_with_view_permission( computer = utils.get_object_with_view_permission(Computer, user=request.user, pk=pk)
Computer, user=request.user, pk=pk
)
if request.method == "POST": if request.method == "POST":
form = ComputerUpdateForm(request, request.POST, instance=computer) form = ComputerUpdateForm(request, request.POST, instance=computer)
if form.is_valid(): if form.is_valid():

View File

@ -22,9 +22,7 @@ def django_db_setup(django_db_setup, django_db_blocker):
def create_admin_user(): def create_admin_user():
def _create_admin_user(): def _create_admin_user():
User = get_user_model() User = get_user_model()
admin = User.objects.create_user( admin = User.objects.create_user("pharma-admin", "admin@pharma.com", "password")
"pharma-admin", "admin@pharma.com", "password"
)
customer = mixer.blend("customers.Customer") customer = mixer.blend("customers.Customer")
group = Group.objects.create(name="Pharma Corp. Admin") group = Group.objects.create(name="Pharma Corp. Admin")
admin.groups.add(group) admin.groups.add(group)

View File

@ -15,9 +15,7 @@ def test_get_object_with_view_permission(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
customer = fixture["customer"] customer = fixture["customer"]
admin = fixture["admin"] admin = fixture["admin"]
object = utils.get_object_with_view_permission( object = utils.get_object_with_view_permission(Customer, user=admin, pk=customer.id)
Customer, user=admin, pk=customer.id
)
assert object == customer assert object == customer
@ -26,9 +24,7 @@ def test_get_object_with_view_permission_device(create_admin_user):
customer = fixture["customer"] customer = fixture["customer"]
admin = fixture["admin"] admin = fixture["admin"]
device = mixer.blend(Device, customer=customer) device = mixer.blend(Device, customer=customer)
object = utils.get_object_with_view_permission( object = utils.get_object_with_view_permission(Device, user=admin, pk=device.id)
Device, user=admin, pk=device.id
)
assert object == device assert object == device
@ -37,9 +33,7 @@ def test_get_object_without_view_permission(create_admin_user):
customer = mixer.blend(Customer) customer = mixer.blend(Customer)
admin = fixture["admin"] admin = fixture["admin"]
with pytest.raises(Http404): with pytest.raises(Http404):
utils.get_object_with_view_permission( utils.get_object_with_view_permission(Customer, user=admin, pk=customer.id)
Customer, user=admin, pk=customer.id
)
def test_get_object_without_view_permission_device(create_admin_user): def test_get_object_without_view_permission_device(create_admin_user):

View File

@ -16,9 +16,7 @@ def test_get_objects_for_customer_with_customer(create_admin_user):
customer = fixture["customer"] customer = fixture["customer"]
admin = fixture["admin"] admin = fixture["admin"]
with pytest.raises(Exception): with pytest.raises(Exception):
utils.get_objects_for_customer( utils.get_objects_for_customer(Customer, user=admin, customer_pk=customer.id)
Customer, user=admin, customer_pk=customer.id
)
def test_get_objects_for_customer_device(create_admin_user): def test_get_objects_for_customer_device(create_admin_user):
@ -37,9 +35,7 @@ def test_get_all_objects_for_unallowed_customers(create_admin_user):
customer = mixer.blend(Customer) customer = mixer.blend(Customer)
admin = fixture["admin"] admin = fixture["admin"]
with pytest.raises(Http404): with pytest.raises(Http404):
utils.get_objects_for_customer( utils.get_objects_for_customer(Customer, user=admin, customer_pk=customer.id)
Customer, user=admin, customer_pk=customer.id
)
def test_get_all_objects_for_unallowed_customers_device(create_admin_user): def test_get_all_objects_for_unallowed_customers_device(create_admin_user):
@ -48,6 +44,4 @@ def test_get_all_objects_for_unallowed_customers_device(create_admin_user):
admin = fixture["admin"] admin = fixture["admin"]
mixer.blend(Device, customer=customer) mixer.blend(Device, customer=customer)
with pytest.raises(Http404): with pytest.raises(Http404):
utils.get_objects_for_customer( utils.get_objects_for_customer(Device, user=admin, customer_pk=customer.id)
Device, user=admin, customer_pk=customer.id
)

View File

@ -34,9 +34,7 @@ def _get_customers(user):
user : django.contrib.auth.models.User user : django.contrib.auth.models.User
""" """
return get_objects_for_user( return get_objects_for_user(user, "customers.view_customer", klass=Customer)
user, "customers.view_customer", klass=Customer
)
def get_object_with_view_permission(model, user=None, pk=None): def get_object_with_view_permission(model, user=None, pk=None):

View File

@ -10,8 +10,6 @@ def customer_view_permission(old_function):
if user.has_perm("customers.view_customer", customer): if user.has_perm("customers.view_customer", customer):
return old_function(request, pk) return old_function(request, pk)
else: else:
return HttpResponseForbidden( return HttpResponseForbidden("You're not allowed to access this page.")
"You're not allowed to access this page."
)
return new_function return new_function

View File

@ -6,9 +6,7 @@ from core.tables import CoreTable
class CustomersTable(CoreTable): class CustomersTable(CoreTable):
name = tables.LinkColumn("customer", args=[A("pk")]) name = tables.LinkColumn("customer", args=[A("pk")])
nets = tables.LinkColumn( nets = tables.LinkColumn("nets", text="Nets", args=[A("pk")], orderable=False)
"nets", text="Nets", args=[A("pk")], orderable=False
)
computers = tables.LinkColumn( computers = tables.LinkColumn(
"computers", text="Computers", args=[A("pk")], orderable=False "computers", text="Computers", args=[A("pk")], orderable=False
) )
@ -21,12 +19,8 @@ class CustomersTable(CoreTable):
licenses = tables.LinkColumn( licenses = tables.LinkColumn(
"licenses", text="Licenses", args=[A("pk")], orderable=False "licenses", text="Licenses", args=[A("pk")], orderable=False
) )
users = tables.LinkColumn( users = tables.LinkColumn("users", text="Users", args=[A("pk")], orderable=False)
"users", text="Users", args=[A("pk")], orderable=False groups = tables.LinkColumn("groups", text="Groups", args=[A("pk")], orderable=False)
)
groups = tables.LinkColumn(
"groups", text="Groups", args=[A("pk")], orderable=False
)
project_manager = tables.Column(verbose_name="Project Manager") project_manager = tables.Column(verbose_name="Project Manager")
delete = tables.LinkColumn( delete = tables.LinkColumn(
"customer_delete", "customer_delete",

View File

@ -42,24 +42,12 @@ def test_customer_list_view(create_admin_user):
assert ( assert (
response.status_code == 200 response.status_code == 200
and helper.in_content(response, customer) and helper.in_content(response, customer)
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer.id) + "/nets/")
response, "/customer/" + str(customer.id) + "/nets/" and helper.in_content(response, "/customer/" + str(customer.id) + "/computers/")
) and helper.in_content(response, "/customer/" + str(customer.id) + "/devices/")
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer.id) + "/backups/")
response, "/customer/" + str(customer.id) + "/computers/" and helper.in_content(response, "/customer/" + str(customer.id) + "/licenses/")
) and helper.in_content(response, "/customer/" + str(customer.id) + "/users/")
and helper.in_content(
response, "/customer/" + str(customer.id) + "/devices/"
)
and helper.in_content(
response, "/customer/" + str(customer.id) + "/backups/"
)
and helper.in_content(
response, "/customer/" + str(customer.id) + "/licenses/"
)
and helper.in_content(
response, "/customer/" + str(customer.id) + "/users/"
)
and helper.in_content(response, project_manager) and helper.in_content(response, project_manager)
) )
@ -75,41 +63,21 @@ def test_customer_list_view_multiple_customers(create_admin_user):
assert ( assert (
response.status_code == 200 response.status_code == 200
and helper.in_content(response, customer1) and helper.in_content(response, customer1)
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer1.id) + "/nets/")
response, "/customer/" + str(customer1.id) + "/nets/"
)
and helper.in_content( and helper.in_content(
response, "/customer/" + str(customer1.id) + "/computers/" response, "/customer/" + str(customer1.id) + "/computers/"
) )
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer1.id) + "/devices/")
response, "/customer/" + str(customer1.id) + "/devices/" and helper.in_content(response, "/customer/" + str(customer1.id) + "/backups/")
) and helper.in_content(response, "/customer/" + str(customer1.id) + "/licenses/")
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer1.id) + "/users/")
response, "/customer/" + str(customer1.id) + "/backups/"
)
and helper.in_content(
response, "/customer/" + str(customer1.id) + "/licenses/"
)
and helper.in_content(
response, "/customer/" + str(customer1.id) + "/users/"
)
and helper.in_content(response, customer2) and helper.in_content(response, customer2)
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer2.id) + "/nets/")
response, "/customer/" + str(customer2.id) + "/nets/"
)
and helper.in_content( and helper.in_content(
response, "/customer/" + str(customer2.id) + "/computers/" response, "/customer/" + str(customer2.id) + "/computers/"
) )
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer2.id) + "/devices/")
response, "/customer/" + str(customer2.id) + "/devices/" and helper.in_content(response, "/customer/" + str(customer2.id) + "/backups/")
) and helper.in_content(response, "/customer/" + str(customer2.id) + "/licenses/")
and helper.in_content( and helper.in_content(response, "/customer/" + str(customer1.id) + "/users/")
response, "/customer/" + str(customer2.id) + "/backups/"
)
and helper.in_content(
response, "/customer/" + str(customer2.id) + "/licenses/"
)
and helper.in_content(
response, "/customer/" + str(customer1.id) + "/users/"
)
) )

View File

@ -10,9 +10,7 @@ def test_location_form(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
user = fixture["admin"] user = fixture["admin"]
form = forms.LocationForm(user=user, data={}) form = forms.LocationForm(user=user, data={})
assert ( assert form.is_valid() is False, "Should be false because no data was given"
form.is_valid() is False
), "Should be false because no data was given"
data = {"name": "Main Office", "customer": 3} data = {"name": "Main Office", "customer": 3}
form = forms.LocationForm(user=user, data=data) form = forms.LocationForm(user=user, data=data)

View File

@ -14,9 +14,7 @@ def test_load_htmx_create_location_view(create_admin_user):
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
url = "/create/location/" url = "/create/location/"
response = client.get(url) response = client.get(url)
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, "Add Location")
response, "Add Location"
)
def test_htmx_create_location_view(create_admin_user): def test_htmx_create_location_view(create_admin_user):
@ -25,9 +23,7 @@ def test_htmx_create_location_view(create_admin_user):
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
data = {"name": mixer.faker.name(), "save_location": 1} data = {"name": mixer.faker.name(), "save_location": 1}
response = client.post("/create/location/", data) response = client.post("/create/location/", data)
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, data["name"])
response, data["name"]
)
def test_htmx_create_location_view_invalid_form(create_admin_user): def test_htmx_create_location_view_invalid_form(create_admin_user):

View File

@ -24,9 +24,7 @@ def customers_table_view(request):
customers = utils.objects_for_allowed_customers(Customer, request.user) customers = utils.objects_for_allowed_customers(Customer, request.user)
table = CustomersTable(customers) table = CustomersTable(customers)
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render( return render(request, "customers/customer_list.html", {"customers": table})
request, "customers/customer_list.html", {"customers": table}
)
@login_required @login_required
@ -44,20 +42,14 @@ def create_customer(request):
) )
form = CustomerForm() form = CustomerForm()
context = {"form": form} context = {"form": form}
return TemplateResponse( return TemplateResponse(request, "customers/partials/customer_create.html", context)
request, "customers/partials/customer_create.html", context
)
@login_required @login_required
def customer_detail_view(request, pk): def customer_detail_view(request, pk):
customer = utils.get_object_with_view_permission( customer = utils.get_object_with_view_permission(Customer, user=request.user, pk=pk)
Customer, user=request.user, pk=pk
)
context = {"customer": customer} context = {"customer": customer}
return TemplateResponse( return TemplateResponse(request, "customers/customer_details.html", context)
request, "customers/customer_details.html", context
)
class CustomerDeleteView(LoginRequiredMixin, DeleteView): # type: ignore class CustomerDeleteView(LoginRequiredMixin, DeleteView): # type: ignore

View File

@ -11,8 +11,6 @@ def device_view_permission(old_function):
if user.has_perm("customers.view_customer", device.customer): if user.has_perm("customers.view_customer", device.customer):
return old_function(request, pk) return old_function(request, pk)
else: else:
return HttpResponseForbidden( return HttpResponseForbidden("You're not allowed to access this device.")
"You're not allowed to access this device."
)
return new_function return new_function

View File

@ -69,12 +69,8 @@ class DeviceUpdateForm(forms.ModelForm):
def __init__(self, request, *args, **kwargs): def __init__(self, request, *args, **kwargs):
super(DeviceUpdateForm, self).__init__(*args, **kwargs) super(DeviceUpdateForm, self).__init__(*args, **kwargs)
customers = utils.objects_for_allowed_customers( customers = utils.objects_for_allowed_customers(Customer, user=request.user)
Customer, user=request.user locations = utils.objects_for_allowed_customers(Location, user=request.user)
)
locations = utils.objects_for_allowed_customers(
Location, user=request.user
)
users = utils.objects_for_allowed_customers(User, user=request.user) users = utils.objects_for_allowed_customers(User, user=request.user)
self.fields["customer"].queryset = customers self.fields["customer"].queryset = customers
self.fields["location"].queryset = locations self.fields["location"].queryset = locations

View File

@ -38,9 +38,7 @@ class DeviceCategory(Category):
class HardwareModel(models.Model): class HardwareModel(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
manufacturer = models.ForeignKey( manufacturer = models.ForeignKey(DeviceManufacturer, on_delete=models.CASCADE)
DeviceManufacturer, on_delete=models.CASCADE
)
class Meta: class Meta:
ordering = ["name"] ordering = ["name"]
@ -56,19 +54,13 @@ class Device(models.Model):
category = models.ForeignKey( category = models.ForeignKey(
DeviceCategory, on_delete=models.SET_NULL, null=True, blank=True DeviceCategory, on_delete=models.SET_NULL, null=True, blank=True
) )
owner = models.ForeignKey( owner = models.ForeignKey(Owner, on_delete=models.SET_NULL, null=True, blank=True)
Owner, on_delete=models.SET_NULL, null=True, blank=True
)
customer = models.ForeignKey(Customer, on_delete=models.CASCADE) customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
manufacturer = models.ForeignKey( manufacturer = models.ForeignKey(
DeviceManufacturer, models.SET_NULL, null=True, blank=True DeviceManufacturer, models.SET_NULL, null=True, blank=True
) )
model = models.ForeignKey( model = models.ForeignKey(HardwareModel, models.SET_NULL, null=True, blank=True)
HardwareModel, models.SET_NULL, null=True, blank=True location = models.ForeignKey(Location, models.SET_NULL, null=True, blank=True)
)
location = models.ForeignKey(
Location, models.SET_NULL, null=True, blank=True
)
user = models.ForeignKey(User, models.SET_NULL, null=True, blank=True) user = models.ForeignKey(User, models.SET_NULL, null=True, blank=True)
installation_date = models.DateField(null=True, blank=True) installation_date = models.DateField(null=True, blank=True)
net = models.ManyToManyField(Net, through="DeviceInNet") net = models.ManyToManyField(Net, through="DeviceInNet")

View File

@ -16,9 +16,7 @@ class WarrantyType(Category):
class Warranty(models.Model): class Warranty(models.Model):
customer = models.ForeignKey( customer = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=True)
Customer, on_delete=models.CASCADE, blank=True
)
device = models.ForeignKey(Device, on_delete=models.CASCADE) device = models.ForeignKey(Device, on_delete=models.CASCADE)
valid_from = models.DateField() valid_from = models.DateField()
valid_until = models.DateField() valid_until = models.DateField()

View File

@ -12,9 +12,7 @@ def test_device_create_form(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
user = mixer.blend("core.InventoryUser", customer=fixture["customer"]) user = mixer.blend("core.InventoryUser", customer=fixture["customer"])
form = forms.DeviceCreateForm(user=user, data={}) form = forms.DeviceCreateForm(user=user, data={})
assert ( assert form.is_valid() is False, "Should be false because no data was given"
form.is_valid() is False
), "Should be false because no data was given"
data = {"name": "pharma-device1", "customer": 3} data = {"name": "pharma-device1", "customer": 3}
form = forms.DeviceCreateForm(user=user, data=data) form = forms.DeviceCreateForm(user=user, data=data)
@ -32,9 +30,7 @@ def test_device_update_form(create_admin_user):
request = HttpRequest() request = HttpRequest()
request.user = fixture["admin"] request.user = fixture["admin"]
form = forms.DeviceUpdateForm(request, data={}) form = forms.DeviceUpdateForm(request, data={})
assert ( assert form.is_valid() is False, "Should be false because no data was given"
form.is_valid() is False
), "Should be false because no data was given"
data = {"name": "pharma-device1", "customer": 3} data = {"name": "pharma-device1", "customer": 3}
form = forms.DeviceUpdateForm(request, data=data) form = forms.DeviceUpdateForm(request, data=data)
@ -50,9 +46,7 @@ def test_device_update_form(create_admin_user):
def test_device_create_form_duplicate_device(create_admin_user): def test_device_create_form_duplicate_device(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
user = mixer.blend("core.InventoryUser", customer=fixture["customer"]) user = mixer.blend("core.InventoryUser", customer=fixture["customer"])
mixer.blend( mixer.blend("devices.Device", name="pharma-device1", customer=fixture["customer"])
"devices.Device", name="pharma-device1", customer=fixture["customer"]
)
data = {"name": "pharma-device1", "customer": fixture["customer"].id} data = {"name": "pharma-device1", "customer": fixture["customer"].id}
form = forms.DeviceCreateForm(user=user, data=data) form = forms.DeviceCreateForm(user=user, data=data)
assert ( assert (

View File

@ -35,9 +35,7 @@ def test_load_device_update_view(create_admin_user):
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
device = mixer.blend("devices.Device", customer=mixer.SELECT) device = mixer.blend("devices.Device", customer=mixer.SELECT)
response = client.get("/update/device/{}/".format(device.pk)) response = client.get("/update/device/{}/".format(device.pk))
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, device.name)
response, device.name
)
def test_device_update_view(create_admin_user): def test_device_update_view(create_admin_user):
@ -187,9 +185,7 @@ def test_device_in_net_update_view(create_admin_user):
"mac_address": "", "mac_address": "",
"ip_status": "1", "ip_status": "1",
} }
response = client.post( response = client.post("/update/device-in-net/{}/".format(device_in_net.pk), data)
"/update/device-in-net/{}/".format(device_in_net.pk), data
)
assert response.status_code == 302 assert response.status_code == 302
device_in_net.refresh_from_db() device_in_net.refresh_from_db()
assert device_in_net.ip == data["ip"] assert device_in_net.ip == data["ip"]

View File

@ -9,9 +9,7 @@ pytestmark = pytest.mark.django_db
def test_warranty_create_form(create_admin_user): def test_warranty_create_form(create_admin_user):
create_admin_user() create_admin_user()
form = forms.WarrantyCreateForm(data={}) form = forms.WarrantyCreateForm(data={})
assert ( assert form.is_valid() is False, "Should be false because no data was given"
form.is_valid() is False
), "Should be false because no data was given"
device = mixer.blend("devices.Device") device = mixer.blend("devices.Device")
@ -33,8 +31,7 @@ def test_warranty_create_form(create_admin_user):
form.is_valid() is False form.is_valid() is False
), "Should be false because valid from is before valid until" ), "Should be false because valid from is before valid until"
assert ( assert (
"Valid from date must be before valid until date" "Valid from date must be before valid until date" == form.errors["__all__"][0]
== form.errors["__all__"][0]
) )
@ -51,6 +48,5 @@ def test_warranty_update_form(create_admin_user):
form = forms.WarrantyUpdateForm(data=data) form = forms.WarrantyUpdateForm(data=data)
assert form.is_valid() is False assert form.is_valid() is False
assert ( assert (
"Valid from date must be before valid until date" "Valid from date must be before valid until date" == form.errors["__all__"][0]
== form.errors["__all__"][0]
) )

View File

@ -39,9 +39,7 @@ def test_warranties_view_plenty_of_time(create_admin_user):
user.save() user.save()
device = mixer.blend("devices.Device", customer=fixture["customer"]) device = mixer.blend("devices.Device", customer=fixture["customer"])
more_than_one_year = datetime.date(datetime.today() + timedelta(400)) more_than_one_year = datetime.date(datetime.today() + timedelta(400))
mixer.blend( mixer.blend("devices.Warranty", device=device, valid_until=more_than_one_year)
"devices.Warranty", device=device, valid_until=more_than_one_year
)
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/warranties/") response = client.get("/warranties/")
@ -77,9 +75,7 @@ def test_warranties_view_warranty_one_year_till_expiration(create_admin_user):
user.save() user.save()
device = mixer.blend("devices.Device", customer=fixture["customer"]) device = mixer.blend("devices.Device", customer=fixture["customer"])
not_one_year_more = datetime.date(datetime.today() + timedelta(200)) not_one_year_more = datetime.date(datetime.today() + timedelta(200))
mixer.blend( mixer.blend("devices.Warranty", device=device, valid_until=not_one_year_more)
"devices.Warranty", device=device, valid_until=not_one_year_more
)
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/warranties/") response = client.get("/warranties/")

View File

@ -4,9 +4,7 @@ from . import views
urlpatterns = [ urlpatterns = [
path( path("customer/<int:pk>/devices/", views.devices_table_view, name="devices"),
"customer/<int:pk>/devices/", views.devices_table_view, name="devices"
),
path("device/<int:pk>/", views.device_detail_view, name="device"), path("device/<int:pk>/", views.device_detail_view, name="device"),
path( path(
"manufacturer/<int:pk>/", "manufacturer/<int:pk>/",

View File

@ -60,16 +60,12 @@ def device_detail_view(request, pk):
def devices_table_view(request, pk): def devices_table_view(request, pk):
table = DevicesTable(Device.objects.filter(customer=pk)) table = DevicesTable(Device.objects.filter(customer=pk))
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render( return render(request, "devices/device_list.html", {"devices": table, "pk": pk})
request, "devices/device_list.html", {"devices": table, "pk": pk}
)
@login_required @login_required
def warranties_view(request): def warranties_view(request):
table = WarrantiesTable( table = WarrantiesTable(utils.objects_for_allowed_customers(Warranty, request.user))
utils.objects_for_allowed_customers(Warranty, request.user)
)
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render(request, "devices/warranties_list.html", {"devices": table}) return render(request, "devices/warranties_list.html", {"devices": table})
@ -111,9 +107,7 @@ def device_update_view(request, pk):
""" """
template_name = "devices/device_update.html" template_name = "devices/device_update.html"
request.session["device_to_update"] = pk request.session["device_to_update"] = pk
device = utils.get_object_with_view_permission( device = utils.get_object_with_view_permission(Device, user=request.user, pk=pk)
Device, user=request.user, pk=pk
)
if request.method == "POST" and "save_device" in request.POST: if request.method == "POST" and "save_device" in request.POST:
form = DeviceUpdateForm(request, request.POST, instance=device) form = DeviceUpdateForm(request, request.POST, instance=device)
if form.is_valid(): if form.is_valid():

View File

@ -48,9 +48,7 @@ class LicenseWithUser(models.Model):
class Meta: class Meta:
constraints = [ constraints = [
models.UniqueConstraint( models.UniqueConstraint(fields=["user", "license"], name="user per license")
fields=["user", "license"], name="user per license"
)
] ]

View File

@ -61,9 +61,7 @@ def test_customer_license_table_no_license(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/customer/" + str(customer.id) + "/licenses/") response = client.get("/customer/" + str(customer.id) + "/licenses/")
assert response.status_code == 200 and helper.not_in_content( assert response.status_code == 200 and helper.not_in_content(response, customer)
response, customer
)
def test_customer_license_table_no_permission(create_admin_user): def test_customer_license_table_no_permission(create_admin_user):

View File

@ -41,7 +41,7 @@ def licenses_table_view(request, pk):
class LicenseWithComputerCreateView(LoginRequiredMixin, CreateView): class LicenseWithComputerCreateView(LoginRequiredMixin, CreateView):
model = LicenseWithComputer model = LicenseWithComputer
template_name = "licenses/license_with_computer_create.html" template_name = "licenses/license_with_computer_create.html"
fields = "__all__" fields = "__all__" # type: ignore
def get_success_url(self): def get_success_url(self):
return reverse("computer", args=(self.computer.pk,)) return reverse("computer", args=(self.computer.pk,))

View File

@ -3,9 +3,7 @@ import os
import sys import sys
if __name__ == "__main__": if __name__ == "__main__":
os.environ.setdefault( os.environ.setdefault("DJANGO_SETTINGS_MODULE", "network_inventory.settings")
"DJANGO_SETTINGS_MODULE", "network_inventory.settings"
)
try: try:
from django.core.management import execute_from_command_line from django.core.management import execute_from_command_line
except ImportError as exc: except ImportError as exc:

View File

@ -11,8 +11,6 @@ def net_view_permission(old_fuction):
if user.has_perm("customers.view_customer", net.customer): if user.has_perm("customers.view_customer", net.customer):
return old_fuction(request, pk) return old_fuction(request, pk)
else: else:
return HttpResponseForbidden( return HttpResponseForbidden("You're not allowed to access this device.")
"You're not allowed to access this device."
)
return new_function return new_function

View File

@ -15,9 +15,7 @@ def test_net_detail_view_no_permission(create_admin_user):
net = mixer.blend("nets.Net") net = mixer.blend("nets.Net")
customer = mixer.blend("customers.Customer") customer = mixer.blend("customers.Customer")
device = mixer.blend("computers.Computer", customer=customer) device = mixer.blend("computers.Computer", customer=customer)
mixer.blend( mixer.blend("devices.DeviceInNet", device=device, net=net, ip="10.7.89.101")
"devices.DeviceInNet", device=device, net=net, ip="10.7.89.101"
)
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/net/" + str(net.id) + "/") response = client.get("/net/" + str(net.id) + "/")
@ -28,9 +26,7 @@ def test_net_detail_view(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
net = mixer.blend("nets.Net", customer=mixer.SELECT) net = mixer.blend("nets.Net", customer=mixer.SELECT)
device = mixer.blend("computers.Computer", customer=fixture["customer"]) device = mixer.blend("computers.Computer", customer=fixture["customer"])
device_in_net = DeviceInNet.objects.create( device_in_net = DeviceInNet.objects.create(device=device, net=net, ip="10.7.89.101")
device=device, net=net, ip="10.7.89.101"
)
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/net/" + str(net.id) + "/") response = client.get("/net/" + str(net.id) + "/")

View File

@ -29,9 +29,7 @@ def net_detail_view(request, pk):
net = get_object_or_404(Net, pk=pk) net = get_object_or_404(Net, pk=pk)
table = NetDetailTable(DeviceInNet.objects.filter(net=net)) table = NetDetailTable(DeviceInNet.objects.filter(net=net))
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render( return render(request, "nets/net_details.html", {"table": table, "net": net})
request, "nets/net_details.html", {"table": table, "net": net}
)
class NetDeleteView(LoginRequiredMixin, DeleteView): # type: ignore class NetDeleteView(LoginRequiredMixin, DeleteView): # type: ignore

View File

@ -11,8 +11,6 @@ def user_view_permission(old_fuction):
if user.has_perm("customers.view_customer", inventory_user.customer): if user.has_perm("customers.view_customer", inventory_user.customer):
return old_fuction(request, pk) return old_fuction(request, pk)
else: else:
return HttpResponseForbidden( return HttpResponseForbidden("You're not allowed to access this device.")
"You're not allowed to access this device."
)
return new_function return new_function

View File

@ -37,9 +37,7 @@ def test_customer_user_table_no_user(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/customer/" + str(customer.id) + "/users/") response = client.get("/customer/" + str(customer.id) + "/users/")
assert response.status_code == 200 and helper.not_in_content( assert response.status_code == 200 and helper.not_in_content(response, customer)
response, customer
)
def test_customer_user_table_no_permission(create_admin_user): def test_customer_user_table_no_permission(create_admin_user):

View File

@ -61,6 +61,4 @@ def test_group_detail_view_with_child_group(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/group/" + str(group.id) + "/") response = client.get("/group/" + str(group.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, child_group)
response, child_group
)

View File

@ -38,9 +38,7 @@ def test_user_detail_view_group(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/user/" + str(user.id) + "/") response = client.get("/user/" + str(user.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, "Groups")
response, "Groups"
)
def test_user_detail_view_mail_alias(create_admin_user): def test_user_detail_view_mail_alias(create_admin_user):
@ -50,9 +48,7 @@ def test_user_detail_view_mail_alias(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/user/" + str(user.id) + "/") response = client.get("/user/" + str(user.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, "Mail Alias")
response, "Mail Alias"
)
def test_user_detail_view_license(create_admin_user): def test_user_detail_view_license(create_admin_user):
@ -63,9 +59,7 @@ def test_user_detail_view_license(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/user/" + str(user.id) + "/") response = client.get("/user/" + str(user.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, "License")
response, "License"
)
def test_user_detail_view_computer(create_admin_user): def test_user_detail_view_computer(create_admin_user):
@ -75,9 +69,7 @@ def test_user_detail_view_computer(create_admin_user):
client = Client() client = Client()
client.login(username="pharma-admin", password="password") client.login(username="pharma-admin", password="password")
response = client.get("/user/" + str(user.id) + "/") response = client.get("/user/" + str(user.id) + "/")
assert response.status_code == 200 and helper.in_content( assert response.status_code == 200 and helper.in_content(response, computer)
response, computer
)
def test_user_detail_view_no_permission(create_admin_user): def test_user_detail_view_no_permission(create_admin_user):

View File

@ -64,9 +64,7 @@ class UserDeleteView(LoginRequiredMixin, DeleteView): # type: ignore
def groups_table_view(request, pk): def groups_table_view(request, pk):
customer = get_object_or_404(Customer, pk=pk) customer = get_object_or_404(Customer, pk=pk)
groups_table = GroupsTable( groups_table = GroupsTable(
utils.get_objects_for_customer( utils.get_objects_for_customer(Group, user=request.user, customer_pk=pk)
Group, user=request.user, customer_pk=pk
)
) )
RequestConfig(request).configure(groups_table) RequestConfig(request).configure(groups_table)
return TemplateResponse( return TemplateResponse(
@ -81,9 +79,7 @@ def groups_table_view(request, pk):
@login_required @login_required
def group_detail_view(request, pk): def group_detail_view(request, pk):
group = utils.get_object_with_view_permission( group = utils.get_object_with_view_permission(Group, user=request.user, pk=pk)
Group, user=request.user, pk=pk
)
users = group.user_set.all() users = group.user_set.all()
groups = Group.objects.filter(parent_group=group) groups = Group.objects.filter(parent_group=group)
print(groups) print(groups)
@ -96,9 +92,7 @@ def group_detail_view(request, pk):
@login_required @login_required
def delete_group(request, pk): def delete_group(request, pk):
group = utils.get_object_with_view_permission( group = utils.get_object_with_view_permission(Group, user=request.user, pk=pk)
Group, user=request.user, pk=pk
)
if request.method == "POST": if request.method == "POST":
group.delete() group.delete()
return redirect("groups", pk=group.customer.pk) return redirect("groups", pk=group.customer.pk)