diff options
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 |
commit | e0a1e5b8cc4e85895176d42bc0da0422eeabf70a (patch) | |
tree | 59e72e3bc35787dd2e822cbfd6896e4f8da30cd3 /ishtar_common | |
parent | 828fc2faebf1b7fd86d9aaaedf1bd3bbd0d3c6dc (diff) | |
download | Ishtar-e0a1e5b8cc4e85895176d42bc0da0422eeabf70a.tar.bz2 Ishtar-e0a1e5b8cc4e85895176d42bc0da0422eeabf70a.zip |
Custom forms: filter by user and by groups - tests
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/forms.py | 43 | ||||
-rw-r--r-- | ishtar_common/tests.py | 70 |
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' |