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