summaryrefslogtreecommitdiff
path: root/ishtar_common/models_rest.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models_rest.py')
-rw-r--r--ishtar_common/models_rest.py75
1 files changed, 50 insertions, 25 deletions
diff --git a/ishtar_common/models_rest.py b/ishtar_common/models_rest.py
index a74df2c8a..566a73127 100644
--- a/ishtar_common/models_rest.py
+++ b/ishtar_common/models_rest.py
@@ -6,9 +6,7 @@ from django.contrib.postgres.fields import ArrayField
from ishtar_common.utils import ugettext_lazy as _
-MAIN_CONTENT_TYPES = (
- ("archaeological_operations", "operation"),
-)
+MAIN_CONTENT_TYPES = (("archaeological_operations", "operation"),)
class ApiUser(models.Model):
@@ -29,8 +27,10 @@ class ApiSearchModel(models.Model):
user = models.ForeignKey(ApiUser, on_delete=models.CASCADE)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
limit_query = models.TextField(
- verbose_name=_("Limit query"), blank=True, null=True,
- help_text=_("Search query add to each request")
+ verbose_name=_("Limit query"),
+ blank=True,
+ null=True,
+ help_text=_("Search query add to each request"),
)
class Meta:
@@ -55,7 +55,6 @@ class ApiExternalSource(models.Model):
"search_model do not exist": [],
"type do not exist": [],
}
- updated = []
for search_model in content:
app, model_name = search_model.split(".")
try:
@@ -66,17 +65,22 @@ class ApiExternalSource(models.Model):
for ct_type, keys, values in content[search_model]:
tapp, tmodel_name = ct_type.split(".")
try:
- ct_type = ContentType.objects.get(
- app_label=tapp, model=tmodel_name
- )
+ ct_type = ContentType.objects.get(app_label=tapp, model=tmodel_name)
except ContentType.DoesNotExist:
- result["type do not exist"].append(search_model)
+ result["type do not exist"].append(ct_type)
continue
t_model = ct_type.model_class()
+ current_matches = []
for slug, label in values:
+ current_matches.append(slug)
m, created = ApiKeyMatch.objects.get_or_create(
- source=self, search_model=ct, search_keys=keys,
- distant_slug=slug, defaults={"distant_label": label})
+ source=self,
+ search_model=ct,
+ associated_type=ct_type,
+ search_keys=keys,
+ distant_slug=slug,
+ defaults={"distant_label": label},
+ )
updated = False
if not created and m.distant_label != label:
updated = True
@@ -97,25 +101,46 @@ class ApiExternalSource(models.Model):
result["updated"] += 1
if created:
result["created"] += 1
+ # delete removed keys
+ q = ApiKeyMatch.objects.filter(
+ source=self, search_model=ct, associated_type=ct_type,
+ ).exclude(distant_slug__in=current_matches)
+ result["deleted"] += q.count()
+ q.delete()
return result
+ def generate_match_csv(self):
+ pass
+
class ApiKeyMatch(models.Model):
source = models.ForeignKey(ApiExternalSource, on_delete=models.CASCADE)
- search_model = models.ForeignKey(ContentType, on_delete=models.CASCADE,
- verbose_name=_("Search model"))
- search_keys = ArrayField(models.CharField(max_length=200),
- verbose_name=_("Search keys"), blank=True)
- distant_slug = models.SlugField(verbose_name=_("Distant key"), max_length=200,
- allow_unicode=True)
- distant_label = models.TextField(verbose_name=_("Distant value"), blank=True,
- default="")
- local_slug = models.SlugField(verbose_name=_("Local key"), max_length=200,
- allow_unicode=True)
- local_label = models.TextField(verbose_name=_("Local value"), blank=True,
- default="")
+ search_model = models.ForeignKey(
+ ContentType, on_delete=models.CASCADE, verbose_name=_("Search model"),
+ related_name="key_match_search_models"
+ )
+ associated_type = models.ForeignKey(
+ ContentType, on_delete=models.CASCADE, verbose_name=_("Associated type"),
+ related_name="key_match_types"
+ )
+ search_keys = ArrayField(
+ models.CharField(max_length=200), verbose_name=_("Search keys"), blank=True
+ )
+ distant_slug = models.SlugField(
+ verbose_name=_("Distant key"), max_length=200, allow_unicode=True
+ )
+ distant_label = models.TextField(
+ verbose_name=_("Distant value"), blank=True, default=""
+ )
+ local_slug = models.SlugField(
+ verbose_name=_("Local key"), max_length=200, allow_unicode=True
+ )
+ local_label = models.TextField(
+ verbose_name=_("Local value"), blank=True, default=""
+ )
do_not_match = models.BooleanField(
- verbose_name=_("Disable match for this search"), default=False)
+ verbose_name=_("Disable match for this search"), default=False
+ )
class Meta:
verbose_name = _("API - Key match")