Beispiel #1
0
 def update_or_create(self, defaults=None, **kwargs):
     ret = self.get_queryset().update_or_create(
         defaults=self._update_args(defaults, kwargs), **kwargs
     )
     if not ret[0].token:
         ret[0].token = create_b64_id_token(ret[0].id, "_")
         ret[0].save(update_fields=["token"])
     return ret
Beispiel #2
0
 def create(self, **kwargs):
     ret = self.get_queryset().create(
         **self._update_args(kwargs, None)
     )
     if not ret.token:
         ret.token = create_b64_id_token(ret.id, "_")
         ret.save(update_fields=["token"])
     return ret
Beispiel #3
0
 def test_token_generation(self):
     for i in range(0, 100):
         i2 = create_b64_id_token(i, "_")
         try:
             i2.encode("ascii")
         except UnicodeEncodeError:
             self.assertTrue(False)
         self.assertIsInstance(i2, str)
         self.assertNotIn("–", i2)
         self.assertNotIn("\\", i2)
Beispiel #4
0
 def _save_m2m(self):
     super()._save_m2m()
     self._save_protections()
     if self.cleaned_data["new_static_token"] != "":
         if self.instance.token:
             print("Old nonce for Component id:", self.instance.id, "is",
                   self.instance.token)
         self.instance.token = create_b64_id_token(
             self.instance.id, "_",
             int(self.cleaned_data["new_static_token"]))
         self.instance.save(update_fields=["token"])
Beispiel #5
0
 def _save_m2m(self):
     super()._save_m2m()
     self.update_anchor()
     update_fields = set()
     if not self.instance.name:
         update_fields.add("name")
     if self.instance.token_generate_new_size is not None:
         if self.instance.token:
             print("Old nonce for Content id:", self.instance.id, "is",
                   self.instance.token)
         self.instance.token = create_b64_id_token(
             self.instance.id, "_", self.instance.token_generate_new_size)
         self.instance.token_generate_new_size = None
         update_fields.add("token")
     if update_fields:
         self.instance.save(update_fields=update_fields)
Beispiel #6
0
 def update_or_create(self, **kwargs):
     ret = self.get_queryset().update_or_create(**kwargs)
     if not ret[0].token:
         ret[0].token = create_b64_id_token(ret[0].id, "_")
         ret[0].save(update_fields=["token"])
     return ret
Beispiel #7
0
    def save(self, *args, **kwargs):
        if settings.DEBUG:
            assert self._content_is_cleaned, "try to save uncleaned content"
        created = not self.pk
        if created:
            # create the model for saving BaseContent
            assignedcontent = self.associated
            assignedcontent.save()
            # this changes the associated model for no reason
            super().save(*args, **kwargs)
            # restore it here
            self.associated = assignedcontent
            # add requires this
            self.update_associated()
        if not self.associated.token:
            if self.force_token_size:
                self.associated.token_generate_new_size = \
                    self.force_token_size
            else:
                self.associated.token_generate_new_size = \
                    getattr(settings, "INITIAL_STATIC_TOKEN_SIZE", 30)
        # set token
        if self.associated.token_generate_new_size is not None:
            if self.associated.token:
                print(
                    "Old nonce for Content id:", self.associated_id,
                    "is", self.associated.token
                )
            self.associated.token = create_b64_id_token(
                self.associated_id,
                "_",
                self.associated.token_generate_new_size
            )
            self.associated.token_generate_new_size = None
        # save associated
        try:
            self.associated.save()
        except IntegrityError as exc:
            # delete if unique constraint was violated while creating object
            if created:
                self.associated.delete()
            raise exc
        # after checking uniqueness, update
        if not created:
            super().save(*args, **kwargs)

        if self.prepared_attachements:
            for key, val in self.prepared_attachements.items():
                if not hasattr(val, "__iter__"):
                    val = [val]
                pks = set()
                for i in val:
                    i.save()
                    pks.add(i.pk)
                # remove rest (if foreignkey)
                fieldmanager = getattr(self.associated, key)
                field = self.associated._meta.get_field(key)
                if field.many_to_many:
                    fieldmanager.set(val)
                elif field.one_to_many:
                    fieldmanager.exclude(pk__in=pks).delete()
        # needs id first
        self.associated.references.set(self.get_references())
        # message usercomponent about change
        if self.get_propagate_modified():
            self.associated.usercomponent.save(update_fields=["modified"])
        # delete saved errors
        self.associated_errors = None
        # require cleaning again
        self._content_is_cleaned = False
        # reset to default
        self.prepared_attachements = None
Beispiel #8
0
 def initialize_token(self):
     self.token = create_b64_id_token(self.id, "_",
                                      getattr(settings, "TOKEN_SIZE", 30))
Beispiel #9
0
def UpdateSpiderCb(**_kwargs):
    # provided apps argument lacks model function support
    # so use default
    registry.contents.initialize()
    registry.protections.initialize()

    # regenerate info field
    AssignedContent = apps.get_model("spider_base", "AssignedContent")
    UserComponent = apps.get_model("spider_base", "UserComponent")
    ContentVariant = apps.get_model("spider_base", "ContentVariant")
    UserInfo = apps.get_model("spider_base", "UserInfo")

    UserComponent.objects.filter(name="index").update(strength=10)
    for row in AssignedContent.objects.all():
        try:
            row.content
        except ObjectDoesNotExist:
            logging.warning("AssignedContent \"%s\" lacks content, remove.",
                            row)
            row.delete()
            continue
        # works only with django.apps.apps
        row.info = row.content.get_info()
        if not row.token:
            row.token = create_b64_id_token(row.id, "_")
        if not row.content.expose_name or not row.name:
            row.name = row.content.get_content_name()
        if not row.content.expose_description:
            row.description = row.content.get_content_description()
        assert row.description is not None
        assert row.name is not None
        # triggers UpdateContentCb and FeaturesCb
        row.save(update_fields=['name', 'description', 'info', "token"])
        # regenerate references
        row.references.set(row.content.get_references())

    for row in UserComponent.objects.all():
        if not row.token:
            row.token = create_b64_id_token(row.id, "_")
            row.save(update_fields=["token"])
        extra_variants = ContentVariant.objects.filter(
            models.Q(ctype__contains=VariantType.component_feature)
            & models.Q(ctype__contains=VariantType.feature_connect),
            assignedcontent__usercomponent=row)
        # triggers FeaturesCb so don't check features again
        row.features.add(*extra_variants)

    # force add default actions, special ignored by FeaturesCb
    default_actions = ContentVariant.objects.get(name="DefaultActions")
    default_actions.feature_for_components.add(*UserComponent.objects.exclude(
        features__name="DefaultActions"))
    default_actions.feature_for_contents.add(*AssignedContent.objects.exclude(
        features__name="DefaultActions"))

    for row in get_user_model().objects.filter(spider_info__isnull=True):
        UserInfo.objects.create(user=row)
        logger.warning("UserInfo had to be generated for %s", row)

    for row in get_user_model().objects.prefetch_related(
            "spider_info", "usercomponent_set",
            "usercomponent_set__contents").all():
        with transaction.atomic():
            row.spider_info.calculate_allowed_content()
            row.spider_info.calculate_used_space()
            row.spider_info.save()