diff options
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 123 |
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') |