diff options
Diffstat (limited to 'ishtar/furnitures/views.py')
| -rw-r--r-- | ishtar/furnitures/views.py | 199 | 
1 files changed, 81 insertions, 118 deletions
diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py index 3b6263517..ec61ad339 100644 --- a/ishtar/furnitures/views.py +++ b/ishtar/furnitures/views.py @@ -25,6 +25,8 @@ import csv  import json  import datetime +CSV_OPTIONS = {'delimiter':';', 'quotechar':'"', 'quoting':csv.QUOTE_ALL} +  from django.http import HttpResponse  from django.template import RequestContext  from django.shortcuts import render_to_response, redirect @@ -123,65 +125,86 @@ def autocomplete_file(request):                                            for file in files])      return HttpResponse(data, mimetype='text/plain') -def get_file(request, type='json'): -    if not type: -        type = 'json' -    request_keys = {'town':'towns__pk', -                    'file_type':'file_type__pk', -                    'year':'year', -                    'value':'name', -                    } -    dct = {} -    for k in request_keys: -        q = request.GET.get(k) -        if not q: -            continue -        dct[request_keys[k]] = q -    if not dct: -        if 'get_file' in request.session: -            dct = request.session['get_file'] -        elif 'file' in request.session: -            dct = {"pk":request.session['file']} +def get_item(model, func_name, default_name): +    """ +    Generic treatment of tables +    """ +    def func(request, type='json', **dct): +        if not type: +            type = 'json' +        request_keys = dict([(field.name, +                              field.name + (hasattr(field, 'rel') and '__pk' or '')) +                                    for field in model._meta.fields]) +        dct = {} +        for k in request_keys: +            q = request.GET.get(k) +            if not q: +                continue +            dct[request_keys[k]] = q          if not dct: -            return HttpResponse(mimetype='text/plain') -    else: -        request.session['get_file'] = dct -    query = Q(**dct) -    files = models.File.objects.filter(query) -    q = request.GET.get('sidx') -    if q and q in request_keys: -        k = request_keys[q] -        if k.endswith("__pk"): -            k = k[:-len("__pk")] + "__label" -        q = request.GET.get('sord') -        sign = q and q == u'desc' and "-" or '' -        if k == "name": -            files = files.order_by(sign + 'year').order_by( -                                             sign + 'numeric_reference') +            if func_name in request.session: +                dct = request.session[func_name] +            elif default_name in request.session: +                dct = {"pk":request.session[default_name]} +            if not dct: +                return HttpResponse(mimetype='text/plain')          else: -            files = files.order_by(sign + k) -    data = None -    if type == "json": -        data = json.dumps({ -        "records":len(files), -        "rows":[{"id":unicode(fle.pk), -         "cell":(unicode(fle.pk), unicode(fle), -                 unicode(fle.file_type), unicode(fle.year))} -                                   for fle in files] -        }) -        return HttpResponse(data, mimetype='text/plain') -    elif type == "csv": -        response = HttpResponse(mimetype='text/csv') -        n = datetime.datetime.now() -        filename = u'files_%s.csv' % n.strftime('%Y%m%d-%H%M%S') -        response['Content-Disposition'] = 'attachment; filename=%s' % filename -        writer = csv.writer(response) -        for fle in files: -            writer.writerow([unicode(fle).encode('utf-8'), -                             unicode(fle.file_type).encode('utf-8'), -                             unicode(fle.year).encode('utf-8')]) -        return response -    return HttpResponse(data, mimetype='text/plain') +            request.session[func_name] = dct +        query = Q(**dct) +        items = model.objects.filter(query) +        q = request.GET.get('sidx') +        if q and q in request_keys: +            k = request_keys[q] +            if k.endswith("__pk"): +                k = k[:-len("__pk")] + "__label" +            q = request.GET.get('sord') +            sign = q and q == u'desc' and "-" or '' +            items = items.order_by(sign + k) +        datas = [] +        f = items[0] +        for item in items: +            data = [item.pk] +            for k in model.TABLE_COLS: +                val = getattr(item, k) +                if hasattr(val, 'all'): # manage related objects +                    data.append(", ".join([v and unicode(v) or u"" +                                           for v in getattr(val, 'all')()])) +                else: +                    data.append(val and unicode(val) or u"") +            datas.append(data) +        if type == "json": +            rows = [] +            for data in datas: +                rows.append({"id":unicode(data[0]), +                             "cell":data}) +            data = json.dumps({ +                "records":len(items), +                "rows":rows +            }) +            return HttpResponse(data, mimetype='text/plain') +        elif type == "csv": +            response = HttpResponse(mimetype='text/csv') +            n = datetime.datetime.now() +            filename = u'%s_%s.csv' % (default_name, n.strftime('%Y%m%d-%H%M%S')) +            response['Content-Disposition'] = 'attachment; filename=%s' % filename +            writer = csv.writer(response, **CSV_OPTIONS) +            col_names = [] +            for field_name in model.TABLE_COLS: +                try: +                    field = model._meta.get_field(field_name) +                except: +                    col_names.append(u"".encode('utf-8')) +                    continue +                col_names.append(unicode(field.verbose_name).encode('utf-8')) +            writer.writerow(col_names) +            for data in datas: +                writer.writerow([val.encode('utf-8') for val in data[1:]]) +            return response +        return HttpResponse(None, mimetype='text/plain') + +    return func + +get_file = get_item(models.File, 'get_file', 'file')  def autocomplete_operation(request, non_closed=True):      if not request.GET.get('term'): @@ -204,67 +227,7 @@ def autocomplete_operation(request, non_closed=True):                                            for operation in operations])      return HttpResponse(data, mimetype='text/plain') -def get_operation(request, type='json', non_closed=True): -    if not type: -        type = 'json' -    request_keys = {'town':'towns__pk', -                    'operation_type':'operation_type__pk', -                    'operation_code':'operation_code', -                    'year':'year', -                    'value':'name', -                    } -    dct = {} -    for k in request_keys: -        q = request.GET.get(k) -        if not q: -            continue -        dct[request_keys[k]] = q -    if not dct: -        if 'get_operation' in request.session: -            dct = request.session['get_operation'] -        elif 'operation' in request.session: -            dct = {"pk":request.session['operation']} -        if not dct: -            return HttpResponse(mimetype='text/plain') -    else: -        request.session['get_operation'] = dct -    query = Q(**dct) -    operations = models.Operation.objects.filter(query) -    q = request.GET.get('sidx') -    if q and q in request_keys: -        k = request_keys[q] -        if k.endswith("__pk"): -            k = k[:-len("__pk")] + "__label" -        q = request.GET.get('sord') -        sign = q and q == u'desc' and "-" or '' -        if k == "name": -            k = "operation_code" -            operations = operations.order_by(sign + 'year').order_by( -                                             sign + 'operation_code') -        else: -            operations = operations.order_by(sign + k) -    data = None -    if type == 'json': -        data = json.dumps({ -        "records":len(operations), -        "rows":[{"id":unicode(operation.pk), -         "cell":(unicode(operation.pk), unicode(operation), -                 unicode(operation.operation_type), unicode(operation.year))} -                                   for operation in operations] -        }) -        return HttpResponse(data, mimetype='text/plain') -    elif type == "csv": -        response = HttpResponse(mimetype='text/csv') -        n = datetime.datetime.now() -        filename = 'operations_%s.csv' % n.strftime('%Y%m%d-%H%M%S') -        response['Content-Disposition'] = 'attachment; filename=%s' % filename -        writer = csv.writer(response) -        for ope in operations: -            writer.writerow([unicode(ope).encode('utf-8'), -                             unicode(ope.operation_type).encode('utf-8'), -                             unicode(ope.year).encode('utf-8')]) -        return response -    return HttpResponse(data, mimetype='text/plain') +get_operation = get_item(models.Operation, 'get_operation', 'operation')  def autocomplete_organization(request, orga_type=None):      if not request.GET.get('term'):  | 
