diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-10-21 11:12:47 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-10-21 11:12:47 +0200 |
commit | 9ea950ef761260d2b4e1706b6b76a57f67d93461 (patch) | |
tree | 2b16e28b04695fa01e1fee0fad14c66cfbe6a526 /ishtar_common | |
parent | b991654ccd2fb62d6ed2aa6e34e5774a5b11cb63 (diff) | |
download | Ishtar-9ea950ef761260d2b4e1706b6b76a57f67d93461.tar.bz2 Ishtar-9ea950ef761260d2b4e1706b6b76a57f67d93461.zip |
Manage export with importer's templates (refs #3064)
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/models.py | 33 | ||||
-rw-r--r-- | ishtar_common/templates/blocks/JQueryJqGrid.html | 7 | ||||
-rw-r--r-- | ishtar_common/urls.py | 2 | ||||
-rw-r--r-- | ishtar_common/views.py | 120 | ||||
-rw-r--r-- | ishtar_common/widgets.py | 13 |
5 files changed, 128 insertions, 47 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index ba3d51172..17df621db 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2253,6 +2253,14 @@ pre_delete.connect(pre_delete_import, sender=Import) class Organization(Address, Merge, OwnPerms, ValueGetter): TABLE_COLS = ('name', 'organization_type', 'town') SHOW_URL = 'show-organization' + + # search parameters + EXTRA_REQUEST_KEYS = { + 'name': 'name__icontains', + 'organization_type': 'organization_type__pk__in', + } + + # fields name = models.CharField(_(u"Name"), max_length=500) organization_type = models.ForeignKey(OrganizationType, verbose_name=_(u"Type")) @@ -2336,6 +2344,18 @@ class Person(Address, Merge, OwnPerms, ValueGetter): 'attached_to', 'town') SHOW_URL = 'show-person' MODIFY_URL = 'person_modify' + + # search parameters + 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' + } + + # fields old_title = models.CharField(_(u"Title"), max_length=100, choices=TYPE, blank=True, null=True) title = models.ForeignKey(TitleType, verbose_name=_(u"Title"), @@ -2527,6 +2547,19 @@ class IshtarUser(User): TABLE_COLS = ('username', 'person__name', 'person__surname', 'person__email', 'person__person_types_list', 'person__attached_to') + + # search parameters + 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', + } + + # fields person = models.ForeignKey(Person, verbose_name=_(u"Person"), unique=True, related_name='ishtaruser') advanced_shortcut_menu = models.BooleanField( diff --git a/ishtar_common/templates/blocks/JQueryJqGrid.html b/ishtar_common/templates/blocks/JQueryJqGrid.html index 5972208ee..faa2d9e93 100644 --- a/ishtar_common/templates/blocks/JQueryJqGrid.html +++ b/ishtar_common/templates/blocks/JQueryJqGrid.html @@ -13,9 +13,12 @@ <div id='foot_{{name}}' class='gridfooter'> -{% if source_full %} +{% if source_full or extra_sources %} <a class='badge {{sname}}-csv' href='{{source}}csv' target='_blank' title="{% trans 'Export as CSV' %}">{% trans "CSV" %}</a> -<a class='badge {{sname}}-csv-full' href='{{source_full}}csv' target='_blank' title="{% trans 'Export as CSV - full' %}">{% trans "CSV full" %}</a> +{% if source_full %}<a class='badge {{sname}}-csv-full' href='{{source_full}}csv' target='_blank' title="{% trans 'Export as CSV - full' %}">{% trans "CSV full" %}</a>{% endif %} +{% for slug, name, extra_source in extra_sources %} +<a class='badge {{slug}}-csv-full' href='{{extra_source}}csv' target='_blank' title="{% trans 'Export as CSV - ' %}{{name}}">{{name}}</a> +{% endfor %} {% else %} <a class='{{sname}}-csv' href="{{source}}csv" target="_blank" title="{% trans 'Export as CSV' %}">{% trans "CSV" %}</a> {% endif %} {{encoding}} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 22a09a052..edd1ebe75 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -135,6 +135,8 @@ urlpatterns += patterns( url(r'pin/(?P<item_type>[a-z-]+)/(?P<pk>\d+)/$', 'update_current_item', name='pin'), url(r'unpin/(?P<item_type>[a-z-]+)/$', 'unpin', name='unpin'), + url(r'get-by-importer/(?P<slug>[a-z-]+)/(?P<type>[a-z-]+)?$', + 'get_by_importer', name='get-by-importer'), url(r'new-person/(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$', 'new_person', name='new-person'), url(r'new-person-noorga/' 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): diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 48d1377fa..9e656311b 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -602,6 +602,19 @@ class JQueryJqGrid(forms.RadioSelect): dct['source'] = unicode(self.source) if unicode(self.source_full) and unicode(self.source_full) != 'None': dct['source_full'] = unicode(self.source_full) + + dct['extra_sources'] = [] + if self.associated_model: + model_name = "{}.{}".format( + self.associated_model.__module__, + self.associated_model.__name__) + for imp in models.ImporterType.objects.filter( + slug__isnull=False, associated_models=model_name, + is_template=True).all(): + dct['extra_sources'].append(( + imp.slug, imp.name, + reverse('get-by-importer', args=[imp.slug]))) + dct.update({'name': name, 'col_names': col_names, 'extra_cols': extra_cols, |