diff options
Diffstat (limited to 'ishtar_common/models_rest.py')
| -rw-r--r-- | ishtar_common/models_rest.py | 75 | 
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")  | 
