mirror of
https://github.com/django-helpdesk/django-helpdesk.git
synced 2025-06-19 17:18:23 +02:00
fix(kb): no db
This commit is contained in:
parent
347a70e497
commit
7a3260a163
@ -1275,166 +1275,166 @@ class EmailTemplate(models.Model):
|
|||||||
verbose_name = _('e-mail template')
|
verbose_name = _('e-mail template')
|
||||||
verbose_name_plural = _('e-mail templates')
|
verbose_name_plural = _('e-mail templates')
|
||||||
|
|
||||||
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
|
||||||
class KBCategory(models.Model):
|
|
||||||
"""
|
|
||||||
Lets help users help themselves: the Knowledge Base is a categorised
|
|
||||||
listing of questions & answers.
|
|
||||||
"""
|
|
||||||
|
|
||||||
name = models.CharField(
|
class KBCategory(models.Model):
|
||||||
_('Name of the category'),
|
"""
|
||||||
max_length=100,
|
Lets help users help themselves: the Knowledge Base is a categorised
|
||||||
)
|
listing of questions & answers.
|
||||||
|
"""
|
||||||
|
|
||||||
title = models.CharField(
|
name = models.CharField(
|
||||||
_('Title on knowledgebase page'),
|
_('Name of the category'),
|
||||||
max_length=100,
|
max_length=100,
|
||||||
)
|
)
|
||||||
|
|
||||||
slug = models.SlugField(
|
title = models.CharField(
|
||||||
_('Slug'),
|
_('Title on knowledgebase page'),
|
||||||
)
|
max_length=100,
|
||||||
|
)
|
||||||
|
|
||||||
description = models.TextField(
|
slug = models.SlugField(
|
||||||
_('Description'),
|
_('Slug'),
|
||||||
)
|
)
|
||||||
|
|
||||||
queue = models.ForeignKey(
|
description = models.TextField(
|
||||||
Queue,
|
_('Description'),
|
||||||
blank=True,
|
)
|
||||||
null=True,
|
|
||||||
on_delete=models.CASCADE,
|
|
||||||
verbose_name=_('Default queue when creating a ticket after viewing this category.'),
|
|
||||||
)
|
|
||||||
|
|
||||||
public = models.BooleanField(
|
queue = models.ForeignKey(
|
||||||
default=True,
|
Queue,
|
||||||
verbose_name=_("Is KBCategory publicly visible?")
|
blank=True,
|
||||||
)
|
null=True,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
verbose_name=_('Default queue when creating a ticket after viewing this category.'),
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
public = models.BooleanField(
|
||||||
return '%s' % self.name
|
default=True,
|
||||||
|
verbose_name=_("Is KBCategory publicly visible?")
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
def __str__(self):
|
||||||
ordering = ('title',)
|
return '%s' % self.name
|
||||||
verbose_name = _('Knowledge base category')
|
|
||||||
verbose_name_plural = _('Knowledge base categories')
|
|
||||||
|
|
||||||
def get_absolute_url(self):
|
class Meta:
|
||||||
from django.urls import reverse
|
ordering = ('title',)
|
||||||
return reverse('helpdesk:kb_category', kwargs={'slug': self.slug})
|
verbose_name = _('Knowledge base category')
|
||||||
|
verbose_name_plural = _('Knowledge base categories')
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
from django.urls import reverse
|
||||||
|
return reverse('helpdesk:kb_category', kwargs={'slug': self.slug})
|
||||||
|
|
||||||
|
|
||||||
class KBItem(models.Model):
|
class KBItem(models.Model):
|
||||||
"""
|
"""
|
||||||
An item within the knowledgebase. Very straightforward question/answer
|
An item within the knowledgebase. Very straightforward question/answer
|
||||||
style system.
|
style system.
|
||||||
"""
|
"""
|
||||||
voted_by = models.ManyToManyField(
|
voted_by = models.ManyToManyField(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
related_name='votes',
|
related_name='votes',
|
||||||
)
|
)
|
||||||
downvoted_by = models.ManyToManyField(
|
downvoted_by = models.ManyToManyField(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
related_name='downvotes',
|
related_name='downvotes',
|
||||||
)
|
)
|
||||||
category = models.ForeignKey(
|
category = models.ForeignKey(
|
||||||
KBCategory,
|
KBCategory,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
verbose_name=_('Category'),
|
verbose_name=_('Category'),
|
||||||
)
|
)
|
||||||
|
|
||||||
title = models.CharField(
|
title = models.CharField(
|
||||||
_('Title'),
|
_('Title'),
|
||||||
max_length=100,
|
max_length=100,
|
||||||
)
|
)
|
||||||
|
|
||||||
question = models.TextField(
|
question = models.TextField(
|
||||||
_('Question'),
|
_('Question'),
|
||||||
)
|
)
|
||||||
|
|
||||||
answer = models.TextField(
|
answer = models.TextField(
|
||||||
_('Answer'),
|
_('Answer'),
|
||||||
)
|
)
|
||||||
|
|
||||||
votes = models.IntegerField(
|
votes = models.IntegerField(
|
||||||
_('Votes'),
|
_('Votes'),
|
||||||
help_text=_('Total number of votes cast for this item'),
|
help_text=_('Total number of votes cast for this item'),
|
||||||
default=0,
|
default=0,
|
||||||
)
|
)
|
||||||
|
|
||||||
recommendations = models.IntegerField(
|
recommendations = models.IntegerField(
|
||||||
_('Positive Votes'),
|
_('Positive Votes'),
|
||||||
help_text=_('Number of votes for this item which were POSITIVE.'),
|
help_text=_('Number of votes for this item which were POSITIVE.'),
|
||||||
default=0,
|
default=0,
|
||||||
)
|
)
|
||||||
|
|
||||||
last_updated = models.DateTimeField(
|
last_updated = models.DateTimeField(
|
||||||
_('Last Updated'),
|
_('Last Updated'),
|
||||||
help_text=_('The date on which this question was most recently changed.'),
|
help_text=_('The date on which this question was most recently changed.'),
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
team = models.ForeignKey(
|
team = models.ForeignKey(
|
||||||
helpdesk_settings.HELPDESK_TEAMS_MODEL,
|
helpdesk_settings.HELPDESK_TEAMS_MODEL,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
verbose_name=_('Team'),
|
verbose_name=_('Team'),
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
order = models.PositiveIntegerField(
|
order = models.PositiveIntegerField(
|
||||||
_('Order'),
|
_('Order'),
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
enabled = models.BooleanField(
|
enabled = models.BooleanField(
|
||||||
_('Enabled to display to users'),
|
_('Enabled to display to users'),
|
||||||
default=True,
|
default=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()
|
||||||
return super(KBItem, self).save(*args, **kwargs)
|
return super(KBItem, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def get_team(self):
|
def get_team(self):
|
||||||
return helpdesk_settings.HELPDESK_KBITEM_TEAM_GETTER(self)
|
return helpdesk_settings.HELPDESK_KBITEM_TEAM_GETTER(self)
|
||||||
|
|
||||||
def _score(self):
|
def _score(self):
|
||||||
""" Return a score out of 10 or Unrated if no votes """
|
""" Return a score out of 10 or Unrated if no votes """
|
||||||
if self.votes > 0:
|
if self.votes > 0:
|
||||||
return (self.recommendations / self.votes) * 10
|
return (self.recommendations / self.votes) * 10
|
||||||
else:
|
else:
|
||||||
return _('Unrated')
|
return _('Unrated')
|
||||||
score = property(_score)
|
score = property(_score)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%s: %s' % (self.category.title, self.title)
|
return '%s: %s' % (self.category.title, self.title)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ('order', 'title',)
|
ordering = ('order', 'title',)
|
||||||
verbose_name = _('Knowledge base item')
|
verbose_name = _('Knowledge base item')
|
||||||
verbose_name_plural = _('Knowledge base items')
|
verbose_name_plural = _('Knowledge base items')
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
return str(reverse('helpdesk:kb_category', args=(self.category.slug,))) + "?kbitem=" + str(self.pk)
|
return str(reverse('helpdesk:kb_category', args=(self.category.slug,))) + "?kbitem=" + str(self.pk)
|
||||||
|
|
||||||
def query_url(self):
|
def query_url(self):
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
return str(reverse('helpdesk:list')) + "?kbitem=" + str(self.pk)
|
return str(reverse('helpdesk:list')) + "?kbitem=" + str(self.pk)
|
||||||
|
|
||||||
def num_open_tickets(self):
|
def num_open_tickets(self):
|
||||||
return Ticket.objects.filter(kbitem=self, status__in=(1, 2)).count()
|
return Ticket.objects.filter(kbitem=self, status__in=(1, 2)).count()
|
||||||
|
|
||||||
def unassigned_tickets(self):
|
def unassigned_tickets(self):
|
||||||
return Ticket.objects.filter(kbitem=self, status__in=(1, 2), assigned_to__isnull=True)
|
return Ticket.objects.filter(kbitem=self, status__in=(1, 2), assigned_to__isnull=True)
|
||||||
|
|
||||||
def get_markdown(self):
|
def get_markdown(self):
|
||||||
return get_markdown(self.answer)
|
return get_markdown(self.answer)
|
||||||
|
|
||||||
|
|
||||||
class SavedSearch(models.Model):
|
class SavedSearch(models.Model):
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
from helpdesk.models import (
|
from helpdesk.models import (
|
||||||
Ticket,
|
Ticket,
|
||||||
Queue,
|
Queue
|
||||||
KBCategory,
|
|
||||||
KBItem,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
|
||||||
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
|
from helpdesk.models import (
|
||||||
|
KBCategory,
|
||||||
|
KBItem
|
||||||
|
)
|
||||||
|
|
||||||
def huser_from_request(req):
|
def huser_from_request(req):
|
||||||
return HelpdeskUser(req.user)
|
return HelpdeskUser(req.user)
|
||||||
@ -38,16 +41,18 @@ class HelpdeskUser:
|
|||||||
|
|
||||||
def get_allowed_kb_categories(self):
|
def get_allowed_kb_categories(self):
|
||||||
categories = []
|
categories = []
|
||||||
for cat in KBCategory.objects.all():
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
if self.can_access_kbcategory(cat):
|
for cat in KBCategory.objects.all():
|
||||||
categories.append(cat)
|
if self.can_access_kbcategory(cat):
|
||||||
|
categories.append(cat)
|
||||||
return categories
|
return categories
|
||||||
|
|
||||||
def get_assigned_kb_items(self):
|
def get_assigned_kb_items(self):
|
||||||
kbitems = []
|
kbitems = []
|
||||||
for item in KBItem.objects.all():
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
if item.get_team() and item.get_team().is_member(self.user):
|
for item in KBItem.objects.all():
|
||||||
kbitems.append(item)
|
if item.get_team() and item.get_team().is_member(self.user):
|
||||||
|
kbitems.append(item)
|
||||||
return kbitems
|
return kbitems
|
||||||
|
|
||||||
def get_tickets_in_queues(self):
|
def get_tickets_in_queues(self):
|
||||||
|
@ -1146,13 +1146,18 @@ def ticket_list(request):
|
|||||||
'<a href="http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching">'
|
'<a href="http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching">'
|
||||||
'Django Documentation on string matching in SQLite</a>.')
|
'Django Documentation on string matching in SQLite</a>.')
|
||||||
|
|
||||||
kbitem_choices = [(item.pk, str(item)) for item in KBItem.objects.all()]
|
kbitem_choices = []
|
||||||
|
kbitem = []
|
||||||
|
|
||||||
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
|
kbitem_choices = [(item.pk, str(item)) for item in KBItem.objects.all()]
|
||||||
|
kbitem = KBItem.objects.all()
|
||||||
|
|
||||||
return render(request, 'helpdesk/ticket_list.html', dict(
|
return render(request, 'helpdesk/ticket_list.html', dict(
|
||||||
context,
|
context,
|
||||||
default_tickets_per_page=request.user.usersettings_helpdesk.tickets_per_page,
|
default_tickets_per_page=request.user.usersettings_helpdesk.tickets_per_page,
|
||||||
user_choices=User.objects.filter(is_active=True, is_staff=True),
|
user_choices=User.objects.filter(is_active=True, is_staff=True),
|
||||||
kb_items=KBItem.objects.all(),
|
kb_items=kbitem,
|
||||||
queue_choices=huser.get_queues(),
|
queue_choices=huser.get_queues(),
|
||||||
status_choices=Ticket.STATUS_CHOICES,
|
status_choices=Ticket.STATUS_CHOICES,
|
||||||
kbitem_choices=kbitem_choices,
|
kbitem_choices=kbitem_choices,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user