summaryrefslogtreecommitdiff
path: root/ishtar_common/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r--ishtar_common/views.py118
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',
})