diff --git a/helpdesk/admin.py b/helpdesk/admin.py index 5530aa51..9d18007e 100644 --- a/helpdesk/admin.py +++ b/helpdesk/admin.py @@ -70,7 +70,7 @@ class FollowUpAdmin(admin.ModelAdmin): @admin.register(KBItem) class KBItemAdmin(admin.ModelAdmin): - list_display = ('category', 'title', 'last_updated', 'team', ) + list_display = ('category', 'title', 'last_updated', 'team', 'order', 'enabled') inlines = [KBIAttachmentInline] readonly_fields = ('voted_by', 'downvoted_by') @@ -93,6 +93,10 @@ class IgnoreEmailAdmin(admin.ModelAdmin): list_display = ('name', 'queue_list', 'email_address', 'keep_in_mailbox') +@admin.register(KBCategory) +class KBCategoryAdmin(admin.ModelAdmin): + list_display = ('name', 'title', 'slug', 'public') + + admin.site.register(PreSetReply) admin.site.register(EscalationExclusion) -admin.site.register(KBCategory) diff --git a/helpdesk/forms.py b/helpdesk/forms.py index 74002389..09c3e5bf 100644 --- a/helpdesk/forms.py +++ b/helpdesk/forms.py @@ -183,8 +183,8 @@ class AbstractTicketForm(CustomFieldMixin, forms.Form): self.fields['kbitem'] = forms.ChoiceField( widget=forms.Select(attrs={'class': 'form-control'}), required=False, - label=_('Knowedge Base Item'), - choices=[(kbi.pk, kbi.title) for kbi in KBItem.objects.filter(category=kbcategory.pk)], + label=_('Knowledge Base Item'), + choices=[(kbi.pk, kbi.title) for kbi in KBItem.objects.filter(category=kbcategory.pk, enabled=True)], ) def _add_form_custom_fields(self, staff_only_filter=None): diff --git a/helpdesk/migrations/0030_add_kbcategory_name.py b/helpdesk/migrations/0030_add_kbcategory_name.py new file mode 100644 index 00000000..908fdf17 --- /dev/null +++ b/helpdesk/migrations/0030_add_kbcategory_name.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.10 on 2020-02-25 11:21 + +from django.db import migrations, models + +def copy_title(apps, schema_editor): + KBCategory = apps.get_model("helpdesk", "KBCategory") + KBCategory.objects.update(name=models.F('title')) + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0029_kbcategory_public'), + ] + + operations = [ + migrations.AddField( + model_name='kbcategory', + name='name', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Name of the category'), + ), + migrations.AlterField( + model_name='kbcategory', + name='title', + field=models.CharField(max_length=100, verbose_name='Title on knowledgebase page'), + ), + migrations.RunPython(copy_title, migrations.RunPython.noop), + migrations.AlterField( + model_name='kbcategory', + name='name', + field=models.CharField(blank=False, max_length=100, null=False, verbose_name='Name of the category'), + ), + ] diff --git a/helpdesk/migrations/0031_auto_20200225_1440.py b/helpdesk/migrations/0031_auto_20200225_1440.py new file mode 100644 index 00000000..c287f06f --- /dev/null +++ b/helpdesk/migrations/0031_auto_20200225_1440.py @@ -0,0 +1,22 @@ +# Generated by Django 2.2.10 on 2020-02-25 13:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0030_add_kbcategory_name'), + ] + + operations = [ + migrations.AlterModelOptions( + name='kbitem', + options={'ordering': ('order', 'title'), 'verbose_name': 'Knowledge base item', 'verbose_name_plural': 'Knowledge base items'}, + ), + migrations.AddField( + model_name='kbitem', + name='order', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Order'), + ), + ] diff --git a/helpdesk/migrations/0032_kbitem_enabled.py b/helpdesk/migrations/0032_kbitem_enabled.py new file mode 100644 index 00000000..7868bfe1 --- /dev/null +++ b/helpdesk/migrations/0032_kbitem_enabled.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.10 on 2020-02-25 13:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0031_auto_20200225_1440'), + ] + + operations = [ + migrations.AddField( + model_name='kbitem', + name='enabled', + field=models.BooleanField(default=True, verbose_name='Enabled to display to users'), + ), + ] diff --git a/helpdesk/models.py b/helpdesk/models.py index a36c5a78..7e4b61c5 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -1215,8 +1215,13 @@ class KBCategory(models.Model): listing of questions & answers. """ + name = models.CharField( + _('Name of the category'), + max_length=100, + ) + title = models.CharField( - _('Title'), + _('Title on knowledgebase page'), max_length=100, ) @@ -1242,7 +1247,7 @@ class KBCategory(models.Model): ) def __str__(self): - return '%s' % self.title + return '%s' % self.name class Meta: ordering = ('title',) @@ -1312,6 +1317,17 @@ class KBItem(models.Model): null=True, ) + order = models.PositiveIntegerField( + _('Order'), + blank=True, + null=True, + ) + + enabled = models.BooleanField( + _('Enabled to display to users'), + default=True, + ) + def save(self, *args, **kwargs): if not self.last_updated: self.last_updated = timezone.now() @@ -1328,7 +1344,7 @@ class KBItem(models.Model): return '%s: %s' % (self.category.title, self.title) class Meta: - ordering = ('title',) + ordering = ('order', 'title',) verbose_name = _('Knowledge base item') verbose_name_plural = _('Knowledge base items') diff --git a/helpdesk/static/helpdesk/css/sb-admin.css b/helpdesk/static/helpdesk/css/sb-admin.css index f015c714..cad0a66e 100644 --- a/helpdesk/static/helpdesk/css/sb-admin.css +++ b/helpdesk/static/helpdesk/css/sb-admin.css @@ -242,6 +242,10 @@ body.fixed-nav.sidebar-toggled #content-wrapper { overflow-y: auto; } +.card-text { + font-weight: bold; +} + .card-body-icon { position: absolute; z-index: 0; diff --git a/helpdesk/templates/helpdesk/base_js.html b/helpdesk/templates/helpdesk/base_js.html index b337fd36..d7bcdecc 100644 --- a/helpdesk/templates/helpdesk/base_js.html +++ b/helpdesk/templates/helpdesk/base_js.html @@ -27,3 +27,6 @@ + +{% block js_bottom %} +{% endblock %} diff --git a/helpdesk/templates/helpdesk/kb_category_base.html b/helpdesk/templates/helpdesk/kb_category_base.html index 5b449b7f..8eb8dd20 100644 --- a/helpdesk/templates/helpdesk/kb_category_base.html +++ b/helpdesk/templates/helpdesk/kb_category_base.html @@ -1,35 +1,42 @@ {% load i18n %} -

{% trans 'Knowledgebase Category' %}:{% blocktrans with category.title as kbcat %}{{ kbcat }}{% endblocktrans %}

-

{{ category.description }}

+{% block header %} +

{% blocktrans with category.title as kbcat %}{{ kbcat }}{% endblocktrans %}

+{{ category.description|linebreaks }} +{% endblock %} + +{% block item_list %}
{% for item in items %}
- -
+
+
+ {% block card_body %}

{{ item.question }}

-

{{ item.get_markdown }}

+
+ {{ item.get_markdown }} +
@@ -39,12 +46,18 @@
+ {% endblock %}
{% endfor %}
+{% endblock %} +{% block footer %} +{% endblock %} {% if category.queue %} - + {% block submit_button %} +
{% trans 'Contact a human' %}
+ {% endblock %}
{% endif %} diff --git a/helpdesk/templates/helpdesk/kb_category_iframe.html b/helpdesk/templates/helpdesk/kb_category_iframe.html index ee57022e..6a64940a 100644 --- a/helpdesk/templates/helpdesk/kb_category_iframe.html +++ b/helpdesk/templates/helpdesk/kb_category_iframe.html @@ -1,5 +1,6 @@ {% load i18n %} {% load saved_queries %} + {% include 'helpdesk/base-head.html' %} {% block helpdesk_head %}{% endblock %} diff --git a/helpdesk/templates/helpdesk/public_create_ticket_base.html b/helpdesk/templates/helpdesk/public_create_ticket_base.html index 82cf375b..45325642 100644 --- a/helpdesk/templates/helpdesk/public_create_ticket_base.html +++ b/helpdesk/templates/helpdesk/public_create_ticket_base.html @@ -3,7 +3,9 @@ {% with request|load_helpdesk_settings as helpdesk_settings %} {% if helpdesk_settings.HELPDESK_SUBMIT_A_TICKET_PUBLIC %} +{% block form_header %}

{% trans "Unless otherwise stated, all fields are required." %} {% trans "Please provide as descriptive a title and description as possible." %}

+{% endblock %}
{{ form|bootstrap4form }} diff --git a/helpdesk/templates/helpdesk/public_create_ticket_iframe.html b/helpdesk/templates/helpdesk/public_create_ticket_iframe.html index a20f0722..3b1fe30b 100644 --- a/helpdesk/templates/helpdesk/public_create_ticket_iframe.html +++ b/helpdesk/templates/helpdesk/public_create_ticket_iframe.html @@ -1,5 +1,6 @@ {% load i18n %} {% load saved_queries %} + {% include 'helpdesk/base-head.html' %} diff --git a/helpdesk/views/kb.py b/helpdesk/views/kb.py index a1bead71..55b3424d 100644 --- a/helpdesk/views/kb.py +++ b/helpdesk/views/kb.py @@ -30,7 +30,7 @@ def category(request, slug, iframe=False): 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.filter(enabled=True) selected_item = request.GET.get('kbitem', None) try: selected_item = int(selected_item)