Skip to content
This repository has been archived by the owner on Sep 29, 2023. It is now read-only.

Exception raised in several bones when working with sub-skeletons #110

Closed
phorward opened this issue Nov 21, 2018 · 1 comment · Fixed by #111
Closed

Exception raised in several bones when working with sub-skeletons #110

phorward opened this issue Nov 21, 2018 · 1 comment · Fixed by #111
Projects
Milestone

Comments

@phorward
Copy link
Member

I have a skeleton with subSkels:

class optionSkel(skeleton.Skeleton):

	subSkels = {
		"*": [
			"kind",
			"kind_code",
			"code",
			"creationdate",
			"changedate"
		],
		"height": [
		],
		"color": [
			"name",
			"image"
		]
	}

	kind = selectBone(
		descr=u"Art",
		indexed=True,
		visible=False,
		readOnly=True,
		required=True,
		values=["height", "color"]
	)

	kind_code = stringBone(
		descr=u"Zusammengesetzter Code",
		visible=False,
		required=True,
		unique=True,
		indexed=True
	)

	code = codeBone(
		descr=u"Code",
		invalidChars="*", #The star "*" means "empty/unset" in the resulting variant_id.
		required=True,
		indexed=True
	)

	name = stringBone(
		descr=u"Bezeichnung",
		required=True,
		searchable=True,
		indexed=True
	)

	image = fileBone(
		descr=u"Bild"
	)

Now I got an skeleton instance using

skel = optionSkel.subSkel("height")
skel.fromDB(...)
skel["name"] = "Bla"
skel.toDB()

and it fails with this error:

Traceback (most recent call last):
  File "/home/neo/MyProject/deploy/server/tasks.py", line 147, in deferred
    caller(*args, **kwargs)
  File "/home/neo/MyProject/deploy/server/tasks.py", line 316, in <lambda>
    return( lambda *args, **kwargs: mkDefered( func, *args, **kwargs) )
  File "/home/neo/MyProject/deploy/server/tasks.py", line 278, in mkDefered
    return func(self, *args, **kwargs)
  File "/home/neo/MyProject/deploy/prototypes/importable.py", line 272, in doPrepareImportdate
    assert skel.toDB(clearUpdateTag=True)
  File "/home/neo/MyProject/deploy/skeletons/option.py", line 165, in toDB
    return super(optionSkel, self).toDB(*args, **kwargs)
  File "/home/neo/MyProject/deploy/server/skeleton.py", line 729, in toDB
    txnUpdate, key, self, clearUpdateTag)
  File "/home/neo/bin/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore.py", line 2635, in RunInTransactionOptions
    function, *args, **kwargs)
  File "/home/neo/bin/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore.py", line 2710, in _RunInTransactionInternal
    ok, result = _DoOneTry(function, args, kwargs)
  File "/home/neo/bin/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore.py", line 2748, in _DoOneTry
    result = function(*args, **kwargs)
  File "/home/neo/MyProject/deploy/server/skeleton.py", line 602, in txnUpdate
    blobList.update(_bone.getReferencedBlobs(self.valuesCache, key))
  File "/home/neo/MyProject/deploy/server/bones/fileBone.py", line 19, in getReferencedBlobs
    if valuesCache[name] is None:
KeyError: 'image'

In my opinion, the loops at line 592 in server/skeleton.py reading

## Merge the values from mergeFrom in
for key, bone in skel.items():
	if key in mergeFrom:
		bone.mergeFrom(skel.valuesCache, key, mergeFrom)
for key, _bone in skel.items():
	dbObj = _bone.serialize(skel.valuesCache, key, dbObj)
	blobList.update(_bone.getReferencedBlobs(self.valuesCache, key))

should be merged into one loop and changed into this:

# Merge the values from mergeFrom in
for key, bone in skel.items():
	if key in mergeFrom:
		bone.mergeFrom(skel.valuesCache, key, mergeFrom)

	if key in self.valuesCache:
		dbObj = bone.serialize(skel.valuesCache, key, dbObj)
		blobList.update(bone.getReferencedBlobs(self.valuesCache, key))

Am I right?

@phorward
Copy link
Member Author

phorward commented Nov 21, 2018

Hi! After fixing this issue with the above change, I came around a similar problem which now happens in case the name bone is not available:

ERROR    2018-11-21 17:39:00,453 tasks.py:151] 'name'
Traceback (most recent call last):
  File "/home/neo/MyProject/deploy/server/tasks.py", line 147, in deferred
    caller(*args, **kwargs)
  File "/home/neo/MyProject/deploy/server/tasks.py", line 316, in <lambda>
    return( lambda *args, **kwargs: mkDefered( func, *args, **kwargs) )
  File "/home/neo/MyProject/deploy/server/tasks.py", line 278, in mkDefered
    return func(self, *args, **kwargs)
  File "/home/neo/MyProject/deploy/prototypes/importable.py", line 272, in doPrepareImportdate
    assert skel.toDB(clearUpdateTag=True)
  File "/home/neo/MyProject/deploy/skeletons/option.py", line 165, in toDB
    return super(optionSkel, self).toDB(*args, **kwargs)
  File "/home/neo/MyProject/deploy/server/skeleton.py", line 726, in toDB
    txnUpdate, key, self, clearUpdateTag)
  File "/home/neo/bin/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore.py", line 2635, in RunInTransactionOptions
    function, *args, **kwargs)
  File "/home/neo/bin/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore.py", line 2710, in _RunInTransactionInternal
    ok, result = _DoOneTry(function, args, kwargs)
  File "/home/neo/bin/google-cloud-sdk/platform/google_appengine/google/appengine/api/datastore.py", line 2748, in _DoOneTry
    result = function(*args, **kwargs)
  File "/home/neo/MyProject/deploy/server/skeleton.py", line 642, in txnUpdate
    tags += [tag for tag in _bone.getSearchTags(self.valuesCache, key) if
  File "/home/neo/MyProject/deploy/server/bones/stringBone.py", line 322, in getSearchTags
    if not valuesCache[name]:
KeyError: 'name'

Generally, I would advise to entirely refactor the skeleton.Skeleton.toDB() function to do more things that belong together in ONE SINGLE loop rather than in many different loops. It is confusing and gives a feeling of working with something which is heavily patched.

@sveneberth sveneberth added this to ToDo in ViUR 2.4.0 Feb 27, 2019
@sveneberth sveneberth added v2.5 and removed v2.4 labels May 17, 2019
@sveneberth sveneberth added this to To do in ViUR 2.5.0 via automation May 17, 2019
@sveneberth sveneberth removed this from ToDo in ViUR 2.4.0 May 17, 2019
@sveneberth sveneberth added this to the v2.5.0 milestone May 17, 2019
ViUR 2.5.0 automation moved this from To do to Done Jun 10, 2020
@sveneberth sveneberth linked a pull request Jun 10, 2020 that will close this issue
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
No open projects
ViUR 2.5.0
  
Done
Development

Successfully merging a pull request may close this issue.

3 participants