diff options
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 120 |
1 files changed, 75 insertions, 45 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 3406cf7af..4ee8da963 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -527,7 +527,7 @@ HIERARCHIC_FIELDS = ['periods', 'period', 'unit', 'material_types', def get_item(model, func_name, default_name, extra_request_keys=[], base_request={}, bool_fields=[], reversed_bool_fields=[], - dated_fields=[], associated_models=[], relative_session_names={}, + dated_fields=[], associated_models=[], relative_session_names=[], specific_perms=[], own_table_cols=None, relation_types_prefix={}): """ Generic treatment of tables @@ -569,6 +569,43 @@ def get_item(model, func_name, default_name, extra_request_keys=[], data_type = 'json' if not allowed: return HttpResponse(EMPTY, mimetype='text/plain') + + # get defaults from model + if not extra_request_keys and hasattr(model, 'EXTRA_REQUEST_KEYS'): + my_extra_request_keys = copy(model.EXTRA_REQUEST_KEYS) + else: + my_extra_request_keys = copy(extra_request_keys) + if not base_request and hasattr(model, 'BASE_REQUEST'): + my_base_request = copy(model.BASE_REQUEST) + else: + my_base_request = copy(base_request) + if not bool_fields and hasattr(model, 'BOOL_FIELDS'): + my_bool_fields = model.BOOL_FIELDS[:] + else: + my_bool_fields = bool_fields[:] + if not reversed_bool_fields and hasattr(model, 'REVERSED_BOOL_FIELDS'): + my_reversed_bool_fields = model.REVERSED_BOOL_FIELDS[:] + else: + my_reversed_bool_fields = reversed_bool_fields[:] + if not dated_fields and hasattr(model, 'DATED_FIELDS'): + my_dated_fields = model.DATED_FIELDS[:] + else: + my_dated_fields = dated_fields[:] + if not associated_models and hasattr(model, 'ASSOCIATED_MODELS'): + my_associated_models = model.ASSOCIATED_MODELS[:] + else: + my_associated_models = associated_models[:] + if not relative_session_names and hasattr(model, + 'RELATIVE_SESSION_NAMES'): + my_relative_session_names = model.RELATIVE_SESSION_NAMES[:] + else: + my_relative_session_names = relative_session_names[:] + if not relation_types_prefix and hasattr(model, + 'RELATION_TYPES_PREFIX'): + my_relation_types_prefix = copy(model.RELATION_TYPES_PREFIX) + else: + my_relation_types_prefix = copy(relation_types_prefix) + fields = [model._meta.get_field_by_name(k)[0] for k in model._meta.get_all_field_names()] request_keys = dict([ @@ -576,7 +613,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], field.name + (hasattr(field, 'rel') and field.rel and '__pk' or '')) for field in fields]) - for associated_model, key in associated_models: + for associated_model, key in my_associated_models: associated_fields = [ associated_model._meta.get_field_by_name(k)[0] for k in associated_model._meta.get_all_field_names()] @@ -585,10 +622,10 @@ def get_item(model, func_name, default_name, extra_request_keys=[], key + "__" + field.name + (hasattr(field, 'rel') and field.rel and '__pk' or '')) for field in associated_fields])) - request_keys.update(extra_request_keys) + request_keys.update(my_extra_request_keys) request_items = request.method == 'POST' and request.POST \ or request.GET - dct = base_request.copy() + dct = my_base_request if full == 'shortcut': dct['cached_label__icontains'] = request.GET.get('term', None) and_reqs, or_reqs = [], [] @@ -598,15 +635,14 @@ def get_item(model, func_name, default_name, extra_request_keys=[], return HttpResponse('[]', mimetype='text/plain') # manage relations types - my_rtypes_prefix = copy(relation_types_prefix) - if 'relation_types' not in my_rtypes_prefix: - my_rtypes_prefix['relation_types'] = '' + if 'relation_types' not in my_relation_types_prefix: + my_relation_types_prefix['relation_types'] = '' relation_types = {} - for rtype_key in my_rtypes_prefix: - relation_types[my_rtypes_prefix[rtype_key]] = set() + for rtype_key in my_relation_types_prefix: + relation_types[my_relation_types_prefix[rtype_key]] = set() for k in request_items: if k.startswith(rtype_key): - relation_types[my_rtypes_prefix[rtype_key]].add( + relation_types[my_relation_types_prefix[rtype_key]].add( request_items[k]) continue @@ -637,7 +673,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], dct = {"pk": request.session[default_name]} elif dct == base_request: # a parent item may be selected in the default menu - for name, key in relative_session_names: + for name, key in my_relative_session_names: if name in request.session and request.session[name]: dct.update({key: request.session[name]}) break @@ -646,13 +682,13 @@ def get_item(model, func_name, default_name, extra_request_keys=[], dct = request.session[func_name] else: request.session[func_name] = dct - for k in (list(bool_fields) + list(reversed_bool_fields)): + for k in (list(my_bool_fields) + list(my_reversed_bool_fields)): if k in dct: if dct[k] == u"1": dct.pop(k) else: dct[k] = dct[k] == u"2" and True or False - if k in reversed_bool_fields: + if k in my_reversed_bool_fields: dct[k] = not dct[k] # check also for empty value with image field field_name = k.split('__')[0] @@ -668,7 +704,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], dct[k.split('__')[0] + '__regex'] = '.{1}.*' except FieldDoesNotExist: pass - for k in dated_fields: + for k in my_dated_fields: if k in dct: if not dct[k]: dct.pop(k) @@ -1001,6 +1037,26 @@ def get_item(model, func_name, default_name, extra_request_keys=[], return func +def get_by_importer(request, slug, data_type='json', full=False, + force_own=False, **dct): + q = models.ImporterType.objects.filter(slug=slug) + if not q.count(): + res = '' + if data_type == "json": + res = '{}' + return HttpResponse(res, mimetype='text/plain') + imp = q.all()[0].get_importer_class() + cols = [] + for formater in imp.LINE_FORMAT: + if not formater: + continue + cols.append(formater.field_name) + obj_name = imp.OBJECT_CLS.__name__.lower() + return get_item( + imp.OBJECT_CLS, 'get_' + obj_name, obj_name, own_table_cols=cols + )(request, data_type, full, force_own, **dct) + + def show_item(model, name, extra_dct=None): def func(request, pk, **dct): try: @@ -1203,40 +1259,14 @@ new_person = new_item(models.Person, forms.PersonForm) new_person_noorga = new_item(models.Person, forms.NoOrgaPersonForm) new_organization = new_item(models.Organization, forms.OrganizationForm) show_organization = show_item(models.Organization, 'organization') -get_organization = get_item( - models.Organization, - 'get_organization', 'organization', - extra_request_keys={ - 'name': 'name__icontains', - 'organization_type': 'organization_type__pk__in', - }) +get_organization = get_item(models.Organization, 'get_organization', + 'organization') new_author = new_item(models.Author, forms.AuthorForm) show_person = show_item(models.Person, 'person') -get_person = get_item( - models.Person, - 'get_person', 'person', - reversed_bool_fields=['ishtaruser__isnull'], - extra_request_keys={ - 'name': ['name__icontains', 'raw_name__icontains'], - 'surname': ['surname__icontains', 'raw_name__icontains'], - 'attached_to': 'attached_to__pk', - 'person_types': 'person_types__pk__in', - 'ishtaruser__isnull': 'ishtaruser__isnull' - }) - -get_ishtaruser = get_item( - models.IshtarUser, - 'get_ishtaruser', 'ishtaruser', - extra_request_keys={ - 'username': ['username__icontains'], - 'name': ['person__name__icontains', 'person__raw_name__icontains'], - 'surname': ['person__surname__icontains', - 'person__raw_name__icontains'], - 'email': ['person__email'], - 'attached_to': 'person__attached_to__pk', - 'person_types': 'person__person_types__pk__in', - }) +get_person = get_item(models.Person, 'get_person', 'person') + +get_ishtaruser = get_item(models.IshtarUser, 'get_ishtaruser', 'ishtaruser') def action(request, action_slug, obj_id=None, *args, **kwargs): |