backoffice: add warning if total number of data fields is too large (#88452)
gitea/wcs/pipeline/head There was a failure building this commit Details

This commit is contained in:
Frédéric Péters 2024-03-24 16:16:32 +01:00
parent 87c30ae655
commit 5f287a5889
3 changed files with 52 additions and 0 deletions

View File

@ -3691,6 +3691,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 2201 data fields, including fields in blocks.')
)
FormDef.wipe()

View File

@ -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 %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':

View File

@ -576,6 +576,17 @@ 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
count += (
len([x for x in field.block.fields or [] if not x.is_no_data_field])
* field.default_items_count
)
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: