categories: reset associated object on removal (#55951)

This commit is contained in:
Frédéric Péters 2021-08-03 15:22:49 +02:00
parent be60b83352
commit 61b3de5c6f
2 changed files with 42 additions and 7 deletions

View File

@ -1,7 +1,8 @@
import pytest
from wcs.carddef import CardDef
from wcs.categories import CardDefCategory
from wcs.categories import CardDefCategory, Category
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
@ -127,6 +128,7 @@ def test_categories_with_carddefs(pub):
def test_categories_delete(pub):
create_superuser(pub)
CardDefCategory.wipe()
category = CardDefCategory(name='foobar')
category.store()
@ -140,6 +142,23 @@ def test_categories_delete(pub):
assert resp.location == 'http://example.net/backoffice/cards/categories/1/'
assert CardDefCategory.count() == 1
carddef = CardDef()
carddef.name = 'bar'
carddef.fields = []
carddef.category_id = category.id
carddef.store()
Category.wipe()
formdef_category = Category(name='blah')
formdef_category.id = category.id
formdef_category.store()
formdef = FormDef()
formdef.name = 'bar'
formdef.fields = []
formdef.category_id = formdef_category.id
formdef.store()
resp = app.get('/backoffice/cards/categories/1/')
resp = resp.click(href='delete')
resp = resp.forms[0].submit()
@ -147,6 +166,12 @@ def test_categories_delete(pub):
resp = resp.follow()
assert CardDefCategory.count() == 0
carddef.refresh_from_storage()
assert carddef.category_id is None
formdef.refresh_from_storage()
assert formdef.category_id == formdef_category.id
def test_categories_edit_description(pub):
CardDefCategory.wipe()

View File

@ -58,6 +58,12 @@ class Category(XmlStorableObject):
if changed:
self.store()
@classmethod
def get_object_class(cls):
from .formdef import FormDef
return FormDef
@classmethod
def get_by_urlname(cls, url_name):
objects = [x for x in cls.select() if x.url_name == url_name]
@ -91,12 +97,10 @@ class Category(XmlStorableObject):
categories.sort(key=lambda x: x.position if x and x.position is not None else 10000)
def remove_self(self):
from .formdef import FormDef
for form in FormDef.select(lambda x: x.category_id == self.id):
form.category_id = None
form.store()
StorableObject.remove_self(self)
for obj in self.get_object_class().select(lambda x: x.category_id == self.id):
obj.category_id = None
obj.store()
super().remove_self()
def get_substitution_variables(self, minimal=False):
d = {
@ -147,6 +151,12 @@ class CardDefCategory(Category):
('export_roles', 'roles'),
]
@classmethod
def get_object_class(cls):
from .carddef import CardDef
return CardDef
Substitutions.register('category_name', category=_('General'), comment=_('Category Name'))
Substitutions.register('category_description', category=_('General'), comment=_('Category Description'))