import re
from tagging.models import Tag, TaggedItem
from django.db.models import Q, get_model

def tag_view(request, 
             tag_expression, 
             app_name = 'pubman',
             model_name='article', 
             view=article_list_view,
             html_template='pubman/tag.html'):


    model_filter = TaggedItem.objects.all().filter(content_type__model=model_name)
    
    search_string = '\'[\w\s]+\'|\"[\w\s]+\"|[\w\s]+|&|\||\(|\)|-'    
    parse_string = re.findall(search_string, tag_expression)
    
    print parse_string
    
    querystring = ""
     
    for token in parse_string:
        if token in ['&', '|','-', '(',')']:
            querystring +=  ' ' + token + ' '
        elif token == 'ALL':
            querystring += ' set([i.id for i in get_model("' +\
                app_name + '", "' +\
                model_name + '")'+ '.objects.all()])'            
        else:
            token = token.replace('"','')
            token = token.replace("'","")            
            querystring += ' set([i.object_id for i in '+\
                'model_filter.filter(tag__name="' + token + '")])'

    print 'Query: ', querystring

    try:                
        instances = eval(querystring)
    except:
        # This is the fallback when there's an error in the expression.
        # A better way might be to raise Http404.
        instances = model_filter.filter(tag__name=tag_expression)

    object_list = get_model(app_name, model_name).\
        objects.all().filter(id__in=instances)
        
    return view(request, object_list, html_template)