summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-11-20 15:17:42 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-11-20 15:17:42 +0100
commit9309d89a48cee876ef17213924b2cc0b026677f9 (patch)
tree59e72e3bc35787dd2e822cbfd6896e4f8da30cd3 /ishtar_common
parenta9d9b977778068d2609342d2749123618108e9d7 (diff)
downloadIshtar-9309d89a48cee876ef17213924b2cc0b026677f9.tar.bz2
Ishtar-9309d89a48cee876ef17213924b2cc0b026677f9.zip
Custom forms: filter by user and by groups - tests
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/forms.py43
-rw-r--r--ishtar_common/tests.py70
2 files changed, 73 insertions, 40 deletions
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py
index 0f1fa20f8..683726e67 100644
--- a/ishtar_common/forms.py
+++ b/ishtar_common/forms.py
@@ -301,20 +301,41 @@ class ManageOldType(object):
class CustomForm(object):
form_admin_name = ""
form_slug = ""
+ need_user_for_initialization = True
def __init__(self, *args, **kwargs):
+ current_user = None
+ if 'user' in kwargs:
+ try:
+ current_user = kwargs.pop('user').ishtaruser
+ except AttributeError:
+ pass
super(CustomForm, self).__init__(*args, **kwargs)
- # todo: filter by user / group...
- q = models.CustomForm.objects.filter(form=self.form_slug,
- available=True, apply_to_all=True)
- if not q.count():
- return
- # todo: prevent multiple result in database
- form = q.all()[0]
- for excluded in form.excluded_fields.all():
- # could have be filtered previously
- if excluded.field in self.fields:
- self.fields.pop(excluded.field)
+ base_q = {"form": self.form_slug, 'available': True}
+ # order is important : try for user, user type then all
+ query_dicts = []
+ if current_user:
+ dct = base_q.copy()
+ dct.update({'users__pk': current_user.pk})
+ query_dicts = [dct]
+ for user_type in current_user.person.person_types.all():
+ dct = base_q.copy()
+ dct.update({'user_types__pk': user_type.pk}),
+ query_dicts.append(dct)
+ dct = base_q.copy()
+ dct.update({'apply_to_all': True})
+ query_dicts.append(dct)
+ for query_dict in query_dicts:
+ q = models.CustomForm.objects.filter(**query_dict)
+ if not q.count():
+ continue
+ # todo: prevent multiple result in database
+ form = q.all()[0]
+ for excluded in form.excluded_fields.all():
+ # could have be filtered previously
+ if excluded.field in self.fields:
+ self.fields.pop(excluded.field)
+ break
@classmethod
def get_custom_fields(cls):
diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py
index 63d80d5ab..016596772 100644
--- a/ishtar_common/tests.py
+++ b/ishtar_common/tests.py
@@ -288,6 +288,38 @@ class WizardTest(object):
raise ValidationError(u"Errors: {} on {}.".format(
u" ".join(errors), current_step))
+ @classmethod
+ def wizard_post(cls, client, url, current_step, form_data=None,
+ follow=True):
+ if not url:
+ url = reverse(cls.url_name)
+ data = {
+ '{}{}-current_step'.format(cls.url_name,
+ cls.wizard_name): [current_step],
+ }
+ if not form_data:
+ form_data = []
+
+ # reconstruct a POST request
+ if type(form_data) in (list, tuple): # is a formset
+ for d_idx, item in enumerate(form_data):
+ for k in item:
+ data['{}-{}-{}'.format(
+ current_step, d_idx, k)] = item[k]
+ else:
+ for k in form_data:
+ data['{}-{}'.format(current_step, k)] = form_data[k]
+
+ try:
+ response = client.post(url, data, follow=follow)
+ except ValidationError as e:
+ msg = u"Errors: {} on {}. On \"ManagementForm data is " \
+ u"missing or...\" error verify the wizard_name or " \
+ u"step name".format(u" - ".join(e.messages),
+ current_step)
+ raise ValidationError(msg)
+ return response
+
def test_wizard(self):
if self.pass_test():
return
@@ -301,35 +333,14 @@ class WizardTest(object):
current_step, current_form = step
if current_step in ignored:
continue
- data = {
- '{}{}-current_step'.format(self.url_name,
- self.wizard_name):
- [current_step],
- }
-
- # reconstruct a POST request
- if current_step in form_data:
- d = form_data[current_step]
- if type(d) in (list, tuple): # is a formset
- for d_idx, item in enumerate(d):
- for k in item:
- data['{}-{}-{}'.format(
- current_step, d_idx, k)] = item[k]
- else:
- for k in d:
- data['{}-{}'.format(current_step, k)] = d[k]
-
next_form_is_checked = len(self.steps) > idx + 1 and \
- self.steps[idx + 1][0] not in ignored
- try:
- response = self.client.post(
- url, data, follow=not next_form_is_checked)
- except ValidationError as e:
- msg = u"Errors: {} on {}. On \"ManagementForm data is " \
- u"missing or...\" error verify the wizard_name or " \
- u"step name".format(u" - ".join(e.messages),
- current_step)
- raise ValidationError(msg)
+ self.steps[idx + 1][0] not in ignored
+ data = []
+ if current_step in form_data:
+ data = form_data[current_step]
+ response = self.wizard_post(
+ self.client, url, current_step, data,
+ not next_form_is_checked)
self.check_response(response, current_step)
if next_form_is_checked:
next_form = self.steps[idx + 1][0]
@@ -402,7 +413,8 @@ class AdminGenTypeTest(TestCase):
gen_models = [
models.OrganizationType, models.PersonType, models.TitleType,
models.AuthorType, models.SourceType, models.OperationType,
- models.SpatialReferenceSystem, models.Format, models.SupportType]
+ models.SpatialReferenceSystem, models.Format, models.SupportType,
+ ]
models_with_data = gen_models + [models.ImporterModel]
models = models_with_data
module_name = 'ishtar_common'