from django.db import models from django.utils.translation import gettext_lazy as _ from ckeditor.fields import RichTextField from aleksis.core.mixins import ExtensibleModel, GlobalPermissionModel from aleksis.core.util.model_helpers import ICONS class HjelpGlobalPermissions(GlobalPermissionModel): class Meta: managed = False permissions = ( ("view_faq", _("Can view FAQ")), ("ask_faq", _("Can ask FAQ question")), ("report_issue", _("Can report issues")), ("send_feedback", _("Can send feedback")), ) class FAQSection(ExtensibleModel): name = models.CharField(max_length=255, verbose_name=_("Name")) icon = models.CharField( max_length=50, blank=True, default="question_answer", choices=ICONS, verbose_name=_("Icon"), ) show = models.BooleanField(verbose_name=_("Show"), default=False) position = models.PositiveIntegerField(verbose_name=_("Order"), default=1, blank=True) def __str__(self): return self.name class Meta: verbose_name = _("FAQ section") verbose_name_plural = _("FAQ sections") ordering = ["position"] constraints = [ models.UniqueConstraint(fields=["site_id", "name"], name="unique_section_name_per_site") ] @property def visible_questions(self): return self.questions.filter(show=True) class FAQQuestion(ExtensibleModel): question_text = models.TextField(verbose_name=_("Question")) icon = models.CharField( max_length=50, blank=True, default="question_answer", choices=ICONS, verbose_name=_("Icon"), ) show = models.BooleanField(verbose_name=_("Show"), default=False) answer_text = RichTextField(verbose_name=_("Answer")) section = models.ForeignKey( FAQSection, on_delete=models.CASCADE, blank=True, related_name="questions", verbose_name=_("FAQ Section"), ) def __str__(self): return self.question_text class Meta: verbose_name = _("FAQ question") verbose_name_plural = _("FAQ questions") class IssueCategory(ExtensibleModel): name = models.CharField(max_length=255, verbose_name=_("Name")) icon = models.CharField( max_length=50, blank=True, default="bug_report", choices=ICONS, verbose_name=_("Icon"), ) parent = models.ForeignKey( "self", related_name="children", on_delete=models.CASCADE, blank=True, null=True, verbose_name=_("Parent category"), ) free_text = models.BooleanField(verbose_name=_("Free text input allowed"), default=False) placeholder = models.CharField(max_length=255, verbose_name=_("Placeholder"), blank=True) def __str__(self): return self.name def save(self, *args, **kwargs): if self.free_text and self.children.exists(): IssueCategory.objects.filter(parent=self).delete() super(IssueCategory, self).save(*args, **kwargs) class Meta: verbose_name = _("Issue category") verbose_name_plural = _("Issue categories") constraints = [ models.UniqueConstraint( fields=["site_id", "name"], condition=models.Q(parent=None), name="unique_category_name_per_site_without_parent", ), models.UniqueConstraint( fields=["site_id", "name", "parent"], name="unique_category_name_per_site_with_parent", ), ]