add quota support for number of fields

This commit is contained in:
Frédéric Péters 2011-04-17 10:22:02 +02:00
parent b76421b1e2
commit e9b5f4ee7b
2 changed files with 35 additions and 1 deletions

View File

@ -45,6 +45,8 @@ from wcs.admin.fields import FieldWidget, FieldDefPage, FieldsDirectory
from bodiffusion import DiffusionDirectory
from boresults import FormResultDirectory
import quota
class CustomFieldDefPage(FieldDefPage):
section = 'forms/'
wsf_support = False
@ -53,6 +55,8 @@ class CustomFieldDefPage(FieldDefPage):
html_top('forms/%s' % self.objectdef.id, *args, **kwargs)
def duplicate(self):
if not quota.may_add_a_new_field(self.objectdef):
raise quota.QuotaExceeded()
t = FieldDefPage.duplicate(self)
if get_response().status_code == 302:
return redirect('..')
@ -198,6 +202,12 @@ class FormDirectory(FieldsDirectory):
return form
def new(self):
if quota.may_add_a_new_field(self.objectdef):
return super(FormDirectory, self).new()
else:
raise quota.QuotaExceeded()
def index_top [html] (self):
'<ul id="main-actions">'
if self.objectdef.asec_status == 'soon-available':
@ -271,7 +281,12 @@ class FormDirectory(FieldsDirectory):
'<a href="clean" rel="popup">%s</a>' % _('Remove Them')
'</p>'
super(FormDirectory, self).get_new_field_form(page_no)
if quota.may_add_a_new_field(self.objectdef):
super(FormDirectory, self).get_new_field_form(page_no)
else:
'<p>'
_('This questionnaire has reached its number of questions quota.')
'</p>'
def clean [html] (self):
form = Form(enctype='multipart/form-data')

View File

@ -21,6 +21,7 @@ from quixote.errors import AccessError
from qommon import template
from wcs.fields import WidgetField
from wcs.formdef import FormDef
class QuotaExceeded(AccessError):
@ -40,3 +41,21 @@ def may_add_a_new_form():
return True
return (FormDef.count() < max_forms)
def get_max_number_of_fields():
t = get_request().get_header('QuotaFields')
if not t:
return None
return int(t)
def may_add_a_new_field(formdef):
max_fields = get_max_number_of_fields()
if not max_fields:
return True
fields_count = 0
for field in formdef.fields:
# only count data fields, not presentation fields (pages, titles, etc.)
if isinstance(field, WidgetField):
fields_count += 1
return (fields_count < max_fields)