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.py123
1 files changed, 117 insertions, 6 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 46a8ceb6a..5022aa08e 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -62,7 +62,7 @@ from archaeological_operations.forms import DashboardForm as DashboardFormOpe
from archaeological_files.forms import DashboardForm as DashboardFormFile
from ishtar_common.forms import FinalForm, FinalDeleteForm
-from ishtar_common.utils import get_random_item_image_link
+from ishtar_common.utils import get_random_item_image_link, shortify
from ishtar_common import forms_common as forms
from ishtar_common import wizards
from ishtar_common.models import HistoryError, PRIVATE_FIELDS, \
@@ -198,11 +198,122 @@ def get_autocomplete_generic(model, extra={'available': True}):
return func
-def update_current_item(request):
- if not request.is_ajax() and not request.method == 'POST':
- raise Http404
- if 'value' in request.POST and 'item' in request.POST:
- request.session[request.POST['item']] = request.POST['value']
+def shortcut_menu(request):
+ from archaeological_operations.models import Operation
+ from archaeological_files.models import File
+ from archaeological_context_records.models import ContextRecord
+ from archaeological_finds.models import Find
+
+ profile = get_current_profile()
+ CURRENT_ITEMS = []
+ if profile.files:
+ CURRENT_ITEMS.append((_(u"Archaeological file"), File))
+ CURRENT_ITEMS.append((_(u"Operation"), Operation))
+ if profile.context_record:
+ CURRENT_ITEMS.append((_(u"Context record"), ContextRecord))
+ if profile.find:
+ CURRENT_ITEMS.append((_(u"Find"), Find))
+ dct = {'current_menu': []}
+ current_selected_item = None
+ for lbl, model in CURRENT_ITEMS:
+ new_selected_item = None
+ model_name = model.SLUG
+ cls = ''
+ current = model_name in request.session and request.session[model_name]
+ items = []
+ for item in model.get_owns(request.user,
+ menu_filtr=current_selected_item):
+ pk = unicode(item.pk)
+ if item.IS_BASKET:
+ pk = "basket-" + pk
+ selected = pk == current
+ if selected:
+ cls = item.get_short_menu_class()
+ new_selected_item = item
+ items.append((pk, shortify(unicode(item), 60),
+ selected, item.get_short_menu_class()))
+ # selected is not in owns - add it to the list
+ if not new_selected_item and current:
+ try:
+ item = model.objects.get(pk=int(current))
+ items.append((item.pk, shortify(unicode(item), 60),
+ True, item.get_short_menu_class()))
+ except (model.DoesNotExist, ValueError):
+ pass
+ if items:
+ dct['current_menu'].append((lbl, model_name, cls, items))
+ current_selected_item = new_selected_item
+ return render_to_response('ishtar/blocks/shortcut_menu.html', dct,
+ context_instance=RequestContext(request))
+
+
+def get_current_items(request):
+ from archaeological_files.models import File
+ from archaeological_operations.models import Operation
+ from archaeological_context_records.models import ContextRecord
+ from archaeological_finds.models import Find
+ currents = {}
+ for key, model in (('file', File),
+ ('operation', Operation),
+ ('contextrecord', ContextRecord),
+ ('find', Find)):
+ currents[key] = None
+ if key in request.session and request.session[key]:
+ try:
+ currents[key] = model.objects.get(pk=int(request.session[key]))
+ except (ValueError, File.DoesNotExist):
+ continue
+ return currents
+
+
+def update_current_item(request, item_type=None, pk=None):
+ if not item_type or not pk:
+ if not request.is_ajax() and not request.method == 'POST':
+ raise Http404
+ item_type = request.POST['item']
+ if 'value' in request.POST and 'item' in request.POST:
+ request.session[item_type] = request.POST['value']
+ else:
+ request.session[item_type] = str(pk)
+
+ currents = get_current_items(request)
+ # reinit when descending item are not relevant
+ if item_type == 'file' and currents['file'] and currents['operation'] and \
+ currents['operation'].associated_file != currents['file']:
+ request.session["operation"] = ''
+ currents['operation'] = None
+ if item_type in ('operation', 'file') and currents['contextrecord'] and \
+ (not request.session["operation"] or
+ currents['contextrecord'].operation != currents['operation']):
+ request.session["contextrecord"] = ''
+ currents['contextrecord'] = None
+ from archaeological_finds.models import Find
+ if item_type in ('contextrecord', 'operation', 'file') and currents['find'] and\
+ (not request.session["contextrecord"] or
+ not Find.objects.filter(
+ downstream_treatment__isnull=True,
+ base_finds__context_record__pk=request.session["contextrecord"],
+ pk=currents['find'].pk).count()):
+ request.session["find"] = ''
+ currents['find'] = None
+
+ # re-init ascending item with relevant values
+ if item_type == "find" and currents['find']:
+ from archaeological_context_records.models import ContextRecord
+ q = ContextRecord.objects.filter(
+ base_finds__find__pk=currents['find'].pk)
+ if q.count():
+ currents['contextrecord'] = q.all()[0]
+ request.session['contextrecord'] = str(
+ currents['contextrecord'].pk)
+ if item_type in ("find", 'contextrecord') and currents['contextrecord']:
+ currents['operation'] = currents['contextrecord'].operation
+ request.session['operation'] = str(currents['operation'].pk)
+ if item_type in ("find", 'contextrecord', 'operation') and \
+ currents['operation']:
+ currents['file'] = currents['operation'].associated_file
+ request.session['file'] = str(currents['file'].pk) if currents['file'] \
+ else None
return HttpResponse('ok')