@ -1,141 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
from access.models.tenant import Tenant as Organization
|
||||
from access.models.team import Team
|
||||
|
||||
from django.contrib.auth.models import Permission
|
||||
|
||||
|
||||
|
||||
class TeamSerializerBase(serializers.ModelSerializer):
|
||||
|
||||
url = serializers.SerializerMethodField('get_url')
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Team
|
||||
fields = (
|
||||
'team_name',
|
||||
'model_notes',
|
||||
'permissions',
|
||||
'url',
|
||||
)
|
||||
|
||||
|
||||
def get_url(self, obj):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(reverse("v1:_api_team", args=[obj.organization.id,obj.pk]))
|
||||
|
||||
|
||||
|
||||
class TeamPermissionSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Permission
|
||||
depth = 1
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class TeamSerializer(TeamSerializerBase):
|
||||
|
||||
permissions_url = serializers.SerializerMethodField('get_url')
|
||||
|
||||
def get_url(self, obj):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
team = Team.objects.get(pk=obj.id)
|
||||
|
||||
return request.build_absolute_uri(reverse('v1:_api_team_permission', args=[team.organization_id,team.id]))
|
||||
|
||||
|
||||
def validate(self, data):
|
||||
"""
|
||||
Check that start is before finish.
|
||||
"""
|
||||
|
||||
data['organization_id'] = self._context['view'].kwargs['organization_id']
|
||||
|
||||
return data
|
||||
|
||||
|
||||
url = serializers.SerializerMethodField('team_url')
|
||||
|
||||
def team_url(self, obj):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(reverse('v1:_api_team', args=[obj.organization_id,obj.id]))
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Team
|
||||
depth = 2
|
||||
fields = (
|
||||
"id",
|
||||
"team_name",
|
||||
'model_notes',
|
||||
'permissions',
|
||||
'permissions_url',
|
||||
'url',
|
||||
)
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'organization',
|
||||
'permissions_url',
|
||||
'url'
|
||||
]
|
||||
|
||||
|
||||
|
||||
class OrganizationListSerializer(serializers.ModelSerializer):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:_api_organization", format="html"
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Organization
|
||||
fields = (
|
||||
"id",
|
||||
"name",
|
||||
'url',
|
||||
)
|
||||
|
||||
|
||||
|
||||
class OrganizationSerializer(serializers.ModelSerializer):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:_api_organization", format="html"
|
||||
)
|
||||
|
||||
team_url = serializers.SerializerMethodField('get_url')
|
||||
|
||||
def get_url(self, obj):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
team = Team.objects.filter(pk=obj.id)
|
||||
|
||||
return request.build_absolute_uri(reverse('v1:_api_organization_teams', args=[obj.id]))
|
||||
|
||||
teams = TeamSerializer(source='team_set', many=True, read_only=False)
|
||||
|
||||
view_name="v1:_api_organization"
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Organization
|
||||
fields = (
|
||||
"id",
|
||||
"name",
|
||||
'teams',
|
||||
'url',
|
||||
'team_url',
|
||||
)
|
@ -1,63 +0,0 @@
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from api.serializers.core.ticket import TicketSerializer
|
||||
|
||||
from core.models.ticket.ticket import Ticket
|
||||
|
||||
|
||||
|
||||
class RequestTicketSerializer(
|
||||
TicketSerializer,
|
||||
):
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Ticket
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'assigned_teams',
|
||||
'assigned_users',
|
||||
'category',
|
||||
'created',
|
||||
'modified',
|
||||
'status',
|
||||
'title',
|
||||
'description',
|
||||
'estimate',
|
||||
'urgency',
|
||||
'impact',
|
||||
'priority',
|
||||
'external_ref',
|
||||
'external_system',
|
||||
'ticket_type',
|
||||
'is_deleted',
|
||||
'date_closed',
|
||||
# 'planned_start_date',
|
||||
# 'planned_finish_date',
|
||||
# 'real_start_date',
|
||||
# 'real_finish_date',
|
||||
'opened_by',
|
||||
'organization',
|
||||
'project',
|
||||
'milestone',
|
||||
'subscribed_teams',
|
||||
'subscribed_users',
|
||||
'ticket_comments',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'ticket_type',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
||||
|
||||
self.fields.fields['category'].queryset = self.fields.fields['category'].queryset.filter(
|
||||
request = True
|
||||
)
|
@ -1,87 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
from config_management.models.groups import ConfigGroups
|
||||
|
||||
|
||||
|
||||
class ParentGroupSerializer(serializers.ModelSerializer):
|
||||
|
||||
url = serializers.SerializerMethodField('get_url')
|
||||
|
||||
|
||||
class Meta:
|
||||
model = ConfigGroups
|
||||
fields = [
|
||||
'id',
|
||||
'name',
|
||||
'url',
|
||||
]
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'name',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def get_url(self, obj):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(reverse("v1:_api_config_group", args=[obj.pk]))
|
||||
|
||||
|
||||
|
||||
class ConfigGroupsSerializerBase(serializers.ModelSerializer):
|
||||
|
||||
parent = ParentGroupSerializer(read_only=True)
|
||||
url = serializers.SerializerMethodField('get_url')
|
||||
|
||||
|
||||
class Meta:
|
||||
model = ConfigGroups
|
||||
fields = [
|
||||
'id',
|
||||
'parent',
|
||||
'name',
|
||||
'config',
|
||||
'url',
|
||||
]
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'name',
|
||||
'config',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def get_url(self, obj):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(reverse("v1:_api_config_group", args=[obj.pk]))
|
||||
|
||||
|
||||
|
||||
class ConfigGroupsSerializer(ConfigGroupsSerializerBase):
|
||||
|
||||
|
||||
class Meta:
|
||||
model = ConfigGroups
|
||||
depth = 1
|
||||
fields = [
|
||||
'id',
|
||||
'parent',
|
||||
'name',
|
||||
'config',
|
||||
'hosts',
|
||||
'url',
|
||||
]
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'parent',
|
||||
'name',
|
||||
'config',
|
||||
'url',
|
||||
]
|
||||
|
@ -1,192 +0,0 @@
|
||||
from django.urls import reverse
|
||||
|
||||
from rest_framework import serializers
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from core import exceptions as centurion_exception
|
||||
from core.models.ticket.ticket import Ticket
|
||||
|
||||
|
||||
|
||||
class TicketSerializer(
|
||||
serializers.ModelSerializer,
|
||||
):
|
||||
|
||||
url = serializers.SerializerMethodField('get_url_ticket')
|
||||
|
||||
|
||||
def get_url_ticket(self, item):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
kwargs: dict = {
|
||||
'pk': item.id
|
||||
}
|
||||
|
||||
if item.ticket_type == self.Meta.model.TicketType.CHANGE.value:
|
||||
|
||||
view_name = '_api_itim_change'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.INCIDENT.value:
|
||||
|
||||
view_name = '_api_itim_incident'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.PROBLEM.value:
|
||||
|
||||
view_name = '_api_itim_problem'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.REQUEST.value:
|
||||
|
||||
view_name = '_api_assistance_request'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.PROJECT_TASK.value:
|
||||
|
||||
view_name = '_api_project_tasks'
|
||||
|
||||
kwargs.update({'project_id': item.project.id})
|
||||
else:
|
||||
|
||||
raise ValueError('Serializer unable to obtain ticket type')
|
||||
|
||||
|
||||
return request.build_absolute_uri(
|
||||
reverse(
|
||||
'v1:' + view_name + '-detail',
|
||||
kwargs = kwargs
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
ticket_comments = serializers.SerializerMethodField('get_url_ticket_comments')
|
||||
|
||||
|
||||
def get_url_ticket_comments(self, item):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
kwargs: dict = {
|
||||
'ticket_id': item.id
|
||||
}
|
||||
|
||||
if item.ticket_type == self.Meta.model.TicketType.CHANGE.value:
|
||||
|
||||
view_name = '_api_itim_change_ticket_comments'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.INCIDENT.value:
|
||||
|
||||
view_name = '_api_itim_incident_ticket_comments'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.PROBLEM.value:
|
||||
|
||||
view_name = '_api_itim_problem_ticket_comments'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.REQUEST.value:
|
||||
|
||||
view_name = '_api_assistance_request_ticket_comments'
|
||||
|
||||
elif item.ticket_type == self.Meta.model.TicketType.PROJECT_TASK.value:
|
||||
|
||||
view_name = '_api_project_tasks_comments'
|
||||
|
||||
kwargs.update({'project_id': item.project.id})
|
||||
|
||||
else:
|
||||
|
||||
raise ValueError('Serializer unable to obtain ticket type')
|
||||
|
||||
|
||||
return request.build_absolute_uri(
|
||||
reverse(
|
||||
'v1:' + view_name + '-list',
|
||||
kwargs = kwargs
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Ticket
|
||||
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'assigned_teams',
|
||||
'assigned_users',
|
||||
'category',
|
||||
'created',
|
||||
'modified',
|
||||
'status',
|
||||
'title',
|
||||
'description',
|
||||
'urgency',
|
||||
'impact',
|
||||
'priority',
|
||||
'external_ref',
|
||||
'external_system',
|
||||
'ticket_type',
|
||||
'is_deleted',
|
||||
'date_closed',
|
||||
'planned_start_date',
|
||||
'planned_finish_date',
|
||||
'real_start_date',
|
||||
'real_finish_date',
|
||||
'opened_by',
|
||||
'organization',
|
||||
'project',
|
||||
'subscribed_teams',
|
||||
'subscribed_users',
|
||||
'ticket_comments',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
self.fields.fields['status'].initial = Ticket.TicketStatus.All.NEW
|
||||
self.fields.fields['status'].default = Ticket.TicketStatus.All.NEW
|
||||
|
||||
self.ticket_type_fields = self.Meta.fields
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
||||
|
||||
self.fields['organization'].required = True
|
||||
|
||||
|
||||
def is_valid(self, *, raise_exception=True) -> bool:
|
||||
|
||||
is_valid = False
|
||||
|
||||
try:
|
||||
|
||||
self.request = self._context['request']
|
||||
|
||||
is_valid = super().is_valid(raise_exception=raise_exception)
|
||||
|
||||
self._ticket_type = str(self.fields['ticket_type'].choices[self._context['view']._ticket_type_value]).lower().replace(' ', '_')
|
||||
|
||||
self.validated_data['ticket_type'] = int(self._context['view']._ticket_type_value)
|
||||
|
||||
is_valid = self.validate_ticket()
|
||||
|
||||
if self.instance is None:
|
||||
|
||||
subscribed_users: list = []
|
||||
|
||||
if 'subscribed_users' in self.validated_data:
|
||||
|
||||
subscribed_users = self.validated_data['subscribed_users']
|
||||
|
||||
self.validated_data['subscribed_users'] = subscribed_users + [ self.validated_data['opened_by'] ]
|
||||
|
||||
except Exception as unhandled_exception:
|
||||
|
||||
centurion_exception.ParseError(
|
||||
detail=f"Server encountered an error during validation, Traceback: {unhandled_exception.with_traceback}"
|
||||
)
|
||||
|
||||
return is_valid
|
@ -1,39 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from core.models.ticket.ticket_category import TicketCategory
|
||||
|
||||
|
||||
|
||||
class TicketCategorySerializer(
|
||||
serializers.ModelSerializer,
|
||||
):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:_api_ticket_category-detail", format="html"
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
|
||||
model = TicketCategory
|
||||
|
||||
fields = '__all__'
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
if instance is not None:
|
||||
|
||||
if hasattr(instance, 'id'):
|
||||
|
||||
self.fields.fields['parent'].queryset = self.fields.fields['parent'].queryset.exclude(
|
||||
id=instance.id
|
||||
)
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
@ -1,74 +0,0 @@
|
||||
from django.urls import reverse
|
||||
|
||||
from rest_framework import serializers
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from core.models.ticket.ticket_comment import Ticket, TicketComment
|
||||
|
||||
|
||||
|
||||
class TicketCommentSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
url = serializers.SerializerMethodField('get_url_ticket_comment')
|
||||
|
||||
def get_url_ticket_comment(self, item):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
if item.ticket.ticket_type == item.ticket.__class__.TicketType.CHANGE:
|
||||
|
||||
view_name = '_api_itim_change_ticket_comments'
|
||||
|
||||
elif item.ticket.ticket_type == item.ticket.__class__.TicketType.INCIDENT:
|
||||
|
||||
view_name = '_api_itim_incident_ticket_comments'
|
||||
|
||||
elif item.ticket.ticket_type == item.ticket.__class__.TicketType.PROBLEM:
|
||||
|
||||
view_name = '_api_itim_problem_ticket_comments'
|
||||
|
||||
elif item.ticket.ticket_type == item.ticket.__class__.TicketType.REQUEST:
|
||||
|
||||
view_name = '_api_assistance_request_ticket_comments'
|
||||
|
||||
else:
|
||||
|
||||
raise ValueError('Serializer unable to obtain ticket type')
|
||||
|
||||
|
||||
return request.build_absolute_uri(
|
||||
reverse('v1:' + view_name + '-detail',
|
||||
kwargs={
|
||||
'ticket_id': item.ticket.id,
|
||||
'pk': item.id
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
|
||||
class Meta:
|
||||
model = TicketComment
|
||||
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
if 'context' in self._kwargs:
|
||||
|
||||
if 'view' in self._kwargs['context']:
|
||||
|
||||
if 'ticket_id' in self._kwargs['context']['view'].kwargs:
|
||||
|
||||
ticket = Ticket.objects.get(pk=int(self._kwargs['context']['view'].kwargs['ticket_id']))
|
||||
self.fields.fields['organization'].initial = ticket.organization.id
|
||||
|
||||
self.fields.fields['ticket'].initial = int(self._kwargs['context']['view'].kwargs['ticket_id'])
|
||||
|
||||
self.fields.fields['comment_type'].initial = TicketComment.CommentType.COMMENT
|
||||
|
||||
self.fields.fields['user'].initial = kwargs['context']['request']._user.id
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
@ -1,40 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
from rest_framework.fields import empty
|
||||
|
||||
|
||||
from core.models.ticket.ticket_comment_category import TicketCommentCategory
|
||||
|
||||
|
||||
|
||||
class TicketCommentCategorySerializer(
|
||||
serializers.ModelSerializer,
|
||||
):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:_api_ticket_comment_category-detail", format="html"
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
|
||||
model = TicketCommentCategory
|
||||
|
||||
fields = '__all__'
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
if instance is not None:
|
||||
|
||||
if hasattr(instance, 'id'):
|
||||
|
||||
self.fields.fields['parent'].queryset = self.fields.fields['parent'].queryset.exclude(
|
||||
id=instance.id
|
||||
)
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
@ -1,76 +0,0 @@
|
||||
from django.urls import reverse
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
from config_management.models.groups import ConfigGroups
|
||||
|
||||
from itam.models.device import Device
|
||||
|
||||
|
||||
|
||||
class DeviceConfigGroupsSerializer(serializers.ModelSerializer):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:_api_config_group", format="html"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
|
||||
model = ConfigGroups
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'name',
|
||||
'url',
|
||||
|
||||
]
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'name',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
class DeviceSerializer(serializers.ModelSerializer):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:device-detail", format="html"
|
||||
)
|
||||
|
||||
config = serializers.SerializerMethodField('get_device_config')
|
||||
|
||||
groups = DeviceConfigGroupsSerializer(source='configgroups_set', many=True, read_only=True)
|
||||
|
||||
def get_device_config(self, device):
|
||||
|
||||
request = self.context.get('request')
|
||||
return request.build_absolute_uri(reverse('v1:_api_device_config', args=[device.slug]))
|
||||
|
||||
|
||||
class Meta:
|
||||
model = Device
|
||||
fields = [
|
||||
'id',
|
||||
'is_global',
|
||||
'name',
|
||||
'config',
|
||||
'serial_number',
|
||||
'uuid',
|
||||
'inventorydate',
|
||||
'created',
|
||||
'modified',
|
||||
'groups',
|
||||
'organization',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'config',
|
||||
'inventorydate',
|
||||
'created',
|
||||
'modified',
|
||||
'groups',
|
||||
'url',
|
||||
]
|
||||
|
@ -1,70 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
|
||||
|
||||
|
||||
class InventorySerializer(serializers.Serializer):
|
||||
""" Serializer for Inventory Upload """
|
||||
|
||||
|
||||
class DetailsSerializer(serializers.Serializer):
|
||||
|
||||
name = serializers.CharField(
|
||||
help_text = 'Host name',
|
||||
required = True
|
||||
)
|
||||
|
||||
serial_number = serializers.CharField(
|
||||
help_text = 'Devices serial number',
|
||||
required = True
|
||||
)
|
||||
|
||||
uuid = serializers.CharField(
|
||||
help_text = 'Device system UUID',
|
||||
required = True
|
||||
)
|
||||
|
||||
|
||||
class OperatingSystemSerializer(serializers.Serializer):
|
||||
|
||||
name = serializers.CharField(
|
||||
help_text='Name of the operating system installed on the device',
|
||||
required = True,
|
||||
)
|
||||
|
||||
version_major = serializers.IntegerField(
|
||||
help_text='Major semver version number of the OS version',
|
||||
required = True,
|
||||
)
|
||||
|
||||
version = serializers.CharField(
|
||||
help_text='semver version number of the OS',
|
||||
required = True
|
||||
)
|
||||
|
||||
|
||||
class SoftwareSerializer(serializers.Serializer):
|
||||
|
||||
name = serializers.CharField(
|
||||
help_text='Name of the software',
|
||||
required = True
|
||||
)
|
||||
|
||||
category = serializers.CharField(
|
||||
help_text='Category of the software',
|
||||
default = None,
|
||||
required = False
|
||||
)
|
||||
|
||||
version = serializers.CharField(
|
||||
default = None,
|
||||
help_text='semver version number of the software',
|
||||
required = False
|
||||
)
|
||||
|
||||
|
||||
details = DetailsSerializer()
|
||||
|
||||
os = OperatingSystemSerializer()
|
||||
|
||||
software = SoftwareSerializer(many = True)
|
@ -1,19 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
from itam.models.device import Software
|
||||
|
||||
|
||||
|
||||
|
||||
class SoftwareSerializer(serializers.ModelSerializer):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:software-detail", format="html"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Software
|
||||
fields = '__all__'
|
||||
|
||||
read_only_fields = [
|
||||
'slug',
|
||||
]
|
@ -1,63 +0,0 @@
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from api.serializers.core.ticket import TicketSerializer
|
||||
|
||||
from core.models.ticket.ticket import Ticket
|
||||
|
||||
|
||||
|
||||
class ChangeTicketSerializer(
|
||||
TicketSerializer,
|
||||
):
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Ticket
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'assigned_teams',
|
||||
'assigned_users',
|
||||
'category',
|
||||
'created',
|
||||
'modified',
|
||||
'status',
|
||||
'title',
|
||||
'description',
|
||||
'estimate',
|
||||
'urgency',
|
||||
'impact',
|
||||
'priority',
|
||||
'external_ref',
|
||||
'external_system',
|
||||
'ticket_type',
|
||||
'is_deleted',
|
||||
'date_closed',
|
||||
# 'planned_start_date',
|
||||
# 'planned_finish_date',
|
||||
# 'real_start_date',
|
||||
# 'real_finish_date',
|
||||
'opened_by',
|
||||
'organization',
|
||||
'project',
|
||||
'milestone',
|
||||
'subscribed_teams',
|
||||
'subscribed_users',
|
||||
'ticket_comments',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'ticket_type',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
||||
|
||||
self.fields.fields['category'].queryset = self.fields.fields['category'].queryset.filter(
|
||||
project_task = True
|
||||
)
|
@ -1,63 +0,0 @@
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from api.serializers.core.ticket import TicketSerializer
|
||||
|
||||
from core.models.ticket.ticket import Ticket
|
||||
|
||||
|
||||
|
||||
class IncidentTicketSerializer(
|
||||
TicketSerializer,
|
||||
):
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Ticket
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'assigned_teams',
|
||||
'assigned_users',
|
||||
'category',
|
||||
'created',
|
||||
'modified',
|
||||
'status',
|
||||
'title',
|
||||
'description',
|
||||
'estimate',
|
||||
'urgency',
|
||||
'impact',
|
||||
'priority',
|
||||
'external_ref',
|
||||
'external_system',
|
||||
'ticket_type',
|
||||
'is_deleted',
|
||||
'date_closed',
|
||||
# 'planned_start_date',
|
||||
# 'planned_finish_date',
|
||||
# 'real_start_date',
|
||||
# 'real_finish_date',
|
||||
'opened_by',
|
||||
'organization',
|
||||
'project',
|
||||
'milestone',
|
||||
'subscribed_teams',
|
||||
'subscribed_users',
|
||||
'ticket_comments',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'ticket_type',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
||||
|
||||
self.fields.fields['category'].queryset = self.fields.fields['category'].queryset.filter(
|
||||
incident = True
|
||||
)
|
@ -1,63 +0,0 @@
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from api.serializers.core.ticket import TicketSerializer
|
||||
|
||||
from core.models.ticket.ticket import Ticket
|
||||
|
||||
|
||||
|
||||
class ProblemTicketSerializer(
|
||||
TicketSerializer,
|
||||
):
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Ticket
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'assigned_teams',
|
||||
'assigned_users',
|
||||
'category',
|
||||
'created',
|
||||
'modified',
|
||||
'status',
|
||||
'title',
|
||||
'description',
|
||||
'estimate',
|
||||
'urgency',
|
||||
'impact',
|
||||
'priority',
|
||||
'external_ref',
|
||||
'external_system',
|
||||
'ticket_type',
|
||||
'is_deleted',
|
||||
'date_closed',
|
||||
# 'planned_start_date',
|
||||
# 'planned_finish_date',
|
||||
# 'real_start_date',
|
||||
# 'real_finish_date',
|
||||
'opened_by',
|
||||
'organization',
|
||||
'project',
|
||||
'milestone',
|
||||
'subscribed_teams',
|
||||
'subscribed_users',
|
||||
'ticket_comments',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'ticket_type',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
||||
|
||||
self.fields.fields['category'].queryset = self.fields.fields['category'].queryset.filter(
|
||||
problem = True
|
||||
)
|
@ -1,74 +0,0 @@
|
||||
from django.urls import reverse
|
||||
|
||||
from rest_framework import serializers
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from project_management.models.projects import Project
|
||||
from project_management.models.project_milestone import ProjectMilestone
|
||||
|
||||
|
||||
|
||||
class ProjectMilestoneSerializer(
|
||||
serializers.ModelSerializer,
|
||||
):
|
||||
|
||||
url = serializers.SerializerMethodField('get_url_project_milestone')
|
||||
|
||||
def get_url_project_milestone(self, item):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(
|
||||
reverse('v1:_api_project_milestone-detail',
|
||||
kwargs={
|
||||
'project_id': item.project.id,
|
||||
'pk': item.id
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
|
||||
model = ProjectMilestone
|
||||
|
||||
fields = [
|
||||
'name',
|
||||
'description',
|
||||
'organization',
|
||||
'project',
|
||||
'start_date',
|
||||
'finish_date',
|
||||
'created',
|
||||
'modified',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
self.fields.fields['organization'].read_only = True
|
||||
self.fields.fields['project'].read_only = True
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
||||
|
||||
|
||||
def is_valid(self, *, raise_exception=False):
|
||||
|
||||
is_valid = super().is_valid(raise_exception=raise_exception)
|
||||
|
||||
project = Project.objects.get(
|
||||
pk = int(self._kwargs['context']['view'].kwargs['project_id'])
|
||||
)
|
||||
|
||||
self._validated_data.update({
|
||||
'organization': project.organization,
|
||||
'project': project
|
||||
})
|
||||
|
||||
return is_valid
|
@ -1,31 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from project_management.models.project_states import ProjectState
|
||||
|
||||
|
||||
|
||||
class ProjectStateSerializer(
|
||||
serializers.ModelSerializer,
|
||||
):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:_api_project_state-detail", format="html"
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
|
||||
model = ProjectState
|
||||
|
||||
fields = '__all__'
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
@ -1,63 +0,0 @@
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from api.serializers.core.ticket import TicketSerializer
|
||||
|
||||
from core.models.ticket.ticket import Ticket
|
||||
|
||||
|
||||
|
||||
class ProjectTaskSerializer(
|
||||
TicketSerializer,
|
||||
):
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Ticket
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'assigned_teams',
|
||||
'assigned_users',
|
||||
'category',
|
||||
'created',
|
||||
'modified',
|
||||
'status',
|
||||
'title',
|
||||
'description',
|
||||
'estimate',
|
||||
'urgency',
|
||||
'impact',
|
||||
'priority',
|
||||
'external_ref',
|
||||
'external_system',
|
||||
'ticket_type',
|
||||
'is_deleted',
|
||||
'date_closed',
|
||||
'planned_start_date',
|
||||
'planned_finish_date',
|
||||
'real_start_date',
|
||||
'real_finish_date',
|
||||
'opened_by',
|
||||
'organization',
|
||||
'project',
|
||||
'milestone',
|
||||
'subscribed_teams',
|
||||
'subscribed_users',
|
||||
'ticket_comments',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'ticket_type',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
||||
|
||||
self.fields.fields['category'].queryset = self.fields.fields['category'].queryset.filter(
|
||||
project_task = True
|
||||
)
|
@ -1,31 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
from rest_framework.fields import empty
|
||||
|
||||
from project_management.models.project_types import ProjectType
|
||||
|
||||
|
||||
|
||||
class ProjectTypeSerializer(
|
||||
serializers.ModelSerializer,
|
||||
):
|
||||
|
||||
url = serializers.HyperlinkedIdentityField(
|
||||
view_name="v1:_api_project_state-detail", format="html"
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
|
||||
model = ProjectType
|
||||
|
||||
fields = '__all__'
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
]
|
||||
|
||||
|
||||
def __init__(self, instance=None, data=empty, **kwargs):
|
||||
|
||||
super().__init__(instance=instance, data=data, **kwargs)
|
@ -1,133 +0,0 @@
|
||||
from django.urls import reverse
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
from project_management.models.projects import Project
|
||||
|
||||
|
||||
|
||||
class ProjectSerializer(
|
||||
serializers.ModelSerializer,
|
||||
):
|
||||
|
||||
percent_completed = serializers.CharField(
|
||||
read_only = True,
|
||||
)
|
||||
|
||||
url = serializers.SerializerMethodField('get_url')
|
||||
|
||||
|
||||
def get_url(self, item):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(reverse("v1:_api_projects-detail", args=[item.pk]))
|
||||
|
||||
|
||||
project_tasks_url = serializers.SerializerMethodField('get_url_project_tasks')
|
||||
|
||||
|
||||
def get_url_project_tasks(self, item):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(
|
||||
reverse(
|
||||
'v1:_api_project_tasks-list',
|
||||
kwargs={
|
||||
'project_id': item.id
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
project_milestone_url = serializers.SerializerMethodField('get_url_project_milestone')
|
||||
|
||||
def get_url_project_milestone(self, item):
|
||||
|
||||
request = self.context.get('request')
|
||||
|
||||
return request.build_absolute_uri(
|
||||
reverse(
|
||||
'v1:_api_project_milestone-list',
|
||||
kwargs={
|
||||
'project_id': item.id
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Project
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'organization',
|
||||
'state',
|
||||
'project_type',
|
||||
'priority',
|
||||
'name',
|
||||
'description',
|
||||
'code',
|
||||
'planned_start_date',
|
||||
'planned_finish_date',
|
||||
'real_start_date',
|
||||
'real_finish_date',
|
||||
'manager_user',
|
||||
'manager_team',
|
||||
'team_members',
|
||||
'project_tasks_url',
|
||||
'project_milestone_url',
|
||||
'percent_completed',
|
||||
'created',
|
||||
'modified',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
'created',
|
||||
'modified',
|
||||
]
|
||||
|
||||
|
||||
|
||||
class ProjectImportSerializer(ProjectSerializer):
|
||||
|
||||
class Meta:
|
||||
|
||||
model = Project
|
||||
|
||||
fields = [
|
||||
'id',
|
||||
'organization',
|
||||
'state',
|
||||
'project_type',
|
||||
'priority',
|
||||
'name',
|
||||
'description',
|
||||
'code',
|
||||
'planned_start_date',
|
||||
'planned_finish_date',
|
||||
'real_start_date',
|
||||
'real_finish_date',
|
||||
'manager_user',
|
||||
'manager_team',
|
||||
'team_members',
|
||||
'project_tasks_url',
|
||||
'project_milestone_url',
|
||||
'percent_completed',
|
||||
'created',
|
||||
'modified',
|
||||
'external_ref',
|
||||
'external_system',
|
||||
'is_deleted',
|
||||
'url',
|
||||
]
|
||||
|
||||
read_only_fields = [
|
||||
'id',
|
||||
'url',
|
||||
]
|
@ -1,35 +0,0 @@
|
||||
from django.shortcuts import reverse
|
||||
from django.test import TestCase, Client
|
||||
|
||||
import pytest
|
||||
import unittest
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="to be written")
|
||||
def test_api_access_auth_required(user):
|
||||
"""Ensure that no api access has been granted
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="to be written")
|
||||
def test_api_access_home(user):
|
||||
"""Ensure api home view visible once logged in
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,32 +1,8 @@
|
||||
from django.urls import path
|
||||
|
||||
from rest_framework.routers import DefaultRouter
|
||||
from rest_framework.urlpatterns import format_suffix_patterns
|
||||
|
||||
from .views import access, config, index
|
||||
from .views import index
|
||||
|
||||
from api.views.settings import permissions
|
||||
from api.views.settings import index as settings
|
||||
|
||||
from api.views import assistance, itim, project_management
|
||||
from api.views.assistance import request_ticket
|
||||
from api.views.core import (
|
||||
ticket_categories,
|
||||
ticket_comment_categories,
|
||||
ticket_comments as core_ticket_comments
|
||||
)
|
||||
from api.views.itim import change_ticket, incident_ticket, problem_ticket
|
||||
from api.views.project_management import (
|
||||
projects,
|
||||
project_milestone,
|
||||
project_state,
|
||||
project_type,
|
||||
project_task
|
||||
)
|
||||
|
||||
from .views.itam import software, config as itam_config
|
||||
from .views.itam.device import DeviceViewSet
|
||||
from .views.itam import inventory
|
||||
|
||||
|
||||
app_name = "API"
|
||||
@ -36,59 +12,9 @@ router = DefaultRouter(trailing_slash=False)
|
||||
|
||||
router.register('', index.Index, basename='_api_home')
|
||||
|
||||
router.register('assistance/request', request_ticket.View, basename='_api_assistance_request')
|
||||
router.register('assistance/request/(?P<ticket_id>[0-9]+)/comments', core_ticket_comments.View, basename='_api_assistance_request_ticket_comments')
|
||||
|
||||
router.register('device', DeviceViewSet, basename='device')
|
||||
|
||||
router.register('itim/change', change_ticket.View, basename='_api_itim_change')
|
||||
router.register('itim/change/(?P<ticket_id>[0-9]+)/comments', core_ticket_comments.View, basename='_api_itim_change_ticket_comments')
|
||||
|
||||
router.register('itim/incident', incident_ticket.View, basename='_api_itim_incident')
|
||||
router.register('itim/incident/(?P<ticket_id>[0-9]+)/comments', core_ticket_comments.View, basename='_api_itim_incident_ticket_comments')
|
||||
|
||||
router.register('itim/problem', problem_ticket.View, basename='_api_itim_problem')
|
||||
router.register('itim/problem/(?P<ticket_id>[0-9]+)/comments', core_ticket_comments.View, basename='_api_itim_problem_ticket_comments')
|
||||
|
||||
router.register('project_management/projects', projects.View, basename='_api_projects')
|
||||
router.register('project_management/projects/(?P<project_id>[0-9]+)/milestones', project_milestone.View, basename='_api_project_milestone')
|
||||
router.register('project_management/projects/(?P<project_id>[0-9]+)/tasks', project_task.View, basename='_api_project_tasks')
|
||||
router.register('project_management/projects/(?P<project_id>[0-9]+)/tasks/(?P<ticket_id>[0-9]+)/comments', core_ticket_comments.View, basename='_api_project_tasks_comments')
|
||||
|
||||
router.register('settings/ticket_categories', ticket_categories.View, basename='_api_ticket_category')
|
||||
|
||||
router.register('settings/project_state', project_state.View, basename='_api_project_state')
|
||||
router.register('settings/project_type', project_type.View, basename='_api_project_type')
|
||||
router.register('settings/ticket_comment_categories', ticket_comment_categories.View, basename='_api_ticket_comment_category')
|
||||
|
||||
router.register('software', software.SoftwareViewSet, basename='software')
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
path("assistance", assistance.index.Index.as_view(), name="_api_assistance"),
|
||||
|
||||
path("config/<slug:slug>/", itam_config.View.as_view(), name="_api_device_config"),
|
||||
|
||||
path("configuration/", config.ConfigGroupsList.as_view(), name='_api_config_groups'),
|
||||
path("configuration/<int:pk>", config.ConfigGroupsDetail.as_view(), name='_api_config_group'),
|
||||
|
||||
path("device/inventory", inventory.Collect.as_view(), name="_api_device_inventory"),
|
||||
|
||||
path("itim", itim.index.Index.as_view(), name="_api_itim"),
|
||||
|
||||
path("organization/", access.OrganizationList.as_view(), name='_api_orgs'),
|
||||
path("organization/<int:pk>/", access.OrganizationDetail.as_view(), name='_api_organization'),
|
||||
path("organization/<int:organization_id>/team", access.TeamList.as_view(), name='_api_organization_teams'),
|
||||
path("organization/<int:organization_id>/team/<int:group_ptr_id>/", access.TeamDetail.as_view(), name='_api_team'),
|
||||
path("organization/<int:organization_id>/team/<int:group_ptr_id>/permissions", access.TeamPermissionDetail.as_view(), name='_api_team_permission'),
|
||||
path("organization/team/", access.TeamList.as_view(), name='_api_teams'),
|
||||
|
||||
path("project_management", project_management.index.Index.as_view(), name="_api_project_management"),
|
||||
|
||||
path("settings", settings.View.as_view(), name='_settings'),
|
||||
path("settings/permissions", permissions.View.as_view(), name='_settings_permissions'),
|
||||
|
||||
]
|
||||
|
||||
urlpatterns = format_suffix_patterns(urlpatterns)
|
||||
|
@ -1,318 +0,0 @@
|
||||
from django.contrib.auth.models import Permission
|
||||
|
||||
from drf_spectacular.utils import extend_schema, extend_schema_view, OpenApiResponse
|
||||
|
||||
from rest_framework import generics, routers, serializers, views
|
||||
from rest_framework.permissions import DjangoObjectPermissions
|
||||
from rest_framework.response import Response
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
from access.models.tenant import Tenant as Organization
|
||||
from access.models.team import Team
|
||||
|
||||
from api.serializers.access import OrganizationSerializer, OrganizationListSerializer, TeamSerializer, TeamPermissionSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
@extend_schema_view(
|
||||
get=extend_schema(
|
||||
summary = "Fetch Organizations",
|
||||
description="Returns a list of organizations."
|
||||
),
|
||||
)
|
||||
class OrganizationList(generics.ListAPIView):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Organization.objects.all()
|
||||
lookup_field = 'pk'
|
||||
serializer_class = OrganizationListSerializer
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Organizations"
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
@extend_schema_view(
|
||||
get=extend_schema(
|
||||
summary = "Get An Organization",
|
||||
),
|
||||
patch=extend_schema(
|
||||
summary = "Update an organization",
|
||||
),
|
||||
put=extend_schema(
|
||||
summary = "Update an organization",
|
||||
),
|
||||
)
|
||||
class OrganizationDetail(generics.RetrieveUpdateAPIView):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Organization.objects.all()
|
||||
lookup_field = 'pk'
|
||||
serializer_class = OrganizationSerializer
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Organization"
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
@extend_schema_view(
|
||||
post=extend_schema(
|
||||
summary = "Create a Team",
|
||||
description = """Create a team within the defined organization.""",
|
||||
tags = ['team',],
|
||||
request = TeamSerializer,
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Team has been updated with the supplied permissions'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
403: OpenApiResponse(description='User is missing permission or in different organization'),
|
||||
}
|
||||
),
|
||||
create=extend_schema(exclude=True),
|
||||
)
|
||||
class TeamList(generics.ListCreateAPIView):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Team.objects.all()
|
||||
serializer_class = TeamSerializer
|
||||
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
self.queryset = Team.objects.filter(organization=self.kwargs['organization_id'])
|
||||
|
||||
return self.queryset
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Organization Teams"
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
@extend_schema_view(
|
||||
get=extend_schema(
|
||||
summary = "Fetch a Team",
|
||||
description = """Fetch a team within the defined organization.
|
||||
""",
|
||||
methods=["GET"],
|
||||
tags = ['team',],
|
||||
request = TeamSerializer,
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Team has been updated with the supplied permissions'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
403: OpenApiResponse(description='User is missing permission or in different organization'),
|
||||
}
|
||||
),
|
||||
patch=extend_schema(
|
||||
summary = "Update a Team",
|
||||
description = """Update a team within the defined organization.
|
||||
""",
|
||||
methods=["Patch"],
|
||||
tags = ['team',],
|
||||
request = TeamSerializer,
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Team has been updated with the supplied permissions'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
403: OpenApiResponse(description='User is missing permission or in different organization'),
|
||||
}
|
||||
),
|
||||
put = extend_schema(
|
||||
summary = "Amend a team",
|
||||
tags = ['team',],
|
||||
),
|
||||
delete=extend_schema(
|
||||
summary = "Delete a Team",
|
||||
tags = ['team',],
|
||||
),
|
||||
post = extend_schema(
|
||||
exclude = True,
|
||||
)
|
||||
)
|
||||
class TeamDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Team.objects.all()
|
||||
serializer_class = TeamSerializer
|
||||
|
||||
lookup_field = 'group_ptr_id'
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
@extend_schema_view(
|
||||
get=extend_schema(
|
||||
summary = "Fetch a teams permissions",
|
||||
tags = ['team',],
|
||||
),
|
||||
post=extend_schema(
|
||||
summary = "Replace team Permissions",
|
||||
description = """Replace the teams permissions with the permissions supplied.
|
||||
|
||||
Teams Permissions will be replaced with the permissions supplied. **ALL** existing permissions will be
|
||||
removed.
|
||||
|
||||
permissions are required to be in format `<module name>_<permission>_<table name>`
|
||||
""",
|
||||
|
||||
methods=["POST"],
|
||||
tags = ['team',],
|
||||
request = TeamPermissionSerializer,
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Team has been updated with the supplied permissions'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
403: OpenApiResponse(description='User is missing permission or in different organization'),
|
||||
}
|
||||
),
|
||||
delete=extend_schema(
|
||||
summary = "Delete permissions",
|
||||
tags = ['team',],
|
||||
),
|
||||
patch = extend_schema(
|
||||
summary = "Amend team Permissions",
|
||||
description = """Amend the teams permissions with the permissions supplied.
|
||||
|
||||
Teams permissions will include the existing permissions along with the ones supplied.
|
||||
permissions are required to be in format `<module name>_<permission>_<table name>`
|
||||
""",
|
||||
|
||||
methods=["PATCH"],
|
||||
parameters = None,
|
||||
tags = ['team',],
|
||||
request = TeamPermissionSerializer,
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Team has been updated with the supplied permissions'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
403: OpenApiResponse(description='User is missing permission or in different organization'),
|
||||
}
|
||||
),
|
||||
put = extend_schema(
|
||||
summary = "Amend team Permissions",
|
||||
tags = ['team',],
|
||||
)
|
||||
)
|
||||
class TeamPermissionDetail(views.APIView):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Team.objects.all()
|
||||
|
||||
serializer_class = TeamPermissionSerializer
|
||||
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
||||
return Response(data=Team.objects.get(pk=self.kwargs['group_ptr_id']).permission_list()[0])
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Team Permissions"
|
||||
|
||||
|
||||
def delete(self, request, *args, **kwargs):
|
||||
|
||||
vals = self.process_request()
|
||||
|
||||
remove = vals['remove']
|
||||
|
||||
new_permission = Team.objects.get(pk=self.kwargs['group_ptr_id'])
|
||||
|
||||
|
||||
for remove_permission in remove:
|
||||
new_permission.permissions.remove(remove_permission)
|
||||
new_permission.save()
|
||||
|
||||
return Response(data=Team.objects.get(pk=self.kwargs['group_ptr_id']).permission_list()[0])
|
||||
|
||||
|
||||
def patch(self, request, *args, **kwargs):
|
||||
|
||||
vals = self.process_request()
|
||||
|
||||
add = vals['add']
|
||||
|
||||
new_permission = Team.objects.get(pk=self.kwargs['group_ptr_id'])
|
||||
|
||||
for add_permission in add:
|
||||
new_permission.permissions.add(add_permission)
|
||||
new_permission.save()
|
||||
|
||||
|
||||
return Response(data=Team.objects.get(pk=self.kwargs['group_ptr_id']).permission_list()[0])
|
||||
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
|
||||
vals = self.process_request()
|
||||
|
||||
add = vals['add']
|
||||
remove = vals['remove']
|
||||
exists = vals['exists']
|
||||
|
||||
new_permission = Team.objects.get(pk=self.kwargs['group_ptr_id'])
|
||||
|
||||
for add_permission in add:
|
||||
new_permission.permissions.add(add_permission)
|
||||
new_permission.save()
|
||||
|
||||
for remove_permission in remove:
|
||||
new_permission.permissions.remove(remove_permission)
|
||||
new_permission.save()
|
||||
|
||||
|
||||
return Response(data=Team.objects.get(pk=self.kwargs['group_ptr_id']).permission_list()[0])
|
||||
|
||||
|
||||
def process_request(self) -> dict({
|
||||
"add": list,
|
||||
"remove": list,
|
||||
"exists": list
|
||||
}):
|
||||
|
||||
initial_values = Team.objects.get(pk=self.kwargs['group_ptr_id']).permission_list()
|
||||
|
||||
add = []
|
||||
remove = []
|
||||
exists = []
|
||||
|
||||
|
||||
for request_permission in self.request.data:
|
||||
|
||||
fields = request_permission.split('.')
|
||||
|
||||
try:
|
||||
|
||||
permission = Permission.objects.get(codename=str(fields[1]), content_type__app_label=str(fields[0]))
|
||||
|
||||
exists += [ permission.id ]
|
||||
|
||||
if permission and request_permission not in initial_values[0]:
|
||||
add += [ permission.id ]
|
||||
|
||||
except:
|
||||
|
||||
raise serializers.ValidationError(f'Value was invalid: {request_permission}')
|
||||
|
||||
for existing_permission in initial_values[1].all():
|
||||
|
||||
if existing_permission.id not in add and existing_permission.id not in exists:
|
||||
remove += [ existing_permission.id ]
|
||||
|
||||
return {
|
||||
"add": add,
|
||||
"remove": remove,
|
||||
"exists": exists
|
||||
}
|
@ -1 +0,0 @@
|
||||
from .index import *
|
@ -1,37 +0,0 @@
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from drf_spectacular.utils import extend_schema
|
||||
|
||||
from rest_framework import generics, permissions, routers, views
|
||||
# from rest_framework.decorators import api_view
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class Index(views.APIView):
|
||||
|
||||
permission_classes = [
|
||||
IsAuthenticated,
|
||||
]
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Assistance"
|
||||
|
||||
def get_view_description(self, html=False) -> str:
|
||||
text = "Assistance Module"
|
||||
if html:
|
||||
return mark_safe(f"<p>{text}</p>")
|
||||
else:
|
||||
return text
|
||||
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
||||
body: dict = {
|
||||
'requests': reverse('v1:_api_assistance_request-list', request=request)
|
||||
}
|
||||
|
||||
return Response(body)
|
@ -1,78 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from api.serializers.assistance.request import RequestTicketSerializer
|
||||
from api.views.core.tickets import View
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(View):
|
||||
|
||||
_ticket_type:str = 'request'
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a ticket',
|
||||
description = """This model includes all of the ticket types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
request = RequestTicketSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = RequestTicketSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all tickets',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = RequestTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected ticket',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = RequestTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return "Request Ticket"
|
||||
|
||||
return 'Request Tickets'
|
@ -1,55 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, extend_schema_view
|
||||
|
||||
from rest_framework import generics
|
||||
|
||||
from api.serializers.config import ConfigGroupsSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
from config_management.models.groups import ConfigGroups
|
||||
|
||||
|
||||
@extend_schema( deprecated = True )
|
||||
@extend_schema_view(
|
||||
get=extend_schema(
|
||||
summary = "Fetch Config groups",
|
||||
description="Returns a list of Config Groups."
|
||||
),
|
||||
)
|
||||
class ConfigGroupsList(generics.ListAPIView):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = ConfigGroups.objects.all()
|
||||
lookup_field = 'pk'
|
||||
serializer_class = ConfigGroupsSerializer
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Config Groups"
|
||||
|
||||
|
||||
|
||||
@extend_schema( deprecated = True )
|
||||
@extend_schema_view(
|
||||
get=extend_schema(
|
||||
summary = "Get A Config Group",
|
||||
# responses = {}
|
||||
),
|
||||
)
|
||||
class ConfigGroupsDetail(generics.RetrieveAPIView):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = ConfigGroups.objects.all()
|
||||
lookup_field = 'pk'
|
||||
serializer_class = ConfigGroupsSerializer
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Config Group"
|
||||
|
||||
|
@ -1,79 +0,0 @@
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import generics, viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.core.ticket_category import TicketCategory, TicketCategorySerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = TicketCategory.objects.all()
|
||||
|
||||
serializer_class = TicketCategorySerializer
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a ticket category',
|
||||
request = TicketCategorySerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(description='Ticket category created', response=TicketCategorySerializer),
|
||||
403: OpenApiResponse(description='User tried to edit field they dont have access to'),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all of a tickets category',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Success', response=TicketCategorySerializer),
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected ticket category',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Success', response=TicketCategorySerializer),
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Update a ticket category',
|
||||
methods=["PUT"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Ticket comment updated', response=TicketCategorySerializer),
|
||||
403: OpenApiResponse(description='User tried to edit field they dont have access to'),
|
||||
}
|
||||
)
|
||||
def update(self, request, *args, **kwargs):
|
||||
|
||||
return super().update(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
if self.detail:
|
||||
return "Ticket Category"
|
||||
|
||||
return 'Ticket Categories'
|
@ -1,79 +0,0 @@
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import generics, viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.core.ticket_comment_category import TicketCommentCategory, TicketCommentCategorySerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = TicketCommentCategory.objects.all()
|
||||
|
||||
serializer_class = TicketCommentCategorySerializer
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a ticket comment category',
|
||||
request = TicketCommentCategorySerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(description='Ticket category created', response=TicketCommentCategorySerializer),
|
||||
403: OpenApiResponse(description='User tried to edit field they dont have access to'),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all of the ticket comment categories',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Success', response=TicketCommentCategorySerializer),
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected ticket comment category',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Success', response=TicketCommentCategorySerializer),
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Update a ticket comment category',
|
||||
methods=["PUT"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Ticket comment updated', response=TicketCommentCategorySerializer),
|
||||
403: OpenApiResponse(description='User tried to edit field they dont have access to'),
|
||||
}
|
||||
)
|
||||
def update(self, request, *args, **kwargs):
|
||||
|
||||
return super().update(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
if self.detail:
|
||||
return "Ticket Comment Category"
|
||||
|
||||
return 'Ticket Comment Categories'
|
@ -1,102 +0,0 @@
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import generics, viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.core.ticket_comment import TicketCommentSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
from core.models.ticket.ticket_comment import TicketComment
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = TicketComment.objects.all()
|
||||
|
||||
serializer_class = TicketCommentSerializer
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a ticket comment',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type.
|
||||
""",
|
||||
request = TicketCommentSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(description='Ticket comment created', response=TicketCommentSerializer),
|
||||
403: OpenApiResponse(description='User tried to edit field they dont have access to'),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all of a tickets comments',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Success', response=TicketCommentSerializer),
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected ticket Comment',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Success', response=TicketCommentSerializer),
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Update a ticket Comment',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type.
|
||||
""",
|
||||
methods=["PUT"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Ticket comment updated', response=TicketCommentSerializer),
|
||||
403: OpenApiResponse(description='User tried to edit field they dont have access to'),
|
||||
}
|
||||
)
|
||||
def update(self, request, *args, **kwargs):
|
||||
|
||||
return super().update(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
if 'ticket_id' in self.kwargs:
|
||||
|
||||
self.queryset = self.queryset.filter(ticket=self.kwargs['ticket_id']).order_by('created')
|
||||
|
||||
if 'pk' in self.kwargs:
|
||||
|
||||
self.queryset = self.queryset.filter(pk = self.kwargs['pk'])
|
||||
|
||||
return self.queryset
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
if self.detail:
|
||||
return "Ticket Comment"
|
||||
|
||||
return 'Ticket Comments'
|
@ -1,164 +0,0 @@
|
||||
from django.db.models import Q
|
||||
|
||||
from rest_framework import generics, viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.assistance.request import RequestTicketSerializer
|
||||
from api.serializers.itim.change import ChangeTicketSerializer
|
||||
from api.serializers.itim.incident import IncidentTicketSerializer
|
||||
from api.serializers.itim.problem import ProblemTicketSerializer
|
||||
from api.serializers.project_management.project_task import ProjectTaskSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
from core.models.ticket.ticket import Ticket
|
||||
|
||||
|
||||
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
filterset_fields = [
|
||||
'external_system',
|
||||
'external_ref',
|
||||
]
|
||||
|
||||
search_fields = [
|
||||
'title',
|
||||
'description',
|
||||
]
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
def get_dynamic_permissions(self):
|
||||
|
||||
if self.action == 'create':
|
||||
|
||||
action_keyword = 'add'
|
||||
|
||||
elif self.action == 'destroy':
|
||||
|
||||
action_keyword = 'delete'
|
||||
|
||||
elif self.action == 'list':
|
||||
|
||||
action_keyword = 'view'
|
||||
|
||||
elif self.action == 'partial_update':
|
||||
|
||||
action_keyword = 'change'
|
||||
|
||||
elif self.action == 'retrieve':
|
||||
|
||||
action_keyword = 'view'
|
||||
|
||||
elif self.action == 'update':
|
||||
|
||||
action_keyword = 'change'
|
||||
|
||||
elif self.action is None:
|
||||
|
||||
action_keyword = 'view'
|
||||
|
||||
else:
|
||||
|
||||
raise ValueError('unable to determin the action_keyword')
|
||||
|
||||
self.permission_required = [
|
||||
'core.' + action_keyword + '_ticket_' + self._ticket_type,
|
||||
]
|
||||
|
||||
return super().get_permission_required()
|
||||
|
||||
|
||||
# queryset = Ticket.objects.all()
|
||||
queryset = None
|
||||
|
||||
model = Ticket
|
||||
|
||||
|
||||
def get_serializer(self, *args, **kwargs):
|
||||
|
||||
if self._ticket_type == 'change':
|
||||
|
||||
self.serializer_class = ChangeTicketSerializer
|
||||
|
||||
self._ticket_type_value = Ticket.TicketType.CHANGE.value
|
||||
|
||||
elif self._ticket_type == 'incident':
|
||||
|
||||
self.serializer_class = IncidentTicketSerializer
|
||||
self._ticket_type_value = Ticket.TicketType.INCIDENT.value
|
||||
|
||||
elif self._ticket_type == 'problem':
|
||||
|
||||
self.serializer_class = ProblemTicketSerializer
|
||||
self._ticket_type_value = Ticket.TicketType.PROBLEM.value
|
||||
|
||||
elif self._ticket_type == 'request':
|
||||
|
||||
self.serializer_class = RequestTicketSerializer
|
||||
self._ticket_type_value = Ticket.TicketType.REQUEST.value
|
||||
|
||||
elif self._ticket_type == 'project_task':
|
||||
|
||||
self.serializer_class = ProjectTaskSerializer
|
||||
self._ticket_type_value = Ticket.TicketType.PROJECT_TASK.value
|
||||
|
||||
else:
|
||||
|
||||
raise ValueError('unable to determin the serializer_class')
|
||||
|
||||
return super().get_serializer(*args, **kwargs)
|
||||
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
if self._ticket_type == 'change':
|
||||
|
||||
ticket_type = self.model.TicketType.CHANGE.value
|
||||
|
||||
elif self._ticket_type == 'incident':
|
||||
|
||||
ticket_type = self.model.TicketType.INCIDENT.value
|
||||
|
||||
elif self._ticket_type == 'problem':
|
||||
|
||||
ticket_type = self.model.TicketType.PROBLEM.value
|
||||
|
||||
elif self._ticket_type == 'request':
|
||||
|
||||
ticket_type = self.model.TicketType.REQUEST.value
|
||||
|
||||
elif self._ticket_type == 'project_task':
|
||||
|
||||
ticket_type = self.model.TicketType.REQUEST.value
|
||||
|
||||
# return self.queryset.filter(
|
||||
# project = self.kwargs['project_id']
|
||||
# )
|
||||
|
||||
else:
|
||||
|
||||
raise ValueError('Unknown ticket type. kwarg `ticket_type` must be set')
|
||||
|
||||
|
||||
if not self.queryset:
|
||||
|
||||
queryset = Ticket.objects.all()
|
||||
|
||||
queryset = queryset.filter(
|
||||
ticket_type = ticket_type
|
||||
)
|
||||
|
||||
if self._ticket_type == 'project_task':
|
||||
|
||||
queryset = queryset.filter(
|
||||
project = self.kwargs['project_id']
|
||||
)
|
||||
|
||||
self.queryset = queryset
|
||||
|
||||
|
||||
return self.queryset
|
@ -1,8 +1,6 @@
|
||||
from django.conf import settings as django_settings
|
||||
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from rest_framework import generics, permissions, routers, viewsets
|
||||
from rest_framework import viewsets
|
||||
from rest_framework.decorators import api_view
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
@ -31,15 +29,6 @@ class Index(viewsets.ViewSet):
|
||||
def list(self, request, pk=None):
|
||||
|
||||
API: dict = {
|
||||
# "teams": reverse("_api_teams", request=request),
|
||||
'assistance': reverse("v1:_api_assistance", request=request),
|
||||
"devices": reverse("v1:device-list", request=request),
|
||||
"config_groups": reverse("v1:_api_config_groups", request=request),
|
||||
'itim': reverse("v1:_api_itim", request=request),
|
||||
"organizations": reverse("v1:_api_orgs", request=request),
|
||||
'project_management': reverse("v1:_api_project_management", request=request),
|
||||
"settings": reverse('v1:_settings', request=request),
|
||||
"software": reverse("v1:software-list", request=request),
|
||||
'v2': reverse("v2:_api_v2_home-list", request=request)
|
||||
}
|
||||
|
||||
|
@ -1,22 +0,0 @@
|
||||
from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
|
||||
|
||||
from drf_spectacular.utils import extend_schema
|
||||
|
||||
from itam.models.device import Device
|
||||
|
||||
from rest_framework import views
|
||||
from rest_framework.response import Response
|
||||
|
||||
|
||||
@extend_schema( deprecated = True )
|
||||
class View(views.APIView):
|
||||
|
||||
def get(self, request, slug):
|
||||
|
||||
device = Device.objects.get(slug=slug)
|
||||
|
||||
return Response(device.get_configuration(device.id))
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Device Config"
|
@ -1,96 +0,0 @@
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import generics, viewsets
|
||||
from rest_framework.response import Response
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.itam.device import DeviceSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
from itam.models.device import Device
|
||||
|
||||
|
||||
@extend_schema( deprecated = True )
|
||||
class DeviceViewSet(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Device.objects.all()
|
||||
|
||||
serializer_class = DeviceSerializer
|
||||
|
||||
@extend_schema(
|
||||
summary = 'Create a device',
|
||||
description="""Add a new device to the ITAM database.
|
||||
If you attempt to create a device and a device with a matching name and uuid or name and serial number
|
||||
is found within the database, it will not re-create it. The device will be returned within the message body.
|
||||
""",
|
||||
methods=["POST"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Device allready exists', response=DeviceSerializer),
|
||||
201: OpenApiResponse(description='Device created', response=DeviceSerializer),
|
||||
400: OpenApiResponse(description='Validation failed.'),
|
||||
403: OpenApiResponse(description='User is missing create permissions'),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
current_device = []
|
||||
|
||||
if 'uuid' in self.request.POST:
|
||||
|
||||
current_device = self.serializer_class.Meta.model.objects.filter(
|
||||
organization = int(self.request.POST['organization']),
|
||||
uuid = str(self.request.POST['uuid'])
|
||||
)
|
||||
|
||||
if 'serial_number' in self.request.POST and len(current_device) == 0:
|
||||
|
||||
current_device = self.serializer_class.Meta.model.objects.filter(
|
||||
organization = int(self.request.POST['organization']),
|
||||
serial_number = str(self.request.POST['serial_number'])
|
||||
)
|
||||
|
||||
if len(current_device) == 1:
|
||||
|
||||
instance = current_device.get()
|
||||
serializer = self.get_serializer(instance)
|
||||
return Response(serializer.data)
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema( description='Fetch devices that are from the users assigned organization(s)', methods=["GET"])
|
||||
def list(self, request):
|
||||
|
||||
return super().list(request)
|
||||
|
||||
|
||||
@extend_schema( description='Fetch the selected device', methods=["GET"])
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
if self.request.user.is_superuser:
|
||||
|
||||
return self.queryset.filter().order_by('name')
|
||||
|
||||
else:
|
||||
|
||||
return self.queryset.filter(Q(organization__in=self.user_organizations()) | Q(is_global = True)).order_by('name')
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
if self.detail:
|
||||
return "Device"
|
||||
|
||||
return 'Devices'
|
@ -1,123 +0,0 @@
|
||||
import json
|
||||
import re
|
||||
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import generics, views
|
||||
from rest_framework.exceptions import PermissionDenied, ValidationError
|
||||
from rest_framework.response import Response
|
||||
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
from api.serializers.itam.inventory import InventorySerializer
|
||||
from api.serializers.inventory import Inventory
|
||||
|
||||
from core.http.common import Http
|
||||
|
||||
from itam.models.device import Device
|
||||
from itam.tasks.inventory import process_inventory
|
||||
|
||||
from settings.models.user_settings import UserSettings
|
||||
|
||||
|
||||
|
||||
class InventoryPermissions(OrganizationPermissionAPI):
|
||||
|
||||
def permission_check(self, request, view, obj=None) -> bool:
|
||||
|
||||
data = view.request.data
|
||||
|
||||
self.obj = Device.objects.get(slug=str(data.details.name).lower())
|
||||
|
||||
return super().permission_check(request, view, obj=None)
|
||||
|
||||
|
||||
|
||||
@extend_schema( deprecated = True )
|
||||
class Collect(OrganizationPermissionAPI, views.APIView):
|
||||
|
||||
queryset = Device.objects.all()
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary = "Upload a device's inventory",
|
||||
description = """After inventorying a device, it's inventory file, `.json` is uploaded to this endpoint.
|
||||
If the device does not exist, it will be created. If the device does exist the existing
|
||||
device will be updated with the information within the inventory.
|
||||
|
||||
matching for an existing device is by slug which is the hostname converted to lower case
|
||||
letters. This conversion is automagic.
|
||||
|
||||
**NOTE:** _for device creation, the API user must have user setting 'Default Organization'. Without
|
||||
this setting populated, no device will be created and the endpoint will return HTTP/403_
|
||||
|
||||
## Permissions
|
||||
|
||||
- `itam.add_device` Required to upload inventory
|
||||
""",
|
||||
|
||||
methods=["POST"],
|
||||
parameters = None,
|
||||
tags = ['device', 'inventory',],
|
||||
request = InventorySerializer,
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Inventory upload successful'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
403: OpenApiResponse(description='User is missing permission or in different organization'),
|
||||
500: OpenApiResponse(description='Exception occured. View server logs for the Stack Trace'),
|
||||
}
|
||||
)
|
||||
def post(self, request, *args, **kwargs):
|
||||
|
||||
status = Http.Status.OK
|
||||
response_data = 'OK'
|
||||
|
||||
try:
|
||||
|
||||
data = json.loads(request.body)
|
||||
data = Inventory(data)
|
||||
|
||||
device = None
|
||||
|
||||
|
||||
self.default_organization = UserSettings.objects.get(user=request.user).default_organization
|
||||
|
||||
if Device.objects.filter(slug=str(data.details.name).lower()).exists():
|
||||
|
||||
self.obj = Device.objects.get(slug=str(data.details.name).lower())
|
||||
|
||||
device = self.obj
|
||||
|
||||
|
||||
if not self.permission_check(request=request, view=self, obj=device):
|
||||
|
||||
raise PermissionDenied()
|
||||
|
||||
task = process_inventory.delay(request.body, self.default_organization.id)
|
||||
|
||||
response_data: dict = {"task_id": f"{task.id}"}
|
||||
|
||||
|
||||
except PermissionDenied as e:
|
||||
|
||||
status = Http.Status.FORBIDDEN
|
||||
response_data = ''
|
||||
|
||||
except ValidationError as e:
|
||||
|
||||
status = Http.Status.BAD_REQUEST
|
||||
response_data = e.detail
|
||||
|
||||
except Exception as e:
|
||||
|
||||
print(f'An error occured{e}')
|
||||
|
||||
status = Http.Status.SERVER_ERROR
|
||||
response_data = 'Unknown Server Error occured'
|
||||
|
||||
|
||||
return Response(data=response_data,status=status)
|
||||
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Inventory"
|
@ -1,45 +0,0 @@
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from drf_spectacular.utils import extend_schema
|
||||
|
||||
from rest_framework import generics, viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.itam.software import SoftwareSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
from itam.models.software import Software
|
||||
|
||||
|
||||
@extend_schema(deprecated = True)
|
||||
class SoftwareViewSet(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Software.objects.all()
|
||||
|
||||
serializer_class = SoftwareSerializer
|
||||
|
||||
|
||||
def get_object(self, queryset=None, **kwargs):
|
||||
item = self.kwargs.get('pk')
|
||||
return get_object_or_404(Software, pk=item)
|
||||
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
if self.request.user.is_superuser:
|
||||
|
||||
return self.queryset.filter().order_by('name')
|
||||
|
||||
else:
|
||||
|
||||
return self.queryset.filter(Q(organization__in=self.user_organizations()) | Q(is_global = True)).order_by('name')
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Software"
|
@ -1 +0,0 @@
|
||||
from .index import *
|
@ -1,82 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from api.serializers.itim.change import ChangeTicketSerializer
|
||||
|
||||
from api.views.core.tickets import View
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(View):
|
||||
|
||||
_ticket_type:str = 'change'
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a ticket',
|
||||
description = """This model includes all of the ticket types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
request = ChangeTicketSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = ChangeTicketSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all tickets',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ChangeTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected ticket',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ChangeTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return "Change Ticket"
|
||||
|
||||
return 'Change Tickets'
|
@ -1,82 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from api.serializers.itim.incident import IncidentTicketSerializer
|
||||
from api.views.core.tickets import View
|
||||
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(View):
|
||||
|
||||
_ticket_type:str = 'incident'
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a ticket',
|
||||
description = """This model includes all of the ticket types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
request = IncidentTicketSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = IncidentTicketSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all tickets',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = IncidentTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected ticket',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = IncidentTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return "Incident Ticket"
|
||||
|
||||
return 'Incident Tickets'
|
@ -1,39 +0,0 @@
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from drf_spectacular.utils import extend_schema
|
||||
|
||||
from rest_framework import views
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class Index(views.APIView):
|
||||
|
||||
permission_classes = [
|
||||
IsAuthenticated,
|
||||
]
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "ITIM"
|
||||
|
||||
def get_view_description(self, html=False) -> str:
|
||||
text = "ITIM Module"
|
||||
if html:
|
||||
return mark_safe(f"<p>{text}</p>")
|
||||
else:
|
||||
return text
|
||||
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
||||
body: dict = {
|
||||
'changes': reverse('v1:_api_itim_change-list', request=request),
|
||||
'incidents': reverse('v1:_api_itim_incident-list', request=request),
|
||||
'problems': reverse('v1:_api_itim_problem-list', request=request),
|
||||
}
|
||||
|
||||
return Response(body)
|
@ -1,82 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from api.serializers.itim.problem import ProblemTicketSerializer
|
||||
from api.views.core.tickets import View
|
||||
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(View):
|
||||
|
||||
_ticket_type:str = 'problem'
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a ticket',
|
||||
description = """This model includes all of the ticket types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
request = ProblemTicketSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = ProblemTicketSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all tickets',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProblemTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected ticket',
|
||||
description = """This model includes all of the ticket comment types.
|
||||
Due to this not all fields will be available and what fields are available
|
||||
depends upon the comment type. see
|
||||
[administration docs](https://nofusscomputing.com/projects/centurion_erp/administration/core/ticketing/index.html) for more info.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProblemTicketSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return "Problem Ticket"
|
||||
|
||||
return 'Problem Tickets'
|
@ -1,239 +0,0 @@
|
||||
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
|
||||
from django.forms import ValidationError
|
||||
|
||||
from rest_framework import exceptions
|
||||
from rest_framework.permissions import DjangoObjectPermissions
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from core import exceptions as centurion_exceptions
|
||||
|
||||
|
||||
|
||||
class OrganizationPermissionAPI(DjangoObjectPermissions, OrganizationMixin):
|
||||
"""checking organization membership"""
|
||||
|
||||
def has_permission(self, request, view):
|
||||
|
||||
# if view.kwargs.get('pk', None):
|
||||
|
||||
# if(
|
||||
# str(type(view.get_object()).__name__).lower() == 'organization'
|
||||
# ):
|
||||
|
||||
# if view.get_object().manager == request.user:
|
||||
|
||||
# return True
|
||||
|
||||
return self.permission_check(request, view)
|
||||
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
|
||||
# if view.kwargs.get('pk', None):
|
||||
|
||||
# if(
|
||||
# str(type(obj).__name__).lower() == 'organization'
|
||||
# ):
|
||||
|
||||
# if obj.manager == request.user:
|
||||
|
||||
# return True
|
||||
|
||||
return self.permission_check(request, view)
|
||||
|
||||
|
||||
def permission_check(self, request, view, obj=None) -> bool:
|
||||
|
||||
if request.user.is_anonymous:
|
||||
|
||||
return False
|
||||
|
||||
try:
|
||||
|
||||
self.request = request
|
||||
|
||||
method = self.request._request.method.lower()
|
||||
|
||||
if method.upper() not in view.allowed_methods:
|
||||
|
||||
view.http_method_not_allowed(request._request)
|
||||
|
||||
if request.user.is_authenticated and method == 'options':
|
||||
|
||||
return True
|
||||
|
||||
if hasattr(view, 'get_queryset'):
|
||||
|
||||
queryset = view.get_queryset()
|
||||
|
||||
self.obj = queryset.model
|
||||
|
||||
elif hasattr(view, 'queryset'):
|
||||
|
||||
if view.queryset.model._meta:
|
||||
|
||||
self.obj = view.queryset.model
|
||||
|
||||
object_organization = None
|
||||
|
||||
if method == 'get':
|
||||
|
||||
action = 'view'
|
||||
|
||||
elif method == 'post':
|
||||
|
||||
action = 'add'
|
||||
|
||||
if 'organization' in request.data:
|
||||
|
||||
serializer = None
|
||||
|
||||
try: # Method throws exception if not overridden
|
||||
|
||||
serializer = view.get_serializer_class()
|
||||
|
||||
except Exception as e:
|
||||
|
||||
serializer = None
|
||||
|
||||
try: # Method throws exception if not overridden
|
||||
|
||||
serializer = view.get_serializer()
|
||||
|
||||
except Exception as e:
|
||||
|
||||
serializer = None
|
||||
|
||||
|
||||
if 'organization' not in getattr(serializer.Meta, 'read_only_fields', []):
|
||||
|
||||
if not request.data['organization']:
|
||||
|
||||
raise centurion_exceptions.ValidationError('you must provide an organization')
|
||||
|
||||
object_organization = int(request.data['organization'])
|
||||
|
||||
|
||||
elif method == 'patch':
|
||||
|
||||
action = 'change'
|
||||
|
||||
elif method == 'put':
|
||||
|
||||
action = 'change'
|
||||
|
||||
elif method == 'delete':
|
||||
|
||||
action = 'delete'
|
||||
|
||||
else:
|
||||
|
||||
action = 'view'
|
||||
|
||||
if hasattr(self, 'obj'):
|
||||
|
||||
permission = self.obj._meta.app_label + '.' + action + '_' + self.obj._meta.model_name
|
||||
|
||||
self.permission_required = [ permission ]
|
||||
|
||||
if hasattr(view, 'get_dynamic_permissions'):
|
||||
|
||||
self.permission_required = view.get_dynamic_permissions()
|
||||
|
||||
|
||||
if view:
|
||||
if 'organization_id' in view.kwargs:
|
||||
|
||||
if view.kwargs['organization_id']:
|
||||
|
||||
object_organization = view.kwargs['organization_id']
|
||||
|
||||
if object_organization is None and 'pk' in view.kwargs:
|
||||
|
||||
try:
|
||||
|
||||
self.obj = view.queryset.get(pk=view.kwargs['pk']) # Here
|
||||
|
||||
except ObjectDoesNotExist:
|
||||
|
||||
return False
|
||||
|
||||
|
||||
if object_organization is None and getattr(view, 'parent_model', None):
|
||||
|
||||
parent_model = view.parent_model.objects.get(pk=view.kwargs[view.parent_model_pk_kwarg])
|
||||
|
||||
object_organization = parent_model.organization.id
|
||||
|
||||
|
||||
if obj:
|
||||
|
||||
if obj.get_organization():
|
||||
|
||||
object_organization = obj.get_organization().id
|
||||
|
||||
if hasattr(self.obj, 'is_global'):
|
||||
|
||||
if obj.is_global:
|
||||
|
||||
object_organization = 0
|
||||
|
||||
|
||||
if 'pk' in view.kwargs:
|
||||
|
||||
if object_organization is None and view.queryset.model._meta.model_name == 'tenant' and view.kwargs['pk']:
|
||||
|
||||
object_organization = view.kwargs['pk']
|
||||
|
||||
if object_organization is None:
|
||||
|
||||
try:
|
||||
|
||||
self.obj = view.queryset.get()
|
||||
|
||||
except ObjectDoesNotExist:
|
||||
|
||||
return False
|
||||
|
||||
|
||||
if hasattr(self, 'obj') and object_organization is None and 'pk' in view.kwargs:
|
||||
|
||||
if self.obj.get_organization():
|
||||
|
||||
object_organization = self.obj.get_organization().id
|
||||
|
||||
if hasattr(self.obj, 'is_global'):
|
||||
|
||||
if self.obj.is_global:
|
||||
|
||||
object_organization = 0
|
||||
|
||||
|
||||
# ToDo: implement proper checking of listview as this if allows ALL.
|
||||
if 'pk' not in view.kwargs and method == 'get' and object_organization is None:
|
||||
|
||||
return True
|
||||
|
||||
if hasattr(self, 'default_organization'):
|
||||
object_organization = self.default_organization
|
||||
|
||||
if method == 'post' and hasattr(self, 'default_organization'):
|
||||
|
||||
if self.default_organization:
|
||||
|
||||
object_organization = self.default_organization.id
|
||||
|
||||
if not self.has_organization_permission(object_organization) and not request.user.is_superuser:
|
||||
|
||||
raise PermissionDenied('You are not part of this organization')
|
||||
|
||||
except centurion_exceptions.MethodNotAllowed as e:
|
||||
|
||||
raise centurion_exceptions.MethodNotAllowed( str(method).upper() )
|
||||
|
||||
except Exception as e:
|
||||
|
||||
return False
|
||||
|
||||
return True
|
@ -1 +0,0 @@
|
||||
from .index import *
|
@ -1,36 +0,0 @@
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from drf_spectacular.utils import extend_schema
|
||||
|
||||
from rest_framework import generics, permissions, routers, views
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class Index(views.APIView):
|
||||
|
||||
permission_classes = [
|
||||
IsAuthenticated,
|
||||
]
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Projects"
|
||||
|
||||
def get_view_description(self, html=False) -> str:
|
||||
text = "Projects Managementn Module"
|
||||
if html:
|
||||
return mark_safe(f"<p>{text}</p>")
|
||||
else:
|
||||
return text
|
||||
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
||||
body: dict = {
|
||||
'projects': reverse('v1:_api_projects-list', request=request)
|
||||
}
|
||||
|
||||
return Response(body)
|
@ -1,90 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.project_management.project_milestone import ProjectMilestone, ProjectMilestoneSerializer
|
||||
# from api.views.core.tickets import View
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
|
||||
@extend_schema(deprecated = True )
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = ProjectMilestone.objects.all()
|
||||
|
||||
serializer_class = ProjectMilestoneSerializer
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a project milestone',
|
||||
request = ProjectMilestoneSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = ProjectMilestoneSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all project milestones',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectMilestoneSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected project milestone',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectMilestoneSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return ProjectMilestone._meta.verbose_name
|
||||
|
||||
return ProjectMilestone._meta.verbose_name_plural
|
||||
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
if 'project_id' in self.kwargs:
|
||||
|
||||
self.queryset = self.queryset.filter(
|
||||
project=self.kwargs['project_id']
|
||||
)
|
||||
|
||||
if 'pk' in self.kwargs:
|
||||
|
||||
self.queryset = self.queryset.filter(
|
||||
pk = self.kwargs['pk']
|
||||
)
|
||||
|
||||
return self.queryset
|
@ -1,73 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.project_management.project_state import ProjectState, ProjectStateSerializer
|
||||
from api.views.core.tickets import View
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
|
||||
@extend_schema(deprecated = True )
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = ProjectState.objects.all()
|
||||
|
||||
serializer_class = ProjectStateSerializer
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a project state',
|
||||
request = ProjectStateSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = ProjectStateSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all project states',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectStateSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected project state',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectStateSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return ProjectState._meta.verbose_name
|
||||
|
||||
return ProjectState._meta.verbose_name_plural
|
@ -1,65 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from api.serializers.project_management.project_task import ProjectTaskSerializer
|
||||
|
||||
from api.views.core.tickets import View
|
||||
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(View):
|
||||
|
||||
_ticket_type:str = 'project_task'
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a Project Task',
|
||||
request = ProjectTaskSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = ProjectTaskSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all project tasks',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectTaskSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected project task',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectTaskSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return "Project Task"
|
||||
|
||||
return 'Project Tasks'
|
@ -1,72 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import viewsets
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.project_management.project_type import ProjectType, ProjectTypeSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
|
||||
@extend_schema(deprecated = True )
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = ProjectType.objects.all()
|
||||
|
||||
serializer_class = ProjectTypeSerializer
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Create a project type',
|
||||
request = ProjectTypeSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(
|
||||
response = ProjectTypeSerializer,
|
||||
),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch all project types',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectTypeSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def list(self, request, *args, **kwargs):
|
||||
|
||||
return super().list(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected project type',
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(
|
||||
description='Success',
|
||||
response = ProjectTypeSerializer
|
||||
)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
|
||||
if self.detail:
|
||||
return ProjectType._meta.verbose_name
|
||||
|
||||
return ProjectType._meta.verbose_name_plural
|
@ -1,122 +0,0 @@
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiRequest, PolymorphicProxySerializer
|
||||
|
||||
from rest_framework import generics, viewsets
|
||||
from rest_framework.response import Response
|
||||
|
||||
from access.mixin import OrganizationMixin
|
||||
|
||||
from api.serializers.project_management.projects import ProjectSerializer, ProjectImportSerializer
|
||||
from api.views.mixin import OrganizationPermissionAPI
|
||||
|
||||
from project_management.models.projects import Project
|
||||
|
||||
from settings.models.user_settings import UserSettings
|
||||
|
||||
|
||||
@extend_schema(deprecated = True )
|
||||
class View(OrganizationMixin, viewsets.ModelViewSet):
|
||||
|
||||
filterset_fields = [
|
||||
'external_system',
|
||||
'external_ref',
|
||||
]
|
||||
|
||||
search_fields = [
|
||||
'name',
|
||||
'description',
|
||||
]
|
||||
|
||||
permission_classes = [
|
||||
OrganizationPermissionAPI
|
||||
]
|
||||
|
||||
queryset = Project.objects.all()
|
||||
|
||||
# serializer_class = ProjectSerializer
|
||||
|
||||
def get_serializer_class(self):
|
||||
|
||||
user_default_organization = UserSettings.objects.get(user = self.request.user).default_organization
|
||||
|
||||
if user_default_organization:
|
||||
|
||||
if hasattr(user_default_organization, 'default_organization'):
|
||||
|
||||
if self.has_organization_permission(
|
||||
organization = user_default_organization.default_organization.id,
|
||||
permissions_required = ['project_management.import_project']
|
||||
) or self.request.user.is_superuser:
|
||||
|
||||
return ProjectImportSerializer
|
||||
|
||||
return ProjectSerializer
|
||||
|
||||
@extend_schema(
|
||||
summary = 'Create a project',
|
||||
description = """**Note:** Users whom lack permssion `import_project`,
|
||||
will be unable to add, edit and view fields: `created`, `external_ref`, `external_system`,
|
||||
and `is_deleted`.
|
||||
""",
|
||||
methods=["POST"],
|
||||
request = ProjectImportSerializer,
|
||||
responses = {
|
||||
201: OpenApiResponse(description='project created', response=ProjectImportSerializer),
|
||||
403: OpenApiResponse(description='User is missing create permissions'),
|
||||
}
|
||||
)
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
||||
return super().create(request, *args, **kwargs)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch projects',
|
||||
description = """**Note:** Users whom lack permssion `import_project`,
|
||||
will be unable to add, edit and view fields: `created`, `external_ref`, `external_system`,
|
||||
and `is_deleted`.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='projects', response=ProjectImportSerializer)
|
||||
}
|
||||
)
|
||||
def list(self, request):
|
||||
|
||||
return super().list(request)
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary='Fetch the selected project',
|
||||
description = """**Note:** Users whom lack permssion `import_project`,
|
||||
will be unable to add, edit and view fields: `created`, `external_ref`, `external_system`,
|
||||
and `is_deleted`.
|
||||
""",
|
||||
methods=["GET"],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='projects', response=ProjectImportSerializer)
|
||||
}
|
||||
)
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
|
||||
return super().retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
if self.request.user.is_superuser:
|
||||
|
||||
return self.queryset.filter()
|
||||
|
||||
else:
|
||||
|
||||
return self.queryset.filter(Q(organization__in=self.user_organizations()) | Q(is_global = True))
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
if self.detail:
|
||||
return "Project"
|
||||
|
||||
return 'Projects'
|
@ -1,51 +0,0 @@
|
||||
from django.contrib.auth.models import Permission
|
||||
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import views
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.reverse import reverse
|
||||
|
||||
from core.http.common import Http
|
||||
|
||||
|
||||
@extend_schema( deprecated = True )
|
||||
class View(views.APIView):
|
||||
|
||||
permission_classes = [
|
||||
IsAuthenticated,
|
||||
]
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary = "Settings Index Page",
|
||||
description = """This endpoint provides the available settings as available via the API.
|
||||
""",
|
||||
|
||||
methods=["GET"],
|
||||
parameters = None,
|
||||
tags = ['settings',],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Inventory upload successful'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
500: OpenApiResponse(description='Exception occured. View server logs for the Stack Trace'),
|
||||
}
|
||||
)
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
||||
status = Http.Status.OK
|
||||
|
||||
response_data: dict = {
|
||||
"permissions": reverse('v1:_settings_permissions', request=request),
|
||||
"project_state": reverse('v1:_api_project_state-list', request=request),
|
||||
"project_type": reverse('v1:_api_project_type-list', request=request),
|
||||
"ticket_categories": reverse('v1:_api_ticket_category-list', request=request),
|
||||
"ticket_comment_categories": reverse('v1:_api_ticket_comment_category-list', request=request)
|
||||
}
|
||||
|
||||
return Response(data=response_data,status=status)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Settings"
|
@ -1,67 +0,0 @@
|
||||
from drf_spectacular.utils import extend_schema, OpenApiResponse
|
||||
|
||||
from rest_framework import views
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
|
||||
from access.functions import permissions
|
||||
|
||||
from core.http.common import Http
|
||||
|
||||
|
||||
@extend_schema(deprecated=True)
|
||||
class View(views.APIView):
|
||||
|
||||
permission_classes = [
|
||||
IsAuthenticated,
|
||||
]
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary = "Fetch available permissions",
|
||||
description = """This endpoint provides a list of permissions that are available within
|
||||
Centurion ERP. The format of each permission is `<app name>.<permission>_<model>`.
|
||||
|
||||
This endpoint is available to **all** authenticated users.
|
||||
""",
|
||||
|
||||
methods=["GET"],
|
||||
parameters = None,
|
||||
tags = ['settings',],
|
||||
responses = {
|
||||
200: OpenApiResponse(description='Inventory upload successful'),
|
||||
401: OpenApiResponse(description='User Not logged in'),
|
||||
500: OpenApiResponse(description='Exception occured. View server logs for the Stack Trace'),
|
||||
}
|
||||
)
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
||||
status = Http.Status.OK
|
||||
|
||||
response_data: list = []
|
||||
|
||||
try:
|
||||
|
||||
for permission in permissions.permission_queryset():
|
||||
|
||||
response_data += [ str(f"{permission.content_type.app_label}.{permission.codename}") ]
|
||||
|
||||
except PermissionDenied as e:
|
||||
|
||||
status = Http.Status.FORBIDDEN
|
||||
response_data = ''
|
||||
|
||||
|
||||
except Exception as e:
|
||||
|
||||
print(f'An error occured{e}')
|
||||
|
||||
status = Http.Status.SERVER_ERROR
|
||||
response_data = 'Unknown Server Error occured'
|
||||
|
||||
|
||||
return Response(data=response_data,status=status)
|
||||
|
||||
|
||||
def get_view_name(self):
|
||||
return "Permissions"
|
Reference in New Issue
Block a user