diff options
Diffstat (limited to 'ishtar_common/views.py')
| -rw-r--r-- | ishtar_common/views.py | 118 | 
1 files changed, 95 insertions, 23 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 0624d13d0..bbe790efa 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -19,6 +19,7 @@  from tidylib import tidy_document as tidy +from copy import copy  import csv  import cStringIO as StringIO  import datetime @@ -38,6 +39,7 @@ from django.contrib.auth.decorators import login_required  from django.core.exceptions import ObjectDoesNotExist  from django.core.urlresolvers import reverse, NoReverseMatch  from django.db.models import Q, ImageField +from django.db.models.fields import FieldDoesNotExist  from django.forms.models import modelformset_factory  from django.http import HttpResponse, Http404, HttpResponseRedirect, \      HttpResponseBadRequest @@ -148,12 +150,18 @@ organization_deletion_wizard = wizards.OrganizationDeletionWizard.as_view(      url_name='organization_deletion',)  account_management_wizard = wizards.AccountWizard.as_view( -    [('selec-account_management', forms.PersonFormSelection), +    [('selec-account_management', forms.PersonUserFormSelection),       ('account-account_management', forms.AccountForm),       ('final-account_management', forms.FinalAccountForm)],      label=_(u"Account management"),      url_name='account_management',) +account_deletion_wizard = wizards.IshtarUserDeletionWizard.as_view( +    [('selec-account_deletion', forms.AccountFormSelection), +     ('final-account_deletion', FinalDeleteForm)], +    label=_(u"Account deletion"), +    url_name='account_deletion',) +  def get_autocomplete_generic(model, extra={'available': True}):      def func(request): @@ -335,7 +343,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={}, -             specific_perms=[], own_table_cols=None): +             specific_perms=[], own_table_cols=None, relation_types_prefix={}):      """      Generic treatment of tables      """ @@ -399,11 +407,19 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          except ValueError:              return HttpResponse('[]', mimetype='text/plain') -        relation_types = set() -        for k in request_items: -            if k.startswith('relation_types_'): -                relation_types.add(request_items[k]) -                continue +        # manage relations types +        my_rtypes_prefix = copy(relation_types_prefix) +        if 'relation_types' not in my_rtypes_prefix: +            my_rtypes_prefix['relation_types'] = '' +        relation_types = {} +        for rtype_key in my_rtypes_prefix: +            relation_types[my_rtypes_prefix[rtype_key]] = set() +            for k in request_items: +                if k.startswith(rtype_key): +                    relation_types[my_rtypes_prefix[rtype_key]].add( +                        request_items[k]) +                    continue +          for k in request_keys:              val = request_items.get(k)              if not val: @@ -447,14 +463,19 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                      if k in reversed_bool_fields:                          dct[k] = not dct[k]                      # check also for empty value with image field -                    c_field = model._meta.get_field(k.split('__')[0]) -                    if k.endswith('__isnull') and \ -                       isinstance(c_field, ImageField): -                        if dct[k]: -                            or_reqs.append( -                                (k, {k.split('__')[0] + '__exact': ''})) -                        else: -                            dct[k.split('__')[0] + '__regex'] = '.{1}.*' +                    field_name = k.split('__')[0] +                    # TODO: can be improved in later evrsion of Django +                    try: +                        c_field = model._meta.get_field(field_name) +                        if k.endswith('__isnull') and \ +                           isinstance(c_field, ImageField): +                            if dct[k]: +                                or_reqs.append( +                                    (k, {k.split('__')[0] + '__exact': ''})) +                            else: +                                dct[k.split('__')[0] + '__regex'] = '.{1}.*' +                    except FieldDoesNotExist: +                        pass          for k in dated_fields:              if k in dct:                  if not dct[k]: @@ -497,14 +518,26 @@ def get_item(model, func_name, default_name, extra_request_keys=[],              alt_dct.update(or_req)              query = query | Q(**alt_dct) -        if relation_types: +        for rtype_prefix in relation_types: +            vals = list(relation_types[rtype_prefix]) +            if not vals: +                continue              alt_dct = { -                'right_relations__relation_type__pk__in': list(relation_types)} +                rtype_prefix + 'right_relations__relation_type__pk__in': vals}              for k in dct:                  val = dct[k] -                if k == 'year': -                    k = 'year__exact' -                alt_dct['right_relations__right_record__' + k] = val +                if rtype_prefix: +                    # only get conditions related to the object +                    if rtype_prefix not in k: +                        continue +                    # tricky: reconstruct the key to make sense - remove the +                    # prefix from the key +                    k = k[0:k.index(rtype_prefix)] + k[ +                        k.index(rtype_prefix) + len(rtype_prefix):] +                if k.endswith('year'): +                    k += '__exact' +                alt_dct[rtype_prefix + 'right_relations__right_record__' + k] =\ +                    val              if not dct:                  # fake condition to trick Django (1.4): without it only the                  # alt_dct is managed @@ -517,7 +550,9 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                      val = or_req[j]                      if j == 'year':                          j = 'year__exact' -                    altor_dct['right_relations__right_record__' + j] = val +                    altor_dct[ +                        rtype_prefix + 'right_relations__right_record__' + j] =\ +                        val                  query = query | Q(**altor_dct)          if own: @@ -527,6 +562,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],              query = query & and_req          items = model.objects.filter(query).distinct() +        # print(items.query)          q = request_items.get('sidx')          # table cols @@ -614,7 +650,14 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                  my_vals = []                  for k in keys:                      vals = [item] +                    # foreign key may be splited by "." or "__" +                    splitted_k = []                      for ky in k.split('.'): +                        if '__' in ky: +                            splitted_k += ky.split('__') +                        else: +                            splitted_k.append(ky) +                    for ky in splitted_k:                          new_vals = []                          for val in vals:                              if hasattr(val, 'all'):  # manage related objects @@ -669,6 +712,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          link_template = "<a class='display_details' href='#' "\              "onclick='load_window(\"%s\")'>"\              "<i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i></a>" +        link_ext_template = '<a href="{}" target="_blank">{}</a>'          if data_type == "json":              rows = []              for data in datas: @@ -685,7 +729,18 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                          table_col = table_cols[idx]                          if type(table_col) not in (list, tuple):                              table_col = [table_col] -                        k = "__".join([tc.split('.')[-1] for tc in table_col]) +                        tab_cols = [] +                        # foreign key may be splited by "." or "__" +                        for tc in table_col: +                            if '.' in tc: +                                tab_cols.append(tc.split('.')[-1]) +                            elif '__' in tc: +                                tab_cols.append(tc.split('__')[-1]) +                            else: +                                tab_cols.append(tc) +                        k = "__".join(tab_cols) +                        if hasattr(model, 'COL_LINK') and k in model.COL_LINK: +                            value = link_ext_template.format(value, value)                          res[k] = value                  rows.append(res)              data = json.dumps({ @@ -720,7 +775,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                          unicode(field.verbose_name).encode(ENCODING))              writer.writerow(col_names)              for data in datas: -                writer.writerow([val.encode(ENCODING) for val in data[1:]]) +                writer.writerow([val.encode(ENCODING, errors='replace') +                                 for val in data[1:]])              return response          return HttpResponse('{}', mimetype='text/plain') @@ -736,6 +792,7 @@ def show_item(model, name, extra_dct=None):          doc_type = 'type' in dct and dct.pop('type')          url_name = u"/".join(reverse('show-' + name, args=['0', '']                                       ).split('/')[:-2]) + u"/" +        dct['CURRENCY'] = get_current_profile().currency          dct['current_window_url'] = url_name          date = 'date' in dct and dct.pop('date')          dct['window_id'] = "%s-%d-%s" % ( @@ -940,11 +997,26 @@ 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',      })  | 
