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, | 
