summaryrefslogtreecommitdiff
path: root/ishtar/furnitures
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar/furnitures')
-rw-r--r--ishtar/furnitures/admin.py5
-rw-r--r--ishtar/furnitures/forms.py48
-rw-r--r--ishtar/furnitures/models.py17
-rw-r--r--ishtar/furnitures/urls.py4
-rw-r--r--ishtar/furnitures/views.py99
-rw-r--r--ishtar/furnitures/widgets.py99
6 files changed, 262 insertions, 10 deletions
diff --git a/ishtar/furnitures/admin.py b/ishtar/furnitures/admin.py
index 7ffe387fd..83862f32a 100644
--- a/ishtar/furnitures/admin.py
+++ b/ishtar/furnitures/admin.py
@@ -166,8 +166,11 @@ admin.site.register(models.Container, ContainerAdmin)
class TownAdmin(admin.ModelAdmin):
list_display = ['name',]
+ search_fields = ['name']
if settings.COUNTRY == 'fr':
- list_display += ['canton']
+ list_display += ['numero_insee', 'departement', ]
+ search_fields += ['numero_insee', 'departement__label', ]
+ list_filter = ("departement",)
model = models.Town
admin.site.register(models.Town, TownAdmin)
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py
index 82bfcb88e..c49367ab4 100644
--- a/ishtar/furnitures/forms.py
+++ b/ishtar/furnitures/forms.py
@@ -652,7 +652,31 @@ class FileWizard(Wizard):
parcel.save()
return res
+class FileSelect(forms.Form):
+ town = 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())
+ year = forms.IntegerField(label=_("Year"))
+
+class FileFormSelection(forms.Form):
+ form_label = _("Archaelogical file")
+ associated_models = {'pk':models.File}
+ currents = {'pk':models.File}
+ pk = forms.IntegerField(label="", required=False,
+ widget=widgets.JQueryJqGrid(reverse_lazy('json-file'),
+ FileSelect(), ['file_type', 'year']),
+ validators=[models.valid_id(models.File)])
+
+ def clean(self):
+ cleaned_data = self.cleaned_data
+ if 'pk' not in cleaned_data or not cleaned_data['pk']:
+ raise forms.ValidationError(_(u"You should select a file."))
+ return cleaned_data
+"""
class FileFormSelection(forms.Form):
form_label = _("Archaelogical file")
associated_models = {'pk':models.File}
@@ -661,6 +685,7 @@ class FileFormSelection(forms.Form):
widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'),
associated_model=models.File),
validators=[models.valid_id(models.File)])
+"""
class FileFormGeneral(forms.Form):
form_label = _("General")
@@ -1066,15 +1091,36 @@ class OperationWizard(Wizard):
+ datas
return datas
+class OperationSelect(forms.Form):
+ town = forms.IntegerField(label=_(u"Town"),
+ widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \
+ 'autocomplete-town', associated_model=models.Town),
+ validators=[models.valid_id(models.Town)])
+ operation_type = forms.ChoiceField(label=_("Operation type"),
+ choices=models.OperationType.get_types())
+ year = forms.IntegerField(label=_("Year"))
+
class OperationFormSelection(forms.Form):
form_label = _("Operation")
associated_models = {'pk':models.Operation}
currents = {'pk':models.Operation}
+ pk = forms.IntegerField(label="", required=False,
+ widget=widgets.JQueryJqGrid(reverse_lazy('json-operation'),
+ OperationSelect(), ['operation_type', 'year']),
+ validators=[models.valid_id(models.Operation)])
+
+ def clean(self):
+ cleaned_data = self.cleaned_data
+ if 'pk' not in cleaned_data or not cleaned_data['pk']:
+ raise forms.ValidationError(_(u"You should select an operation."))
+ return cleaned_data
+
+ """
pk = forms.IntegerField(label=_("Operation"),
widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-operation'),
associated_model=models.Operation),
validators=[models.valid_id(models.Operation)])
-
+"""
class OperationFormGeneral(forms.Form):
form_label = _("General")
diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py
index f7cc8288c..5c19f050f 100644
--- a/ishtar/furnitures/models.py
+++ b/ishtar/furnitures/models.py
@@ -144,11 +144,12 @@ class LightHistorizedItem(BaseHistorizedItem):
class Departement(models.Model):
label = models.CharField(_(u"Label"), max_length=30)
- number = models.IntegerField(_(u"Number"))
+ number = models.CharField(_(u"Number"), unique=True, max_length=3)
class Meta:
verbose_name = _(u"Departement")
verbose_name_plural = _(u"Departements")
+ ordering = ['number']
def __unicode__(self):
return unicode(self.number) + u" - " + self.label
@@ -669,10 +670,14 @@ if settings.COUNTRY == 'fr':
class Town(models.Model):
name = models.CharField(_(u"Name"), max_length=100)
- surface = models.IntegerField(_(u"Surface"))
- center = models.PointField(_(u"Localisation"), srid=settings.SRID)
+ surface = models.IntegerField(_(u"Surface"), blank=True, null=True)
+ center = models.PointField(_(u"Localisation"), srid=settings.SRID,
+ blank=True, null=True)
if settings.COUNTRY == 'fr':
- numero_insee = models.CharField(u"Numéro INSEE", max_length=5)
+ numero_insee = models.CharField(u"Numéro INSEE", max_length=6,
+ unique=True)
+ departement = models.ForeignKey(Departement, verbose_name=u"Département",
+ null=True, blank=True)
canton = models.ForeignKey(Canton, verbose_name=u"Canton", null=True,
blank=True)
objects = models.GeoManager()
@@ -680,8 +685,12 @@ class Town(models.Model):
class Meta:
verbose_name = _(u"Town")
verbose_name_plural = _(u"Towns")
+ if settings.COUNTRY == 'fr':
+ ordering = ['numero_insee']
def __unicode__(self):
+ if settings.COUNTRY == "fr":
+ return " - ".join((self.name, self.numero_insee))
return self.name
class TreatmentType(GeneralType):
diff --git a/ishtar/furnitures/urls.py b/ishtar/furnitures/urls.py
index 08af1cd42..d20ae6035 100644
--- a/ishtar/furnitures/urls.py
+++ b/ishtar/furnitures/urls.py
@@ -69,8 +69,12 @@ urlpatterns += patterns('ishtar.furnitures.views',
name='autocomplete-organization'),
url(BASE_URL + r'autocomplete-file/$', 'autocomplete_file',
name='autocomplete-file'),
+ url(BASE_URL + r'json-file/$', 'json_file',
+ name='json-file'),
url(BASE_URL + r'autocomplete-operation/$', 'autocomplete_operation',
name='autocomplete-operation'),
+ url(BASE_URL + r'json-operation/$', 'json_operation',
+ name='json-operation'),
url(BASE_URL + r'update-current-item/$', 'update_current_item',
name='update-current-item'),
)
diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py
index 03029cfe4..041ebfb76 100644
--- a/ishtar/furnitures/views.py
+++ b/ishtar/furnitures/views.py
@@ -91,9 +91,8 @@ def autocomplete_town(request):
for q in q.split(' '):
extra = Q(name__icontains=q)
if settings.COUNTRY == 'fr':
- extra = extra | (Q(canton__name__istartswith=q) | \
- Q(canton__arrondissement__name__istartswith=q) | \
- Q(canton__arrondissement__department__label__istartswith=q))
+ extra = (extra | Q(numero_insee__istartswith=q) | \
+ Q(departement__label__istartswith=q))
query = query & extra
limit = 15
towns = models.Town.objects.filter(query)[:limit]
@@ -121,6 +120,52 @@ def autocomplete_file(request):
for file in files])
return HttpResponse(data, mimetype='text/plain')
+def json_file(request):
+ if not request.GET:
+ return HttpResponse(mimetype='text/plain')
+ 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 'json_file' in request.session:
+ dct = request.session['json_file']
+ elif 'file' in request.session:
+ dct = {"pk":request.session['file']}
+ if not dct:
+ return HttpResponse(mimetype='text/plain')
+ else:
+ request.session['json_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')
+ else:
+ files = files.order_by(sign + k)
+ 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')
+
def autocomplete_operation(request, non_closed=True):
if not request.GET.get('term'):
return HttpResponse(mimetype='text/plain')
@@ -142,6 +187,54 @@ def autocomplete_operation(request, non_closed=True):
for operation in operations])
return HttpResponse(data, mimetype='text/plain')
+def json_operation(request, non_closed=True):
+ if not request.GET:
+ return HttpResponse(mimetype='text/plain')
+ 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 'json_operation' in request.session:
+ dct = request.session['json_operation']
+ elif 'operation' in request.session:
+ dct = {"pk":request.session['operation']}
+ if not dct:
+ return HttpResponse(mimetype='text/plain')
+ else:
+ request.session['json_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 = 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')
+
def autocomplete_organization(request, orga_type=None):
if not request.GET.get('term'):
return HttpResponse(mimetype='text/plain')
diff --git a/ishtar/furnitures/widgets.py b/ishtar/furnitures/widgets.py
index dc00f8676..af22c7b3e 100644
--- a/ishtar/furnitures/widgets.py
+++ b/ishtar/furnitures/widgets.py
@@ -48,7 +48,6 @@ class JQueryDate(forms.TextInput):
""" % (name, settings.COUNTRY)
return rendered
-
class JQueryAutoComplete(forms.TextInput):
def __init__(self, source, associated_model=None, options={}, attrs={}):
"""
@@ -121,3 +120,101 @@ objects.get(pk=value))
'js' : self.render_js(name),
}
+class JQueryJqGrid(forms.RadioSelect):
+ COL_TPL = "{name:'%(idx)s', index:'%(idx)s', sortable:true}"
+ class Media:
+ js = ['%s/js/i18n/grid.locale-%s.js' % (settings.MEDIA_URL,
+ settings.COUNTRY),
+ '%s/js/jquery.jqGrid.min.js' % settings.MEDIA_URL,
+ ]
+ css = {'all':['%s/media/ui.jqgrid.css' % settings.MEDIA_URL]}
+
+ def __init__(self, source, form, cols, attrs={}):
+ self.source = source
+ self.form = form
+ self.attrs = attrs
+ self.cols = cols
+
+ 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>
+<h4>%s</h4>
+""" % (name, unicode(_("Search")), unicode(_("Search and select an item")))
+ extra_cols = []
+ col_names, col_idx = [], []
+ 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 ""
+ rendered += """<table id="grid_%s" class='jqgrid'></table>
+<div id="pager_%s"></div>
+<input type="hidden" id="hidden_%s" name="%s">""" % (name, name, name, name)
+ rendered += """
+<script type="text/javascript">
+var query_vars = new Array(%(col_idx)s);
+jQuery(document).ready(function(){
+jQuery("#submit_form").click(function (){
+ var mygrid = jQuery("#grid_%(name)s");
+ jQuery("#hidden_%(name)s").val(mygrid.getGridParam('selrow'));
+ return true;
+});
+jQuery("#search_%(name)s").click(function (){
+ var data = "";
+ for (idx in query_vars)
+ {
+ var key = query_vars[idx];
+ var val = jQuery("#id_"+key).val();
+ if (val){
+ if (data) data += "&";
+ data += key + "=" + val;
+ }
+ }
+ var mygrid = jQuery("#grid_%(name)s");
+ var url = "%(source)s?" + data;
+ mygrid.setGridParam({url:url});
+ mygrid.trigger("reloadGrid");
+ return false;
+});
+
+jQuery("#grid_%(name)s").jqGrid({
+ url:'%(source)s',
+ datatype: "json",
+ mtype: 'GET',
+ colNames:['id', '%(name_label)s'%(col_names)s],
+ colModel:[
+{name:'id', index:'id', hidden:true},
+{name:'value', index:'value'}%(extra_cols)s
+ ],
+ sortname: 'value',
+ viewrecords: true,
+ sortorder: "asc",
+ emptyrecords: "%(no_result)s",
+ loadtext: "%(loading)s",
+ pager: '#pager_%(name)s',
+ pgbuttons: false,
+ pginput: false,
+ width:500
+});
+});
+</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..."))}
+ return rendered
+