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
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
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)
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"])
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)
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
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
def initialize_token(self): self.token = create_b64_id_token(self.id, "_", getattr(settings, "TOKEN_SIZE", 30))
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()