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', }) |