backoffice: add warning if total number of data fields is too large (#88452)
gitea/wcs/pipeline/head This commit looks good
Details
gitea/wcs/pipeline/head This commit looks good
Details
This commit is contained in:
parent
51ccebebc0
commit
8b6d9d658e
|
@ -3699,6 +3699,35 @@ def test_form_edit_field_warnings(pub):
|
|||
assert not resp.pyquery('aside .errornotice')
|
||||
assert resp.pyquery('aside form[action=new]')
|
||||
|
||||
BlockDef.wipe()
|
||||
block = BlockDef()
|
||||
block.name = 'foobar'
|
||||
block.fields = [
|
||||
fields.StringField(id='123', required=True, label='Test'),
|
||||
fields.StringField(id='234', required=True, label='Test2'),
|
||||
fields.CommentField(id='345', label='comment'),
|
||||
]
|
||||
block.store()
|
||||
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
formdef.name = 'form title'
|
||||
formdef.fields = [
|
||||
fields.StringField(id='1', label='Test'),
|
||||
fields.BlockField(id='2', label='Block field', block_slug='foobar'),
|
||||
]
|
||||
formdef.store()
|
||||
resp = app.get('/backoffice/forms/%s/fields/' % formdef.id)
|
||||
assert not resp.pyquery('.warningnotice')
|
||||
formdef.fields[1].default_items_count = 1100
|
||||
formdef.store()
|
||||
resp = app.get('/backoffice/forms/%s/fields/' % formdef.id)
|
||||
assert (
|
||||
resp.pyquery('.warningnotice')
|
||||
.text()
|
||||
.startswith('There are at least 2201 data fields, including fields in blocks.')
|
||||
)
|
||||
|
||||
FormDef.wipe()
|
||||
|
||||
|
||||
|
|
|
@ -387,6 +387,18 @@ class FieldsDirectory(Directory):
|
|||
r += htmltext(' ')
|
||||
r += htmltext(_('It is close to the system limits and no new fields should be added.'))
|
||||
r += htmltext('</div>')
|
||||
elif (
|
||||
hasattr(self.objectdef, 'get_total_count_data_fields')
|
||||
and self.objectdef.get_total_count_data_fields() > 2000
|
||||
):
|
||||
# warn before DATA_UPLOAD_MAX_NUMBER_FIELDS
|
||||
r += htmltext('<div class="warningnotice">')
|
||||
r += htmltext('<p>%s %s</p>') % (
|
||||
_('There are at least %d data fields, including fields in blocks.')
|
||||
% self.objectdef.get_total_count_data_fields(),
|
||||
_('It is close to the system limits and no new fields should be added.'),
|
||||
)
|
||||
r += htmltext('</div>')
|
||||
|
||||
if [x for x in self.objectdef.fields if x.key == 'page']:
|
||||
if self.objectdef.fields[0].key != 'page':
|
||||
|
|
|
@ -576,6 +576,20 @@ class FormDef(StorableObject):
|
|||
def get_all_fields(self):
|
||||
return (self.fields or []) + self.workflow.get_backoffice_fields()
|
||||
|
||||
def get_total_count_data_fields(self):
|
||||
count = len([x for x in self.fields or [] if not x.is_no_data_field and not x.key == 'block'])
|
||||
for field in self.fields or []:
|
||||
if not field.key == 'block':
|
||||
continue
|
||||
try:
|
||||
count += (
|
||||
len([x for x in field.block.fields or [] if not x.is_no_data_field])
|
||||
* field.default_items_count
|
||||
)
|
||||
except KeyError:
|
||||
continue
|
||||
return count
|
||||
|
||||
def iter_fields(self, include_block_fields=False, with_backoffice_fields=True, with_no_data_fields=True):
|
||||
def _iter_fields(fields, block_field=None):
|
||||
for field in fields:
|
||||
|
|
Loading…
Reference in New Issue