chore(settings): Remove no longer used Django UI

ref: #788 #757
This commit is contained in:
2025-06-05 14:11:27 +09:30
parent 764e631be6
commit f8faa7f040
31 changed files with 0 additions and 1979 deletions

View File

@ -1,30 +0,0 @@
from django import forms
from django.db.models import Q
from access.models.tenant import Tenant as Organization
from access.models.team_user import TeamUsers
from core.forms.common import CommonModelForm
from settings.models.app_settings import AppSettings
class AdminGlobalModels:
"""Administratively set Global Models
Use this class on models that can be set within the application settings as a global
application.
"""
def __init__(self, *args, **kwargs):
""" Init Form
As these forms are for administratively set global organization, set the `organization` and `is_global` fields
to be read only.
"""
super().__init__(*args, **kwargs)
self.fields['organization'].widget.attrs['readonly'] = True
self.fields['is_global'].widget.attrs['readonly'] = True

View File

@ -1,18 +0,0 @@
from django import forms
from django.db.models import Q
from access.models.tenant import Tenant as Organization
from access.models.team_user import TeamUsers
from core.forms.common import CommonModelForm
from settings.models.app_settings import AppSettings
class AppSettingsForm(CommonModelForm):
class Meta:
fields = AppSettings.__all__
model = AppSettings

View File

@ -1,84 +0,0 @@
from django import forms
from django.urls import reverse
from access.models.tenant import Tenant as Organization
from access.models.team_user import TeamUsers
from django.conf import settings
from core.forms.common import CommonModelForm
from settings.models.external_link import ExternalLink
class ExternalLinksForm(CommonModelForm):
prefix = 'external_links'
class Meta:
fields = '__all__'
model = ExternalLink
class DetailForm(ExternalLinksForm):
tabs: dict = {
"details": {
"name": "Details",
"slug": "details",
"sections": [
{
"layout": "double",
"left": [
'organization',
'name',
'template',
'colour',
'cluster',
'devices'
'software',
'c_created',
'c_modified',
],
"right": [
'model_notes',
]
}
]
},
"notes": {
"name": "Notes",
"slug": "notes",
"sections": []
},
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['c_created'] = forms.DateTimeField(
label = 'Created',
input_formats=settings.DATETIME_FORMAT,
disabled = True,
initial = self.instance.created,
)
self.fields['c_modified'] = forms.DateTimeField(
label = 'Modified',
input_formats=settings.DATETIME_FORMAT,
disabled = True,
initial = self.instance.modified,
)
self.tabs['details'].update({
"edit_url": reverse('Settings:_external_link_change', args=(self.instance.pk,))
})
self.url_index_view = reverse('Settings:External Links')

View File

@ -1,44 +0,0 @@
from django import forms
from django.db.models import Q
from access.models.tenant import Tenant as Organization
from access.models.team_user import TeamUsers
from core.forms.common import CommonModelForm
from settings.models.user_settings import UserSettings
class UserSettingsForm(CommonModelForm):
prefix = 'user_settings'
class Meta:
fields = [
'default_organization',
'timezone',
'browser_mode',
]
model = UserSettings
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
user_organizations = []
for team_user in TeamUsers.objects.filter(user=kwargs['instance'].user):
if team_user.team.organization.name not in user_organizations:
user_organizations += [ team_user.team.organization.name ]
self.fields['default_organization'].queryset = Organization.objects.filter(
Q(name__in=user_organizations)
|
Q(manager=kwargs['instance'].user)
)

View File

@ -1,18 +0,0 @@
<style>
.inner-text {
background-color: #fff;
border-top-right-radius: 15px;
border-bottom-right-radius: 15px;
border-right: 15px;
margin-right: -5px;
padding: 1px 5px 1px 5px;
}
</style>
<span class="icon-text external-link" style="background-color: {% if external_link.colour %}{{ external_link.colour }}{% else %}#177ee6{% endif %};">
<span class="icon-external-link" style="margin-left: 5px;">
{% include 'icons/link.svg' %}
</span>
<a class="inner-text" href="{{ external_link.link }}" target="_blank"> {{ external_link.name }}</a>
</span>

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z" /></svg>

Before

Width:  |  Height:  |  Size: 795 B

View File

@ -1,45 +0,0 @@
{% extends 'base.html.j2' %}
{% block content_header_icon %}{% endblock %}
{% block content %}
<input type="button" value="<< Back to settings" onclick="window.location='{% url 'Settings:Settings' %}';">
<input type="button" value="New Device Model" onclick="window.location='{% url 'Settings:_device_model_add' %}';">
<table class="data">
<tr>
<th>Name</th>
<th>Manufacturer</th>
<th>Organization</th>
<th>&nbsp;</th>
</tr>
{% for item in list %}
<tr>
<td><a href="{% url 'Settings:_device_model_view' pk=item.id %}">{{ item.name }}</a></td>
<td>{{ item.manufacturer }}</td>
<td>{% if item.is_global %}Global{% else %}{{ item.organization }}{% endif %}</td>
<td>&nbsp;</td>
</tr>
{% endfor %}
</table>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
{% endif %}
</span>
</div>
{% endblock %}

View File

@ -1,43 +0,0 @@
{% extends 'base.html.j2' %}
{% block content_header_icon %}{% endblock %}
{% block content %}
<input type="button" value="<< Back to settings" onclick="window.location='{% url 'Settings:Settings' %}';">
<input type="button" value="New Device Type" onclick="window.location='{% url 'Settings:_device_type_add' %}';">
<table class="data">
<tr>
<th>Name</th>
<th>Organization</th>
<th>&nbsp;</th>
</tr>
{% for item in list %}
<tr>
<td><a href="{% url 'Settings:_device_type_view' pk=item.id %}">{{ item.name }}</a></td>
<td>{% if item.is_global %}Global{% else %}{{ item.organization }}{% endif %}</td>
<td>&nbsp;</td>
</tr>
{% endfor %}
</table>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
{% endif %}
</span>
</div>
{% endblock %}

View File

@ -1,31 +0,0 @@
{% extends 'detail.html.j2' %}
{% load json %}
{% load markdown %}
{% block tabs %}
<div id="details" class="content-tab">
{% include 'content/section.html.j2' with tab=form.tabs.details %}
</div>
<div id="notes" class="content-tab">
{% include 'content/section.html.j2' with tab=form.tabs.notes %}
{{ notes_form }}
<input type="submit" name="{{notes_form.prefix}}" value="Submit" />
<div class="comments">
{% if notes %}
{% for note in notes%}
{% include 'note.html.j2' %}
{% endfor %}
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -1,42 +0,0 @@
{% extends 'base.html.j2' %}
{% block content_header_icon %}{% endblock %}
{% block content %}
<input type="button" value="New External Link" onclick="window.location='{% url 'Settings:_external_link_add' %}';">
<table class="data">
<tr>
<th>Name</th>
<th>Organization</th>
<th>&nbsp;</th>
</tr>
{% for item in list %}
<tr>
<td><a href="{% url 'Settings:_external_link_view' pk=item.id %}">{{ item.name }}</a></td>
<td>{% if item.is_global %}Global{% else %}{{ item.organization }}{% endif %}</td>
<td>&nbsp;</td>
</tr>
{% endfor %}
</table>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
{% endif %}
</span>
</div>
{% endblock %}

View File

@ -1,89 +0,0 @@
{% extends 'base.html.j2' %}
{% block article %}
<style>
div#content {
/*background-color: blue;*/
vertical-align: top;
width: auto;
margin: 10px;
padding: 10px;
text-align: center;
display: flex;
flex-wrap:wrap;
}
div#content article {
/*background-color: brown;*/
width: auto;
min-width: 30%;
max-width: 47%;
display: flexbox;
position: relative;
text-align: left;
align-self: top;
}
div#content article h3 {
text-align: center;
padding: 0px;
margin: 0px;
}
</style>
<div id="content" style="">
<article style="">
<h3>Application</h3>
<ul>
<li><a href="{% url 'Settings:_settings_application' %}">Settings</a></li>
<li><a href="{% url 'Settings:_task_results' %}">Task Logs</a></li>
</ul>
</article>
<article style="">
<h3>Common</h3>
<ul>
<li><a href="{% url 'Settings:_manufacturers' %}">Manufacturers / Publishers</a></li>
</ul>
</article>
<article style="">
<h3>Core</h3>
<ul>
<li><a href="{% url 'Settings:_ticket_categories' %}">Ticket Categories</a></li>
<li><a href="{% url 'Settings:_ticket_comment_categories' %}">Ticket Comment Categories</a></li>
</ul>
</article>
<article style="">
<h3>ITAM</h3>
<ul>
<li><a href="{% url 'Settings:_device_types' %}">Device Types</a></li>
<li><a href="{% url 'Settings:_device_models' %}">Device Models</a></li>
<li><a href="{% url 'Settings:_software_categories' %}">Software Categories</a></li>
</ul>
</article>
<article style="">
<h3>ITIM</h3>
<ul>
<li><a href="{% url 'Settings:_cluster_types' %}">Cluster Types</a></li>
<li><a href="{% url 'Settings:_ports' %}">Service Ports</a></li>
</ul>
</article>
<article style="">
<h3>Project Management</h3>
<ul>
<li><a href="{% url 'Settings:_project_states' %}">Project States</a></li>
<li><a href="{% url 'Settings:_project_types' %}">Project Types</a></li>
</ul>
</article>
</div>
{% endblock %}

View File

@ -1,43 +0,0 @@
{% extends 'base.html.j2' %}
{% block content_header_icon %}{% endblock %}
{% block content %}
<input type="button" value="<< Back to settings" onclick="window.location='{% url 'Settings:Settings' %}';">
<input type="button" value="New Manufacturer" onclick="window.location='{% url 'Settings:_manufacturer_add' %}';">
<table class="data">
<tr>
<th>Name</th>
<th>Organization</th>
<th>&nbsp;</th>
</tr>
{% for item in list %}
<tr>
<td><a href="{% url 'Settings:_manufacturer_view' pk=item.id %}">{{ item.name }}</a></td>
<td>{% if item.is_global %}Global{% else %}{{ item.organization }}{% endif %}</td>
<td>&nbsp;</td>
</tr>
{% endfor %}
</table>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
{% endif %}
</span>
</div>
{% endblock %}

View File

@ -1,44 +0,0 @@
{% extends 'base.html.j2' %}
{% block content_header_icon %}{% endblock %}
{% block content %}
<input type="button" value="<< Back to settings" onclick="window.location='{% url 'Settings:Settings' %}';">
<input type="button" value="New Software Category" onclick="window.location='{% url 'Settings:_software_category_add' %}';">
<table class="data">
<tr>
<th>Name</th>
<th>Organization</th>
<th>&nbsp;</th>
</tr>
{% for item in list %}
<tr>
<td><a href="{% url 'Settings:_software_category_view' pk=item.id %}">{{ item.name }}</a></td>
<td>{% if item.is_global %}Global{% else %}{{ item.organization }}{% endif %}</td>
<td>&nbsp;</td>
</tr>
{% endfor %}
</table>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
{% endif %}
</span>
</div>
{% endblock %}

View File

@ -1,97 +0,0 @@
{% extends 'base.html.j2' %}
{% block content %}
<style>
.detail-view-field {
display: unset;
height: 30px;
line-height: 30px;
padding: 0px 20px 40px 20px;
}
.detail-view-field label {
display: inline-block;
font-weight: bold;
width: 200px;
margin: 10px;
/*padding: 10px;*/
height: 30px;
line-height: 30px;
}
.detail-view-field span {
display: inline-block;
width: 340px;
margin: 10px;
/*padding: 10px;*/
border-bottom: 1px solid #ccc;
height: 30px;
line-height: 30px;
}
</style>
<div>
<div style="align-items:flex-start; align-content: center; display: flexbox; width: 100%">
<div style="display: inline; width: 40%; margin: 30px;">
<div class="detail-view-field">
<label>{{ form.default_organization.label }}</label>
<span>{{ settings.default_organization }}</span>
</div>
<div class="detail-view-field">
<label>{{ form.timezone.label }}</label>
<span>{{ settings.timezone }}</span>
</div>
<div class="detail-view-field">
<label>{{ form.browser_mode.label }}</label>
<span>{{ settings.get_browser_mode_display }}</span>
</div>
</div>
<div>
<input type="button" value="Edit"
onclick="window.location='{% url '_settings_user_change' settings.id %}';">
</div>
</div>
<div>
<h3>API Tokens</h3>
<div style="justify-content: space-between;">
<input type="button" value="Generate Token"
onclick="window.location='{% url '_user_auth_token_add' settings.id %}';">
</div>
<table>
<thead>
<th>Note</th>
<th>Created</th>
<th>Expires</th>
<th>&nbsp;</th>
</thead>
{% if tokens %}
{% for token in tokens %}
<tr>
<td>
{% if token.note %}
{{ token.note }}
{% else %}
-
{% endif %}
</td>
<td>{{ token.created }}</td>
<td>{{ token.expires }}</td>
<td><a href="{% url '_user_auth_token_delete' pk=token.id user_id=settings.id %}">Delete</a></td>
</tr>
{% endfor %}
{% endif %}
</table>
</div>
</div>
{% endblock %}

View File

@ -1,170 +0,0 @@
import django
import pytest
import unittest
import requests
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, Permission
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import reverse
from django.test import TestCase, Client
from access.models.tenant import Tenant as Organization
from access.models.team import Team
from access.models.team_user import TeamUsers
from centurion.tests.abstract.model_permissions import ModelPermissionsView
from settings.models.app_settings import AppSettings
User = django.contrib.auth.get_user_model()
class AppSettingsPermissions(TestCase, ModelPermissionsView):
model = AppSettings
app_namespace = 'Settings'
url_name_view = '_settings_application'
@classmethod
def setUpTestData(self):
"""Setup Test
1. Create an organization for user and item
. create an organization that is different to item
2. Create a manufacturer
3. create teams with each permission: view, add, change, delete
4. create a user per team
"""
organization = Organization.objects.create(name='test_org')
self.organization = organization
different_organization = Organization.objects.create(name='test_different_organization')
self.item = self.model.objects.get(pk=1)
view_permissions = Permission.objects.get(
codename = 'view_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
view_team = Team.objects.create(
team_name = 'view_team',
organization = organization,
)
view_team.permissions.set([view_permissions])
add_permissions = Permission.objects.get(
codename = 'add_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
add_team = Team.objects.create(
team_name = 'add_team',
organization = organization,
)
add_team.permissions.set([add_permissions])
change_permissions = Permission.objects.get(
codename = 'change_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
change_team = Team.objects.create(
team_name = 'change_team',
organization = organization,
)
change_team.permissions.set([change_permissions])
delete_permissions = Permission.objects.get(
codename = 'delete_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
delete_team = Team.objects.create(
team_name = 'delete_team',
organization = organization,
)
delete_team.permissions.set([delete_permissions])
self.no_permissions_user = User.objects.create_user(username="test_no_permissions", password="password")
self.view_user = User.objects.create_user(username="test_user_view", password="password", is_superuser=True)
teamuser = TeamUsers.objects.create(
team = view_team,
user = self.view_user
)
self.add_user = User.objects.create_user(username="test_user_add", password="password")
teamuser = TeamUsers.objects.create(
team = add_team,
user = self.add_user
)
self.change_user = User.objects.create_user(username="test_user_change", password="password")
teamuser = TeamUsers.objects.create(
team = change_team,
user = self.change_user
)
self.delete_user = User.objects.create_user(username="test_user_delete", password="password")
teamuser = TeamUsers.objects.create(
team = delete_team,
user = self.delete_user
)
self.different_organization_user = User.objects.create_user(username="test_different_organization_user", password="password")
different_organization_team = Team.objects.create(
team_name = 'different_organization_team',
organization = different_organization,
)
different_organization_team.permissions.set([
view_permissions,
add_permissions,
change_permissions,
delete_permissions,
])
TeamUsers.objects.create(
team = different_organization_team,
user = self.different_organization_user
)
@pytest.mark.skip(reason="ToDO: figure out why fails as statuscode=403 not 302")
def test_model_view_user_anon_denied(self):
pass

View File

@ -1,30 +0,0 @@
import pytest
import unittest
import requests
from django.test import TestCase
from centurion.tests.abstract.models import ModelChange, ModelDisplay
class AppSettingsViews(
TestCase,
ModelChange,
ModelDisplay
):
# add_module = 'itam.views.software'
# add_view = 'Add'
change_module = 'settings.views.app_settings'
change_view = 'View'
# delete_module = add_module
# delete_view = 'Delete'
display_module = change_module
display_view = change_view
# index_module = 'settings.views.software_categories'
# index_view = 'Index'

View File

@ -1,193 +0,0 @@
import django
import pytest
import unittest
import requests
from django.contrib.auth.models import AnonymousUser, Permission
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import reverse
from django.test import TestCase
from access.models.tenant import Tenant as Organization
from access.models.team import Team
from access.models.team_user import TeamUsers
from centurion.tests.abstract.model_permissions import ModelPermissions
from settings.models.external_link import ExternalLink
User = django.contrib.auth.get_user_model()
class ExternalLinkPermissions(TestCase, ModelPermissions):
model = ExternalLink
app_label = 'settings'
app_namespace = 'Settings'
url_name_view = '_external_link_view'
url_name_add = '_external_link_add'
url_name_change = '_external_link_change'
url_name_delete = '_external_link_delete'
url_delete_response = reverse('Settings:External Links')
@classmethod
def setUpTestData(self):
"""Setup Test
1. Create an organization for user and item
. create an organization that is different to item
2. Create a device
3. create teams with each permission: view, add, change, delete
4. create a user per team
"""
organization = Organization.objects.create(name='test_org')
self.organization = organization
different_organization = Organization.objects.create(name='test_different_organization')
self.item = self.model.objects.create(
organization=organization,
name = 'deviceone'
)
self.url_view_kwargs = {'pk': self.item.id}
self.add_data = {'device': 'device', 'organization': self.organization.id}
self.url_change_kwargs = {'pk': self.item.id}
self.change_data = {'device': 'device'}
self.url_delete_kwargs = {'pk': self.item.id}
self.delete_data = {'device': 'device'}
view_permissions = Permission.objects.get(
codename = 'view_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
view_team = Team.objects.create(
team_name = 'view_team',
organization = organization,
)
view_team.permissions.set([view_permissions])
add_permissions = Permission.objects.get(
codename = 'add_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
add_team = Team.objects.create(
team_name = 'add_team',
organization = organization,
)
add_team.permissions.set([add_permissions])
change_permissions = Permission.objects.get(
codename = 'change_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
change_team = Team.objects.create(
team_name = 'change_team',
organization = organization,
)
change_team.permissions.set([change_permissions])
delete_permissions = Permission.objects.get(
codename = 'delete_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
delete_team = Team.objects.create(
team_name = 'delete_team',
organization = organization,
)
delete_team.permissions.set([delete_permissions])
self.no_permissions_user = User.objects.create_user(username="test_no_permissions", password="password")
self.view_user = User.objects.create_user(username="test_user_view", password="password")
teamuser = TeamUsers.objects.create(
team = view_team,
user = self.view_user
)
self.add_user = User.objects.create_user(username="test_user_add", password="password")
teamuser = TeamUsers.objects.create(
team = add_team,
user = self.add_user
)
self.change_user = User.objects.create_user(username="test_user_change", password="password")
teamuser = TeamUsers.objects.create(
team = change_team,
user = self.change_user
)
self.delete_user = User.objects.create_user(username="test_user_delete", password="password")
teamuser = TeamUsers.objects.create(
team = delete_team,
user = self.delete_user
)
self.different_organization_user = User.objects.create_user(username="test_different_organization_user", password="password")
different_organization_team = Team.objects.create(
team_name = 'different_organization_team',
organization = different_organization,
)
different_organization_team.permissions.set([
view_permissions,
add_permissions,
change_permissions,
delete_permissions,
])
TeamUsers.objects.create(
team = different_organization_team,
user = self.different_organization_user
)

View File

@ -1,29 +0,0 @@
import pytest
import unittest
import requests
from django.test import TestCase
from centurion.tests.abstract.models import PrimaryModel
class ExternalLinkViews(
TestCase,
PrimaryModel
):
add_module = 'settings.views.external_link'
add_view = 'Add'
change_module = add_module
change_view = 'Change'
delete_module = add_module
delete_view = 'Delete'
display_module = add_module
display_view = 'View'
index_module = add_module
index_view = 'Index'
6

View File

@ -1,107 +0,0 @@
import django
import pytest
import unittest
import requests
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, Permission
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import reverse
from django.test import TestCase, Client
from access.models.tenant import Tenant as Organization
from access.models.team import Team
from access.models.team_user import TeamUsers
from centurion.tests.abstract.model_permissions import ModelPermissionsView
from settings.models.user_settings import UserSettings
User = django.contrib.auth.get_user_model()
class UserSettingsPermissions(TestCase, ModelPermissionsView):
model = UserSettings
# app_namespace = ''
url_name_view = '_settings_user'
@classmethod
def setUpTestData(self):
"""Setup Test
1. Create an organization for user and item
. create an organization that is different to item
2. Create a device
3. create teams with each permission: view, add, change, delete
4. create a user per team
"""
organization = Organization.objects.create(name='test_org')
self.organization = organization
different_organization = Organization.objects.create(name='test_different_organization')
view_permissions = Permission.objects.get(
codename = 'view_' + self.model._meta.model_name,
content_type = ContentType.objects.get(
app_label = self.model._meta.app_label,
model = self.model._meta.model_name,
)
)
view_team = Team.objects.create(
team_name = 'view_team',
organization = organization,
)
view_team.permissions.set([view_permissions])
self.no_permissions_user = User.objects.create_user(username="test_no_permissions", password="password")
self.view_user = User.objects.create_user(username="test_user_view", password="password")
teamuser = TeamUsers.objects.create(
team = view_team,
user = self.view_user
)
self.different_organization_user = User.objects.create_user(username="test_different_organization_user", password="password")
different_organization_team = Team.objects.create(
team_name = 'different_organization_team',
organization = different_organization,
)
different_organization_team.permissions.set([
view_permissions,
])
TeamUsers.objects.create(
team = different_organization_team,
user = self.different_organization_user
)
self.item = self.model.objects.get(
user=self.view_user,
)
self.url_view_kwargs = {'pk': self.view_user.id}
@pytest.mark.skip(reason="ToDO: figure out why fails. returns status 403 instead of 302")
def test_model_view_user_anon_denied(self):
pass

View File

@ -1,44 +0,0 @@
import pytest
import unittest
import requests
from django.test import TestCase
from centurion.tests.abstract.models import ModelChange, ModelDisplay
class AppSettingsViews(
TestCase,
ModelChange,
ModelDisplay
):
# add_module = 'itam.views.software'
# add_view = 'Add'
change_module = 'settings.views.user_settings'
change_view = 'Change'
# delete_module = add_module
# delete_view = 'Delete'
display_module = change_module
display_view = 'View'
# index_module = 'settings.views.software_categories'
# index_view = 'Index'
@pytest.mark.skip(reason = "write test to check perms")
def test_view_change_attribute_exists_permission_required(self):
""" Test not required as permission check is different """
pass
@pytest.mark.skip(reason = "write test to check perms")
def test_view_change_attribute_type_permission_required(self):
""" Test not required as permission check is different """
pass

View File

@ -1,97 +0,0 @@
from django.urls import path
from assistance.views import knowledge_base_category
from core.views import celery_log, ticket_categories, ticket_comment_category
from settings.views import app_settings, home, device_models, device_types, external_link, manufacturer, software_categories
from itam.views import device_type, device_model, software_category
from itim.views import cluster_types, ports
from project_management.views import project_states, project_types
app_name = "Settings"
urlpatterns = [
path("", home.View.as_view(), name="Settings"),
path('application', app_settings.View.as_view(), name="_settings_application"),
path("cluster_types", cluster_types.Index.as_view(), name="_cluster_types"),
path("cluster_types/add", cluster_types.Add.as_view(), name="_cluster_type_add"),
path("cluster_types/<int:pk>/edit", cluster_types.Change.as_view(), name="_cluster_type_change"),
path("cluster_types/<int:pk>/delete", cluster_types.Delete.as_view(), name="_cluster_type_delete"),
path("cluster_types/<int:pk>", cluster_types.View.as_view(), name="_cluster_type_view"),
path("device_models", device_models.Index.as_view(), name="_device_models"),
path("device_model/<int:pk>", device_model.View.as_view(), name="_device_model_view"),
path("device_model/<int:pk>/edit", device_model.Change.as_view(), name="_device_model_change"),
path("device_model/add/", device_model.Add.as_view(), name="_device_model_add"),
path("device_model/<int:pk>/delete", device_model.Delete.as_view(), name="_device_model_delete"),
path("device_type/", device_types.Index.as_view(), name="_device_types"),
path("device_type/<int:pk>", device_type.View.as_view(), name="_device_type_view"),
path("device_type/add/", device_type.Add.as_view(), name="_device_type_add"),
path("device_type/<int:pk>/delete", device_type.Delete.as_view(), name="_device_type_delete"),
path("device_type/<int:pk>/edit", device_type.Change.as_view(), name="_device_type_change"),
path("external_links", external_link.Index.as_view(), name="External Links"),
path("external_links/add", external_link.Add.as_view(), name="_external_link_add"),
path("external_links/<int:pk>", external_link.View.as_view(), name="_external_link_view"),
path("external_links/<int:pk>/edit", external_link.Change.as_view(), name="_external_link_change"),
path("external_links/<int:pk>/delete", external_link.Delete.as_view(), name="_external_link_delete"),
path("kb/category", knowledge_base_category.Index.as_view(), name="KB Categories"),
path("kb/category/add", knowledge_base_category.Add.as_view(), name="_knowledge_base_category_add"),
path("kb/category/<int:pk>/edit", knowledge_base_category.Change.as_view(), name="_knowledge_base_category_change"),
path("kb/category/<int:pk>/delete", knowledge_base_category.Delete.as_view(), name="_knowledge_base_category_delete"),
path("kb/category/<int:pk>", knowledge_base_category.View.as_view(), name="_knowledge_base_category_view"),
path("manufacturers", manufacturer.Index.as_view(), name="_manufacturers"),
path("manufacturer/<int:pk>", manufacturer.View.as_view(), name="_manufacturer_view"),
path("manufacturer/add/", manufacturer.Add.as_view(), name="_manufacturer_add"),
path("manufacturer/<int:pk>/edit", manufacturer.Change.as_view(), name="_manufacturer_change"),
path("manufacturer/<int:pk>/delete", manufacturer.Delete.as_view(), name="_manufacturer_delete"),
path("ports", ports.Index.as_view(), name="_ports"),
path("port/add", ports.Add.as_view(), name="_port_add"),
path("port/<int:pk>/edit", ports.Change.as_view(), name="_port_change"),
path("port/<int:pk>/delete", ports.Delete.as_view(), name="_port_delete"),
path("port/<int:pk>", ports.View.as_view(), name="_port_view"),
path("project_states", project_states.Index.as_view(), name="_project_states"),
path("project_state/<int:pk>", project_states.View.as_view(), name="_project_state_view"),
path("project_state/add", project_states.Add.as_view(), name="_project_state_add"),
path("project_state/<int:pk>/edit", project_states.Change.as_view(), name="_project_state_change"),
path("project_state/<int:pk>/delete", project_states.Delete.as_view(), name="_project_state_delete"),
path("project_types", project_types.Index.as_view(), name="_project_types"),
path("project_type/<int:pk>", project_types.View.as_view(), name="_project_type_view"),
path("project_type/add", project_types.Add.as_view(), name="_project_type_add"),
path("project_type/<int:pk>/edit", project_types.Change.as_view(), name="_project_type_change"),
path("project_type/<int:pk>/delete", project_types.Delete.as_view(), name="_project_type_delete"),
path("software_category", software_categories.Index.as_view(), name="_software_categories"),
path("software_category/<int:pk>", software_category.View.as_view(), name="_software_category_view"),
path("software_category/add/", software_category.Add.as_view(), name="_software_category_add"),
path("software_category/<int:pk>/edit", software_category.Change.as_view(), name="_software_category_change"),
path("software_category/<int:pk>/delete", software_category.Delete.as_view(), name="_software_category_delete"),
path("ticket_categories", ticket_categories.Index.as_view(), name="_ticket_categories"),
path("ticket_categories/<int:pk>", ticket_categories.View.as_view(), name="_ticket_category_view"),
path("ticket_categories/add", ticket_categories.Add.as_view(), name="_ticket_category_add"),
path("ticket_categories/<int:pk>/edit", ticket_categories.Change.as_view(), name="_ticket_category_change"),
path("ticket_categories/<int:pk>/delete", ticket_categories.Delete.as_view(), name="_ticket_category_delete"),
path("ticket_comment_categories", ticket_comment_category.Index.as_view(), name="_ticket_comment_categories"),
path("ticket_comment_categories/<int:pk>", ticket_comment_category.View.as_view(), name="_ticket_comment_category_view"),
path("ticket_comment_categories/add", ticket_comment_category.Add.as_view(), name="_ticket_comment_category_add"),
path("ticket_comment_categories/<int:pk>/edit", ticket_comment_category.Change.as_view(), name="_ticket_comment_category_change"),
path("ticket_comment_categories/<int:pk>/delete", ticket_comment_category.Delete.as_view(), name="_ticket_comment_category_delete"),
path("task_results", celery_log.Index.as_view(), name="_task_results"),
path("task_result/<int:pk>", celery_log.View.as_view(), name="_task_result_view"),
]

View File

@ -1,71 +0,0 @@
from django.core.exceptions import EmptyResultSet, PermissionDenied, ValidationError
from django.urls import reverse
from django.views import generic
from access.mixin import OrganizationPermission
from core.views.common import ChangeView
from settings.forms.app_settings import AppSettingsForm
from settings.models.app_settings import AppSettings
class View(generic.UpdateView):
context_object_name = "settings"
form_class = AppSettingsForm
model = AppSettings
permission_required = [
'settings.change_appsettings'
]
template_name = 'form.html.j2'
def get_object(self, queryset=None):
obj = self.model.objects.get(owner_organization=None)
if obj:
return obj
raise EmptyResultSet('No Application Settings found')
def form_valid(self, form):
form.instance.id = self.object.pk
if self.request.user.is_superuser:
return super().form_valid(form)
raise PermissionDenied()
def get_success_url(self, **kwargs):
return reverse('Settings:_settings_application')
def get_context_data(self, **kwargs):
if self.request.user.is_superuser:
context = super().get_context_data(**kwargs)
context['model_docs_path'] = self.model._meta.app_label + '/'
context['model_pk'] = self.object.pk
context['model_name'] = self.model._meta.verbose_name.replace(' ', '')
context['content_title'] = 'Application Settings'
return context
raise PermissionDenied()

View File

@ -1,33 +0,0 @@
from core.views.common import IndexView
from itam.models.device_models import DeviceModel
class Index(IndexView):
model = DeviceModel
permission_required = [
'itam.view_devicetype'
]
template_name = 'settings/device_models.html.j2'
context_object_name = "list"
paginate_by = 10
def get_queryset(self):
return self.model.objects.filter().order_by('name')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Device Models'
return context

View File

@ -1,32 +0,0 @@
from core.views.common import IndexView
from itam.models.device import DeviceType
class Index(IndexView):
model = DeviceType
permission_required = [
'itam.view_devicetype'
]
template_name = 'settings/device_types.html.j2'
context_object_name = "list"
paginate_by = 10
def get_queryset(self):
return self.model.objects.filter().order_by('name')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Device Types'
return context

View File

@ -1,164 +0,0 @@
from django.contrib.auth import decorators as auth_decorator
from django.db.models import Q
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views import generic
from access.mixin import OrganizationPermission
from core.views.common import AddView, ChangeView, DeleteView, DisplayView, IndexView
from settings.forms.external_links import DetailForm, ExternalLinksForm
from settings.models.external_link import ExternalLink
class Index(IndexView):
context_object_name = "list"
model = ExternalLink
paginate_by = 10
permission_required = [
'settings.view_externallink'
]
template_name = 'settings/external_links.html.j2'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['model_docs_path'] = self.model._meta.app_label + '/external_links/'
context['content_title'] = 'External Links'
return context
class View(ChangeView):
context_object_name = "externallink"
form_class = DetailForm
model = ExternalLink
permission_required = [
'settings.view_externallink',
]
template_name = 'settings/external_link.html.j2'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['model_pk'] = self.kwargs['pk']
context['model_name'] = self.model._meta.verbose_name.replace(' ', '')
context['model_delete_url'] = reverse('Settings:_external_link_delete', args=(self.kwargs['pk'],))
context['content_title'] = self.object.name
return context
def get_success_url(self, **kwargs):
return reverse('Settings:_external_link_view', args={self.kwargs['pk']})
@method_decorator(auth_decorator.permission_required("settings.change_externallink", raise_exception=True))
def post(self, request, *args, **kwargs):
return super().post(request, *args, **kwargs)
class Change(ChangeView):
context_object_name = "externallink"
form_class = ExternalLinksForm
model = ExternalLink
permission_required = [
'settings.change_externallink',
]
template_name = 'form.html.j2'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = self.object.name
return context
def get_success_url(self, **kwargs):
return reverse('Settings:_external_link_view', args={self.kwargs['pk']})
@method_decorator(auth_decorator.permission_required("settings.change_externallink", raise_exception=True))
def post(self, request, *args, **kwargs):
return super().post(request, *args, **kwargs)
class Add(AddView):
form_class = ExternalLinksForm
model = ExternalLink
permission_required = [
'settings.add_externallink',
]
template_name = 'form.html.j2'
def get_success_url(self, **kwargs):
return reverse(viewname = 'Settings:External Links')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Add External Link'
return context
class Delete(DeleteView):
model = ExternalLink
permission_required = [
'settings.delete_externallink',
]
template_name = 'form.html.j2'
def get_success_url(self, **kwargs):
return reverse('Settings:External Links')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Delete ' + self.object.name
return context

View File

@ -1,23 +0,0 @@
import requests
from django.conf import settings
from django.shortcuts import redirect, render
from django.views.generic import View
class View(View):
permission_required = [
'itam.view_settings'
]
template_name = 'settings/home.html.j2'
def get(self, request):
context = {}
context['content_title'] = 'Settings'
return render(request, self.template_name, context)

View File

@ -1,155 +0,0 @@
from django.contrib.auth import decorators as auth_decorator
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views import generic
from access.mixin import OrganizationPermission
from core.forms.manufacturer import DetailForm, ManufacturerForm
from core.models.manufacturer import Manufacturer
from core.views.common import AddView, ChangeView, DeleteView, IndexView
class Index(IndexView):
context_object_name = "list"
model = Manufacturer
paginate_by = 10
permission_required = [
'core.view_manufacturer'
]
template_name = 'settings/manufacturers.html.j2'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Manufacturers'
return context
class Change(ChangeView):
context_object_name = "manufacturer"
form_class = ManufacturerForm
model = Manufacturer
permission_required = [
'core.change_manufacturer',
]
template_name = 'form.html.j2'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = self.object.name
return context
def get_success_url(self, **kwargs):
return f"/settings/manufacturer/{self.kwargs['pk']}"
@method_decorator(auth_decorator.permission_required("core.change_manufacturer", raise_exception=True))
def post(self, request, *args, **kwargs):
return super().post(request, *args, **kwargs)
class View(ChangeView):
context_object_name = "manufacturer"
form_class = DetailForm
model = Manufacturer
permission_required = [
'core.view_manufacturer',
]
template_name = 'core/manufacturer.html.j2'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['model_pk'] = self.kwargs['pk']
context['model_name'] = self.model._meta.verbose_name.replace(' ', '')
context['model_delete_url'] = reverse('Settings:_manufacturer_delete', args=(self.kwargs['pk'],))
context['content_title'] = self.object.name
return context
def get_success_url(self, **kwargs):
return f"/settings/manufacturer/{self.kwargs['pk']}"
class Add(AddView):
form_class = ManufacturerForm
model = Manufacturer
permission_required = [
'core.add_manufacturer',
]
template_name = 'form.html.j2'
def get_success_url(self, **kwargs):
return f"/settings/manufacturers"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Add Manufacturer'
return context
class Delete(DeleteView):
model = Manufacturer
permission_required = [
'core.delete_manufacturer',
]
template_name = 'form.html.j2'
def get_success_url(self, **kwargs):
return f"/settings/manufacturers"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Delete ' + self.object.name
return context

View File

@ -1,33 +0,0 @@
from access.mixin import OrganizationPermission
from core.views.common import IndexView
from itam.models.software import SoftwareCategory
class Index(IndexView):
model = SoftwareCategory
permission_required = [
'itam.view_software'
]
template_name = 'settings/software_categories.html.j2'
context_object_name = "list"
paginate_by = 10
def get_queryset(self):
return self.model.objects.filter().order_by('name')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['content_title'] = 'Software Categories'
return context

View File

@ -1,169 +0,0 @@
from django.core.exceptions import PermissionDenied
from django.urls import reverse
from django.views import generic
from access.mixin import OrganizationPermission
from api.forms.user_token import AuthTokenForm, AuthToken
from core.views.common import AddView, ChangeView, DeleteView
from settings.forms.user_settings import UserSettingsForm
from settings.models.user_settings import UserSettings
class View(ChangeView):
context_object_name = "settings"
form_class = UserSettingsForm
model = UserSettings
template_name = 'settings/user_settings.html.j2'
def get_context_data(self, **kwargs):
if self.object.is_owner(self.request.user):
context = super().get_context_data(**kwargs)
context['tokens'] = AuthToken.objects.filter(user=self.kwargs['pk'])
context['model_docs_path'] = 'user_settings/'
context['content_title'] = 'User Settings'
return context
raise PermissionDenied()
def get_success_url(self, **kwargs):
return reverse('_settings_user', args=(self.kwargs['pk'],))
class Change(ChangeView):
context_object_name = "settings"
form_class = UserSettingsForm
model = UserSettings
template_name = 'form.html.j2'
def form_valid(self, form):
if self.object.is_owner(self.request.user):
return super().form_valid(form)
raise PermissionDenied()
def get_success_url(self, **kwargs):
return reverse('_settings_user', args=(self.kwargs['pk'],))
def get_context_data(self, **kwargs):
if self.object.is_owner(self.request.user):
context = super().get_context_data(**kwargs)
context['content_title'] = 'User Settings'
return context
raise PermissionDenied()
class TokenAdd(AddView):
context_object_name = "settings"
form_class = AuthTokenForm
model = AuthToken
template_name = 'form.html.j2'
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.token = form.instance.token_hash(form.fields['gen_token'].initial)
self.model.validate_note_no_token(self, note=form.instance.note, token=form.fields['gen_token'].initial)
return super().form_valid(form)
def get_context_data(self, **kwargs):
if self.request.user.id != self.kwargs['user_id']:
raise PermissionDenied()
context = super().get_context_data(**kwargs)
context['content_title'] = 'Generate Authentication Token'
return context
def get_success_url(self, **kwargs):
return reverse('_settings_user', args=(self.kwargs['user_id'],))
class TokenDelete(DeleteView):
model = AuthToken
template_name = 'form.html.j2'
def delete(self, request, *args, **kwargs):
if self.request.user.id != self.kwargs['user_id']:
raise PermissionDenied()
return None
return super().delete(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
if self.request.user.id != self.kwargs['user_id']:
raise PermissionDenied()
return None
return super().post(request, *args, **kwargs)
def get_success_url(self, **kwargs):
return reverse('_settings_user', args=(self.kwargs['user_id'],))
def get_context_data(self, **kwargs):
if self.request.user.id != self.kwargs['user_id']:
raise PermissionDenied()
context = super().get_context_data(**kwargs)
context['content_title'] = 'Delete Token'
return context