summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2024-11-13 18:00:27 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-02-19 14:45:55 +0100
commit4426024156e1bff42cbd37f0c0e273c369c3773f (patch)
tree63d6ca4291f84f923f321fd62228334e7a8a97b7
parente3ec535182570e006cf48b92e9f9fc48cbe6a59e (diff)
downloadIshtar-4426024156e1bff42cbd37f0c0e273c369c3773f.tar.bz2
Ishtar-4426024156e1bff42cbd37f0c0e273c369c3773f.zip
🗃️ database: add sheet filters
🗃️ database: add sheet filters
-rw-r--r--ishtar_common/migrations/0257_sheet_filters.py65
-rw-r--r--ishtar_common/models.py6
-rw-r--r--ishtar_common/models_common.py43
-rw-r--r--ishtar_common/models_rest.py4
4 files changed, 114 insertions, 4 deletions
diff --git a/ishtar_common/migrations/0257_sheet_filters.py b/ishtar_common/migrations/0257_sheet_filters.py
new file mode 100644
index 000000000..32ad007b0
--- /dev/null
+++ b/ishtar_common/migrations/0257_sheet_filters.py
@@ -0,0 +1,65 @@
+# Generated by Django 2.2.24 on 2024-11-13 17:59
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('contenttypes', '0002_remove_content_type_name'),
+ ('ishtar_common', '0256_clean_add_own_permissions'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='import',
+ options={'permissions': (('view_own_import', 'Can view own Import'), ('add_own_import', 'Can add own Import'), ('change_own_import', 'Can change own Import'), ('delete_own_import', 'Can delete own Import')), 'verbose_name': 'Import - Import', 'verbose_name_plural': 'Import - Imports'},
+ ),
+ migrations.AlterField(
+ model_name='permissionrequest',
+ name='include_upstream_items',
+ field=models.BooleanField(default=False, help_text='All items associated by upstream link math the request. For instance, match is done for all finds associated with own context records', verbose_name='Include upstream items'),
+ ),
+ migrations.CreateModel(
+ name='SheetFilter',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('key', models.CharField(max_length=200, verbose_name='Key')),
+ ('exclude_or_include', models.CharField(choices=[('E', 'exclude'), ('I', 'Include')], default='E', max_length=1, verbose_name='Exclude or include')),
+ ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='content_type_sheetfilter', to='contenttypes.ContentType')),
+ ],
+ options={
+ 'verbose_name': 'Sheet filter',
+ 'verbose_name_plural': 'Sheet filters',
+ },
+ ),
+ migrations.CreateModel(
+ name='FilteredSheet',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200, verbose_name='Name')),
+ ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='content_type_filteredsheet', to='contenttypes.ContentType')),
+ ('filters', models.ManyToManyField(blank=True, related_name='filtered_sheet', to='ishtar_common.SheetFilter', verbose_name='Filters')),
+ ],
+ options={
+ 'verbose_name': 'Filtered sheet',
+ 'verbose_name_plural': 'Filtered sheets',
+ },
+ ),
+ migrations.AddField(
+ model_name='profiletype',
+ name='filtered_sheets',
+ field=models.ManyToManyField(blank=True, related_name='profile_types', to='ishtar_common.FilteredSheet', verbose_name='Filtered sheets'),
+ ),
+ migrations.AlterField(
+ model_name='apisheetfilter',
+ name='key',
+ field=models.TextField(default='-', verbose_name='Key'),
+ ),
+ migrations.AlterField(
+ model_name='sheetfilter',
+ name='key',
+ field=models.TextField(default='-', verbose_name='Key'),
+ ),
+ ]
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index ab79f4baa..9579cdbd1 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -156,6 +156,7 @@ from ishtar_common.models_common import (
DocumentItem,
DynamicRequest,
document_attached_changed,
+ FilteredSheet,
FullSearch,
GeneralType,
GeoBufferType,
@@ -199,6 +200,7 @@ __all__ = [
"ImporterColumn",
"ImporterDuplicateField",
"Imported",
+ "FilteredSheet",
"PermissionRequest",
"Regexp",
"ImportTarget",
@@ -3443,6 +3445,10 @@ class ProfileType(GeneralType):
PermissionRequest, verbose_name=_("Permissions requests"), blank=True,
related_name="profile_types"
)
+ filtered_sheets = models.ManyToManyField(
+ FilteredSheet, verbose_name=_("Filtered sheets"), blank=True,
+ related_name="profile_types"
+ )
class Meta:
verbose_name = _("Profile type")
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py
index 9ad73f314..613c54fac 100644
--- a/ishtar_common/models_common.py
+++ b/ishtar_common/models_common.py
@@ -844,8 +844,8 @@ class TemplateItem:
return templates
-class SheetFilter(models.Model):
- key = models.CharField(_("Key"), max_length=200)
+class BaseSheetFilter(models.Model):
+ key = models.TextField(_("Key"), default="-")
class Meta:
abstract = True
@@ -873,6 +873,45 @@ class SheetFilter(models.Model):
return sorted(set(keys))
+class SheetFilter(BaseSheetFilter):
+ content_type = models.ForeignKey(
+ ContentType, related_name="content_type_sheetfilter", on_delete=models.CASCADE
+ )
+ exclude_or_include = models.CharField(
+ _("Exclude or include"),
+ default="E",
+ max_length=1,
+ choices=(("E", _("exclude")), ("I", _("Include")))
+ )
+
+ class Meta:
+ verbose_name = _("Sheet filter")
+ verbose_name_plural = _("Sheet filters")
+ ADMIN_SECTION = _("Account")
+
+ def get_template(self):
+ ct = self.content_type
+ model = apps.get_model(ct.app_label, ct.model)
+ tpl = loader.get_template(f"ishtar/sheet_{model.SLUG}.html")
+ return tpl.template.origin.name
+
+
+class FilteredSheet(models.Model):
+ name = models.CharField(_("Name"), max_length=200)
+ content_type = models.ForeignKey(
+ ContentType, related_name="content_type_filteredsheet", on_delete=models.CASCADE
+ )
+ filters = models.ManyToManyField(
+ SheetFilter, blank=True, verbose_name=_("Filters"),
+ related_name="filtered_sheet"
+ )
+
+ class Meta:
+ verbose_name = _("Filtered sheet")
+ verbose_name_plural = _("Filtered sheets")
+ ADMIN_SECTION = _("Account")
+
+
class FullSearch(models.Model):
search_vector = SearchVectorField(
_("Search vector"), blank=True, null=True, help_text=_("Auto filled at save")
diff --git a/ishtar_common/models_rest.py b/ishtar_common/models_rest.py
index c47b04168..8f6f8d40c 100644
--- a/ishtar_common/models_rest.py
+++ b/ishtar_common/models_rest.py
@@ -13,7 +13,7 @@ from django.utils.text import slugify
from django.apps import apps
from django.template import loader
-from ishtar_common.models_common import SheetFilter
+from ishtar_common.models_common import BaseSheetFilter
from ishtar_common.utils import ugettext_lazy as _
UnoCalc = None
@@ -68,7 +68,7 @@ class ApiSearchModel(models.Model):
return f"{self.user} - {self.content_type}"
-class ApiSheetFilter(SheetFilter):
+class ApiSheetFilter(BaseSheetFilter):
api_search_model = models.ForeignKey(ApiSearchModel, on_delete=models.CASCADE,
related_name="sheet_filters")