mirror of
https://gitea.mueller.network/extern/django-helpdesk.git
synced 2024-11-25 01:13:31 +01:00
Private kb categories
This commit is contained in:
parent
0395f26d6c
commit
ecbb91b861
@ -15,6 +15,7 @@ Contents
|
|||||||
settings
|
settings
|
||||||
spam
|
spam
|
||||||
custom_fields
|
custom_fields
|
||||||
|
integration
|
||||||
contributing
|
contributing
|
||||||
license
|
license
|
||||||
|
|
||||||
|
@ -58,7 +58,11 @@ errors with trying to create User settings.
|
|||||||
'django.contrib.admin', # Required for helpdesk admin/maintenance
|
'django.contrib.admin', # Required for helpdesk admin/maintenance
|
||||||
'django.contrib.humanize', # Required for elapsed time formatting
|
'django.contrib.humanize', # Required for elapsed time formatting
|
||||||
'bootstrap4form', # Required for nicer formatting of forms with the default templates
|
'bootstrap4form', # Required for nicer formatting of forms with the default templates
|
||||||
|
'account', # Required by pinax-teams
|
||||||
|
'pinax.inviations', # required by pinax-teams
|
||||||
|
'pinax.teams', # team support
|
||||||
'helpdesk', # This is us!
|
'helpdesk', # This is us!
|
||||||
|
'reversion', # required by pinax-teams
|
||||||
)
|
)
|
||||||
|
|
||||||
Your ``settings.py`` file should also define a ``SITE_ID`` that allows multiple projects to share
|
Your ``settings.py`` file should also define a ``SITE_ID`` that allows multiple projects to share
|
||||||
|
20
helpdesk/migrations/0028_kbitem_team.py
Normal file
20
helpdesk/migrations/0028_kbitem_team.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Generated by Django 2.2.9 on 2020-01-27 15:01
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('pinax_teams', '0004_auto_20170511_0856'),
|
||||||
|
('helpdesk', '0027_auto_20200107_1221'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='kbitem',
|
||||||
|
name='team',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pinax_teams.Team', verbose_name='Team'),
|
||||||
|
),
|
||||||
|
]
|
18
helpdesk/migrations/0029_kbcategory_public.py
Normal file
18
helpdesk/migrations/0029_kbcategory_public.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 2.2.9 on 2020-01-27 16:00
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('helpdesk', '0028_kbitem_team'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='kbcategory',
|
||||||
|
name='public',
|
||||||
|
field=models.BooleanField(default=True, verbose_name='Is KBCategory publicly visible?'),
|
||||||
|
),
|
||||||
|
]
|
@ -25,6 +25,8 @@ from django.utils.safestring import mark_safe
|
|||||||
from markdown import markdown
|
from markdown import markdown
|
||||||
from markdown.extensions import Extension
|
from markdown.extensions import Extension
|
||||||
|
|
||||||
|
import pinax.teams.models
|
||||||
|
|
||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
@ -1234,6 +1236,11 @@ class KBCategory(models.Model):
|
|||||||
verbose_name=_('Default queue when creating a ticket after viewing this category.'),
|
verbose_name=_('Default queue when creating a ticket after viewing this category.'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
public = models.BooleanField(
|
||||||
|
default=True,
|
||||||
|
verbose_name=_("Is KBCategory publicly visible?")
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%s' % self.title
|
return '%s' % self.title
|
||||||
|
|
||||||
@ -1297,6 +1304,14 @@ class KBItem(models.Model):
|
|||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
team = models.ForeignKey(
|
||||||
|
pinax.teams.models.Team,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
verbose_name=_('Team'),
|
||||||
|
blank=True,
|
||||||
|
null=True,
|
||||||
|
)
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self.last_updated:
|
if not self.last_updated:
|
||||||
self.last_updated = timezone.now()
|
self.last_updated = timezone.now()
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
from helpdesk.models import (
|
from helpdesk.models import (
|
||||||
Ticket,
|
Ticket,
|
||||||
Queue
|
Queue,
|
||||||
|
KBCategory,
|
||||||
)
|
)
|
||||||
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
|
||||||
|
|
||||||
|
def huser_from_request(req):
|
||||||
|
return HelpdeskUser(req.user)
|
||||||
|
|
||||||
|
|
||||||
class HelpdeskUser:
|
class HelpdeskUser:
|
||||||
def __init__(self, user):
|
def __init__(self, user):
|
||||||
self.user = user
|
self.user = user
|
||||||
@ -30,9 +35,19 @@ class HelpdeskUser:
|
|||||||
else:
|
else:
|
||||||
return all_queues
|
return all_queues
|
||||||
|
|
||||||
|
def get_kb_categories(self):
|
||||||
|
categories = []
|
||||||
|
for cat in KBCategory.objects.all():
|
||||||
|
if self.can_access_kbcategory(cat):
|
||||||
|
categories.append(cat)
|
||||||
|
return categories
|
||||||
|
|
||||||
def get_tickets_in_queues(self):
|
def get_tickets_in_queues(self):
|
||||||
return Ticket.objects.filter(queue__in=self.get_queues())
|
return Ticket.objects.filter(queue__in=self.get_queues())
|
||||||
|
|
||||||
|
def has_full_access(self):
|
||||||
|
return self.user.is_superuser or self.user.is_staff
|
||||||
|
|
||||||
def can_access_queue(self, queue):
|
def can_access_queue(self, queue):
|
||||||
"""Check if a certain user can access a certain queue.
|
"""Check if a certain user can access a certain queue.
|
||||||
|
|
||||||
@ -40,11 +55,10 @@ class HelpdeskUser:
|
|||||||
:param queue: The django-helpdesk Queue instance
|
:param queue: The django-helpdesk Queue instance
|
||||||
:return: True if the user has permission (either by default or explicitly), false otherwise
|
:return: True if the user has permission (either by default or explicitly), false otherwise
|
||||||
"""
|
"""
|
||||||
user = self.user
|
if self.has_full_access():
|
||||||
if user.is_superuser or not helpdesk_settings.HELPDESK_ENABLE_PER_QUEUE_STAFF_PERMISSION:
|
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return user.has_perm(queue.permission_name)
|
return helpdesk_settings.HELPDESK_ENABLE_PER_QUEUE_STAFF_PERMISSION and self.user.has_perm(queue.permission_name)
|
||||||
|
|
||||||
def can_access_ticket(self, ticket):
|
def can_access_ticket(self, ticket):
|
||||||
"""Check to see if the user has permission to access
|
"""Check to see if the user has permission to access
|
||||||
@ -52,8 +66,13 @@ class HelpdeskUser:
|
|||||||
user = self.user
|
user = self.user
|
||||||
if self.can_access_queue(ticket.queue):
|
if self.can_access_queue(ticket.queue):
|
||||||
return True
|
return True
|
||||||
elif user.is_superuser or user.is_staff or \
|
elif self.has_full_access() or \
|
||||||
(ticket.assigned_to and user.id == ticket.assigned_to.id):
|
(ticket.assigned_to and user.id == ticket.assigned_to.id):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def can_access_kbcategory(self, category):
|
||||||
|
if category.public:
|
||||||
|
return True
|
||||||
|
return self.has_full_access() or (category.queue and self.can_access_queue(category.queue))
|
||||||
|
@ -8,25 +8,28 @@ views/kb.py - Public-facing knowledgebase views. The knowledgebase is a
|
|||||||
resolutions to common problems.
|
resolutions to common problems.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect, Http404
|
||||||
from django.shortcuts import render, get_object_or_404
|
from django.shortcuts import render, get_object_or_404
|
||||||
from django.views.decorators.clickjacking import xframe_options_exempt
|
from django.views.decorators.clickjacking import xframe_options_exempt
|
||||||
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
from helpdesk import user
|
||||||
from helpdesk.models import KBCategory, KBItem
|
from helpdesk.models import KBCategory, KBItem
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
category_list = KBCategory.objects.all()
|
huser = user.huser_from_request(request)
|
||||||
# TODO: It'd be great to have a list of most popular items here.
|
# TODO: It'd be great to have a list of most popular items here.
|
||||||
return render(request, 'helpdesk/kb_index.html', {
|
return render(request, 'helpdesk/kb_index.html', {
|
||||||
'kb_categories': category_list,
|
'kb_categories': huser.get_kb_categories(),
|
||||||
'helpdesk_settings': helpdesk_settings,
|
'helpdesk_settings': helpdesk_settings,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
def category(request, slug, iframe=False):
|
def category(request, slug, iframe=False):
|
||||||
category = get_object_or_404(KBCategory, slug__iexact=slug)
|
category = get_object_or_404(KBCategory, slug__iexact=slug)
|
||||||
|
if not user.huser_from_request(request).can_access_kbcategory(category):
|
||||||
|
raise Http404
|
||||||
items = category.kbitem_set.all()
|
items = category.kbitem_set.all()
|
||||||
selected_item = request.GET.get('kbitem', None)
|
selected_item = request.GET.get('kbitem', None)
|
||||||
try:
|
try:
|
||||||
|
@ -25,6 +25,7 @@ import helpdesk.views.abstract_views as abstract_views
|
|||||||
from helpdesk.forms import PublicTicketForm
|
from helpdesk.forms import PublicTicketForm
|
||||||
from helpdesk.lib import text_is_spam
|
from helpdesk.lib import text_is_spam
|
||||||
from helpdesk.models import CustomField, Ticket, Queue, UserSettings, KBCategory, KBItem
|
from helpdesk.models import CustomField, Ticket, Queue, UserSettings, KBCategory, KBItem
|
||||||
|
from helpdesk.user import huser_from_request
|
||||||
|
|
||||||
|
|
||||||
def create_ticket(request, *args, **kwargs):
|
def create_ticket(request, *args, **kwargs):
|
||||||
@ -129,7 +130,7 @@ class Homepage(CreateTicketView):
|
|||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
context['kb_categories'] = KBCategory.objects.all()
|
context['kb_categories'] = huser_from_request(self.request).get_kb_categories()
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,3 +12,4 @@ pytz
|
|||||||
six
|
six
|
||||||
djangorestframework
|
djangorestframework
|
||||||
django-model-utils
|
django-model-utils
|
||||||
|
pinax-teams
|
||||||
|
Loading…
Reference in New Issue
Block a user