fix(kb): no db

This commit is contained in:
Daniele Scasciafratte 2022-03-18 19:33:31 +01:00
parent 347a70e497
commit 7a3260a163
3 changed files with 151 additions and 141 deletions

View File

@ -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):

View File

@ -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):

View File

@ -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,