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, 66 insertions, 52 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 0be382866..be7c7b8e0 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -23,7 +23,11 @@ from copy import copy
import csv
import cStringIO as StringIO
import datetime
+
+import reportlab
+reportlab.Version = "2.2" # stupid hack for an old library...
import ho.pisa as pisa
+
import json
import logging
from markdown import markdown
@@ -214,44 +218,44 @@ def get_autocomplete_generic(model, extra={'available': True}):
else unicode(x)
data = json.dumps([{'id': obj.pk, 'value': get_label(obj)}
for obj in objects])
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
return func
def hide_shortcut_menu(request):
request.session['SHORTCUT_SHOW'] = 'off'
- return HttpResponse('OK', mimetype='text/plain')
+ return HttpResponse('OK', content_type='text/plain')
def show_shortcut_menu(request):
request.session['SHORTCUT_SHOW'] = 'on'
- return HttpResponse('OK', mimetype='text/plain')
+ return HttpResponse('OK', content_type='text/plain')
def activate_all_search(request):
request.session['SHORTCUT_SEARCH'] = 'all'
- return HttpResponse('OK', mimetype='text/plain')
+ return HttpResponse('OK', content_type='text/plain')
def activate_own_search(request):
request.session['SHORTCUT_SEARCH'] = 'own'
- return HttpResponse('OK', mimetype='text/plain')
+ return HttpResponse('OK', content_type='text/plain')
def activate_advanced_shortcut_menu(request):
if not hasattr(request.user, 'ishtaruser'):
- return HttpResponse('KO', mimetype='text/plain')
+ return HttpResponse('KO', content_type='text/plain')
request.user.ishtaruser.advanced_shortcut_menu = True
request.user.ishtaruser.save()
- return HttpResponse('OK', mimetype='text/plain')
+ return HttpResponse('OK', content_type='text/plain')
def activate_simple_shortcut_menu(request):
if not hasattr(request.user, 'ishtaruser'):
- return HttpResponse('KO', mimetype='text/plain')
+ return HttpResponse('KO', content_type='text/plain')
request.user.ishtaruser.advanced_shortcut_menu = False
request.user.ishtaruser.save()
- return HttpResponse('OK', mimetype='text/plain')
+ return HttpResponse('OK', content_type='text/plain')
def shortcut_menu(request):
@@ -462,7 +466,7 @@ def autocomplete_person(request, person_types=None, attached_to=None,
own_items = request.user.has_perm('ishtar_common.view_own_person',
models.Person)
if not all_items and not own_items or not request.GET.get('term'):
- return HttpResponse('[]', mimetype='text/plain')
+ return HttpResponse('[]', content_type='text/plain')
q = request.GET.get('term')
limit = request.GET.get('limit', 20)
try:
@@ -493,12 +497,12 @@ def autocomplete_person(request, person_types=None, attached_to=None,
persons = models.Person.objects.filter(query)[:limit]
data = json.dumps([{'id': person.pk, 'value': unicode(person)}
for person in persons if person])
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
def autocomplete_department(request):
if not request.GET.get('term'):
- return HttpResponse('[]', mimetype='text/plain')
+ return HttpResponse('[]', content_type='text/plain')
q = request.GET.get('term')
q = unicodedata.normalize("NFKD", q).encode('ascii', 'ignore')
query = Q()
@@ -509,12 +513,12 @@ def autocomplete_department(request):
departments = models.Department.objects.filter(query)[:limit]
data = json.dumps([{'id': department.pk, 'value': unicode(department)}
for department in departments])
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
def autocomplete_town(request):
if not request.GET.get('term'):
- return HttpResponse(mimetype='text/plain')
+ return HttpResponse(content_type='text/plain')
q = request.GET.get('term')
q = unicodedata.normalize("NFKD", q).encode('ascii', 'ignore')
query = Q()
@@ -527,12 +531,12 @@ def autocomplete_town(request):
towns = models.Town.objects.filter(query)[:limit]
data = json.dumps([{'id': town.pk, 'value': unicode(town)}
for town in towns])
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
def autocomplete_advanced_town(request, department_id=None, state_id=None):
if not request.GET.get('term'):
- return HttpResponse(mimetype='text/plain')
+ return HttpResponse(content_type='text/plain')
q = request.GET.get('term')
q = unicodedata.normalize("NFKD", q).encode('ascii', 'ignore')
query = Q()
@@ -556,7 +560,7 @@ def autocomplete_advanced_town(request, department_id=None, state_id=None):
val += " (%s)" % town.numero_insee
result.append({'id': town.pk, 'value': val})
data = json.dumps(result)
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
def department_by_state(request, state_id=''):
@@ -567,7 +571,7 @@ def department_by_state(request, state_id=''):
data = json.dumps([{'id': department.pk, 'number': department.number,
'value': unicode(department)}
for department in departments])
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
def format_val(val):
@@ -585,6 +589,23 @@ HIERARCHIC_FIELDS = ['periods', 'period', 'unit', 'material_types',
'material_type', 'conservatory_state']
+def _get_values(request, val):
+ if hasattr(val, 'all'): # manage related objects
+ vals = list(val.all())
+ else:
+ vals = [val]
+ new_vals = []
+ for v in vals:
+ if callable(v):
+ v = v()
+ if hasattr(v, 'url'):
+ v = request.is_secure() and \
+ 'https' or 'http' + '://' + \
+ request.get_host() + v.url
+ new_vals.append(v)
+ return new_vals
+
+
def get_item(model, func_name, default_name, extra_request_keys=[],
base_request=None, bool_fields=[], reversed_bool_fields=[],
dated_fields=[], associated_models=[], relative_session_names=[],
@@ -607,7 +628,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
allowed, own = models.check_model_access_control(request, model,
available_perms)
if not allowed:
- return HttpResponse(EMPTY, mimetype='text/plain')
+ return HttpResponse(EMPTY, content_type='text/plain')
if force_own:
own = True
@@ -683,7 +704,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
try:
old = 'old' in request_items and int(request_items['old'])
except ValueError:
- return HttpResponse('[]', mimetype='text/plain')
+ return HttpResponse('[]', content_type='text/plain')
# manage relations types
if 'relation_types' not in my_relation_types_prefix:
@@ -730,7 +751,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
try:
dct = {"pk": request.session[default_name]}
pinned_search = unicode(model._meta.verbose_name)\
- + u" - " + unicode(
+ + u" - " + unicode(
model.objects.get(pk=dct["pk"]))
except model.DoesNotExist:
pass
@@ -856,7 +877,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
query |= Q(**altor_dct)
if own:
- query = query & model.get_query_owns(request.user)
+ q = models.IshtarUser.objects.filter(user_ptr=request.user)
+ if q.count():
+ query = query & model.get_query_owns(q.all()[0])
+ else:
+ return HttpResponse(EMPTY, content_type='text/plain')
for and_req in and_reqs:
query = query & and_req
@@ -1007,23 +1032,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
val = list(val.all())
for v in val:
v = getattr(v, ky)
- if callable(v):
- v = v()
- if hasattr(v, 'url'):
- v = request.is_secure() and \
- 'https' or 'http' + '://' + \
- request.get_host() + v.url
- new_vals.append(v)
+ new_vals += _get_values(request, v)
elif val:
try:
val = getattr(val, ky)
- if callable(val):
- val = val()
- if hasattr(val, 'url'):
- val = request.is_secure() and \
- 'https' or 'http' + '://' + \
- request.get_host() + val.url
- new_vals.append(val)
+ new_vals += _get_values(request, val)
except AttributeError:
# must be a query key such as "contains"
pass
@@ -1111,9 +1124,9 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
"page": page_nb,
"total": (items_nb / row_nb + 1) if row_nb else items_nb,
})
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
elif data_type == "csv":
- response = HttpResponse(mimetype='text/csv')
+ response = HttpResponse(content_type='text/csv')
n = datetime.datetime.now()
filename = u'%s_%s.csv' % (default_name,
n.strftime('%Y%m%d-%H%M%S'))
@@ -1154,14 +1167,15 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
val = data[1:][idx + delta].encode(
ENCODING, errors='replace')
if "|" in col_name[0]:
- for delta_idx in range(len(col_name[0].split('|')) - 1):
+ for delta_idx in range(
+ len(col_name[0].split('|')) - 1):
delta += 1
val += data[1:][idx + delta].encode(
ENCODING, errors='replace')
row.append(val)
writer.writerow(row)
return response
- return HttpResponse('{}', mimetype='text/plain')
+ return HttpResponse('{}', content_type='text/plain')
return func
@@ -1173,7 +1187,7 @@ def get_by_importer(request, slug, data_type='json', full=False,
res = ''
if data_type == "json":
res = '{}'
- return HttpResponse(res, mimetype='text/plain')
+ return HttpResponse(res, content_type='text/plain')
imp = q.all()[0].get_importer_class()
cols, col_names = [], []
for formater in imp.LINE_FORMAT:
@@ -1231,7 +1245,7 @@ def show_item(model, name, extra_dct=None):
item = item.get_previous(date=date)
assert item is not None
except (ValueError, AssertionError):
- return HttpResponse(None, mimetype='text/plain')
+ return HttpResponse(None, content_type='text/plain')
dct['previous'] = item._previous
dct['next'] = item._next
else:
@@ -1286,7 +1300,7 @@ def show_item(model, name, extra_dct=None):
except xhtml2odt.ODTExportError:
return HttpResponse(content, content_type="application/xhtml")
response = HttpResponse(
- mimetype='application/vnd.oasis.opendocument.text')
+ content_type='application/vnd.oasis.opendocument.text')
response['Content-Disposition'] = 'attachment; filename=%s.odt' % \
filename
response.write(odtfile)
@@ -1301,7 +1315,7 @@ def show_item(model, name, extra_dct=None):
pdf = pisa.pisaDocument(StringIO.StringIO(html), result,
encoding='utf-8')
response = HttpResponse(result.getvalue(),
- mimetype='application/pdf')
+ content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=%s.pdf' % \
filename
if not pdf.err:
@@ -1321,8 +1335,8 @@ def revert_item(model):
date = datetime.datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%f')
item.rollback(date)
except (ObjectDoesNotExist, ValueError, HistoryError):
- return HttpResponse(None, mimetype='text/plain')
- return HttpResponse("True", mimetype='text/plain')
+ return HttpResponse(None, content_type='text/plain')
+ return HttpResponse("True", content_type='text/plain')
return func
@@ -1333,9 +1347,9 @@ def autocomplete_organization(request, orga_type=None):
models.Organization)
and not request.user.ishtaruser.has_right(
'person_search', session=request.session)):
- return HttpResponse('[]', mimetype='text/plain')
+ return HttpResponse('[]', content_type='text/plain')
if not request.GET.get('term'):
- return HttpResponse('[]', mimetype='text/plain')
+ return HttpResponse('[]', content_type='text/plain')
q = request.GET.get('term')
query = Q()
for q in q.split(' '):
@@ -1352,16 +1366,16 @@ def autocomplete_organization(request, orga_type=None):
organizations = models.Organization.objects.filter(query)[:limit]
data = json.dumps([{'id': org.pk, 'value': unicode(org)}
for org in organizations])
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
def autocomplete_author(request):
if not request.user.has_perm('ishtar_common.view_author', models.Author)\
and not request.user.has_perm('ishtar_common.view_own_author',
models.Author):
- return HttpResponse('[]', mimetype='text/plain')
+ return HttpResponse('[]', content_type='text/plain')
if not request.GET.get('term'):
- return HttpResponse('[]', mimetype='text/plain')
+ return HttpResponse('[]', content_type='text/plain')
q = request.GET.get('term')
query = Q()
for q in q.split(' '):
@@ -1374,7 +1388,7 @@ def autocomplete_author(request):
authors = models.Author.objects.filter(query)[:limit]
data = json.dumps([{'id': author.pk, 'value': unicode(author)}
for author in authors])
- return HttpResponse(data, mimetype='text/plain')
+ return HttpResponse(data, content_type='text/plain')
def new_item(model, frm, many=False):