diff options
Diffstat (limited to 'ishtar')
| -rw-r--r-- | ishtar/furnitures/forms.py | 10 | ||||
| -rw-r--r-- | ishtar/furnitures/models.py | 9 | ||||
| -rw-r--r-- | ishtar/furnitures/views.py | 199 | ||||
| -rw-r--r-- | ishtar/furnitures/widgets.py | 37 | 
4 files changed, 111 insertions, 144 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index e436d0664..d73f3e849 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -668,12 +668,14 @@ class FileWizard(Wizard):          return res  class FileSelect(forms.Form): -    town = forms.IntegerField(label=_(u"Town"), +    towns = forms.IntegerField(label=_(u"Town"),           widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \                       'autocomplete-town', associated_model=models.Town),           validators=[models.valid_id(models.Town)])      file_type = forms.ChoiceField(label=_("File type"),                                    choices=models.FileType.get_types()) +    saisine_type = forms.ChoiceField(label=_("Saisine type"), +                                  choices=models.SaisineType.get_types())      year = forms.IntegerField(label=_("Year"))  class FileFormSelection(forms.Form): @@ -682,7 +684,7 @@ class FileFormSelection(forms.Form):      currents = {'pk':models.File}      pk = forms.IntegerField(label="", required=False,         widget=widgets.JQueryJqGrid(reverse_lazy('get-file'), -                                 FileSelect(), ['file_type', 'year']), +                                   FileSelect(), models.File),         validators=[models.valid_id(models.File)])      def clean(self): @@ -1161,6 +1163,8 @@ class OperationSelect(forms.Form):           validators=[models.valid_id(models.Town)])      operation_type = forms.ChoiceField(label=_("Operation type"),                                         choices=models.OperationType.get_types()) +    remains = forms.ChoiceField(label=_("Remains"), +                                choices=models.RemainType.get_types())      year = forms.IntegerField(label=_("Year"))  class OperationFormSelection(forms.Form): @@ -1169,7 +1173,7 @@ class OperationFormSelection(forms.Form):      currents = {'pk':models.Operation}      pk = forms.IntegerField(label="", required=False,         widget=widgets.JQueryJqGrid(reverse_lazy('get-operation'), -                                 OperationSelect(), ['operation_type', 'year']), +                                 OperationSelect(), models.Operation),         validators=[models.valid_id(models.Operation)])      def clean(self): diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 2b82fe6b4..c45f18c08 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -271,6 +271,8 @@ if settings.COUNTRY == 'fr':              verbose_name_plural = u"Types Saisine"  class File(BaseHistorizedItem, OwnPerms): +    TABLE_COLS = ['numeric_reference', 'year', 'internal_reference', +                  'file_type', 'saisine_type', 'towns', ]      year = models.IntegerField(_(u"Year"),                                 default=lambda:datetime.datetime.now().year)      numeric_reference = models.IntegerField(_(u"Numeric reference")) @@ -288,7 +290,7 @@ class File(BaseHistorizedItem, OwnPerms):      permit_reference = models.CharField(_(u"Permit reference"),                                            max_length=60, blank=True, null=True)      is_active = models.BooleanField(_(u"Is active?"), default=True) -    towns = models.ManyToManyField("Town") +    towns = models.ManyToManyField("Town", verbose_name=_(u"Towns"))      creation_date = models.DateField(_(u"Creation date"),                                       default=datetime.datetime.now)      reception_date = models.DateField(_(u'Reception date'), blank=True, @@ -347,6 +349,8 @@ class RemainType(GeneralType):          verbose_name_plural = _(u"Remain types")  class Operation(BaseHistorizedItem, OwnPerms): +    TABLE_COLS = ['operation_code', 'year', 'operation_type', +                  'remains', 'towns', 'associated_file']      start_date = models.DateField(_(u"Start date"), null=True, blank=True)      end_date = models.DateField(_(u"Closing date"), null=True, blank=True)      in_charge = models.ForeignKey('Person', related_name='+', null=True, @@ -364,6 +368,7 @@ class Operation(BaseHistorizedItem, OwnPerms):                                                blank=True)          code_dracar = models.CharField(u"Code DRACAR", max_length=10, null=True,                                         blank=True) +        TABLE_COLS += ["code_patriarche", "code_dracar"]      comment = models.TextField(_(u"Comment"), null=True, blank=True)      history = HistoricalRecords() @@ -694,7 +699,7 @@ class Town(models.Model):      def __unicode__(self):          if settings.COUNTRY == "fr": -            return " - ".join((self.name, self.numero_insee)) +            return u"%s (%s)" % (self.name, self.numero_insee)          return self.name  class TreatmentType(GeneralType): 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'): diff --git a/ishtar/furnitures/widgets.py b/ishtar/furnitures/widgets.py index 932770f29..439eb81fa 100644 --- a/ishtar/furnitures/widgets.py +++ b/ishtar/furnitures/widgets.py @@ -129,22 +129,14 @@ class JQueryJqGrid(forms.RadioSelect):               ]
          css = {'all':['%s/media/ui.jqgrid.css' % settings.MEDIA_URL]}
 -    def __init__(self, source, form, cols, attrs={}):
 +    def __init__(self, source, form, associated_model, attrs={}):
          self.source = source
          self.form = form
          self.attrs = attrs
 -        self.cols = cols
 +        self.associated_model = associated_model
      def render(self, name, value=None, attrs=None):
          rendered = unicode(self.form)
 -        """
 -        for k in self.form.fields:
 -            field = self.form.fields[k]
 -            print unicode(field)
 -            print field.label_tag
 -            rendered += u"<tr><td>%s</td><td>%s</td></tr>" % (field.label_tag,
 -                                                              unicode(field))
 -           """
          rendered += """
  </table>
  <button id='search_%s' class='submit'>%s</button>
 @@ -155,12 +147,16 @@ class JQueryJqGrid(forms.RadioSelect):          for k in self.form.fields:
              field = self.form.fields[k]
              col_idx.append(u'"%s"' % k)
 -            if k in self.cols:
 -                col_names.append(u'"%s"' % field.label)
 -                extra_cols.append(self.COL_TPL % {'idx':k})
 -        col_names = col_names and ",".join([""]+col_names) or ""
 -        col_idx = col_idx and ",".join(col_idx) or ""
 -        extra_cols = extra_cols and ",".join([""]+extra_cols) or ""
 +        for field_name in self.associated_model.TABLE_COLS:
 +            try:
 +                field = self.associated_model._meta.get_field(field_name)
 +            except:
 +                continue
 +            col_names.append(u'"%s"' % field.verbose_name)
 +            extra_cols.append(self.COL_TPL % {'idx':field.name})
 +        col_names = col_names and ",\n".join(col_names) or ""
 +        col_idx = col_idx and ",\n".join(col_idx) or ""
 +        extra_cols = extra_cols and ",\n".join(extra_cols) or ""
          rendered += """<table id="grid_%s" class='jqgrid'></table>
  <div id="pager_%s"></div>
  """ % (name, name)
 @@ -199,10 +195,10 @@ jQuery("#grid_%(name)s").jqGrid({      url:'%(source)s',
      datatype: "json",
      mtype: 'GET',
 -    colNames:['id', '%(name_label)s'%(col_names)s],
 +    colNames:['id', %(col_names)s],
      colModel:[
  {name:'id', index:'id', hidden:true},
 -{name:'value', index:'value'}%(extra_cols)s
 +%(extra_cols)s
      ],
      sortname: 'value',
      viewrecords: true,
 @@ -217,8 +213,7 @@ jQuery("#grid_%(name)s").jqGrid({  });
  </script>
  """ % {'name':name, 'col_names':col_names, 'extra_cols':extra_cols,
 -       'name_label':unicode(_("Name")), 'source':unicode(self.source),
 -       'col_idx':col_idx, 'no_result':unicode(_("No results")),
 -       'loading':unicode(_("Loading..."))}
 +       'source':unicode(self.source), 'col_idx':col_idx,
 +       'no_result':unicode(_("No results")), 'loading':unicode(_("Loading..."))}
          return rendered
  | 
