summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_finds/admin.py2
-rw-r--r--ishtar_common/admin.py77
-rw-r--r--ishtar_common/templates/admin/import_from_csv.html14
-rw-r--r--ishtar_common/views.py2
4 files changed, 88 insertions, 7 deletions
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py
index a931bfb46..8438f93e3 100644
--- a/archaeological_finds/admin.py
+++ b/archaeological_finds/admin.py
@@ -75,7 +75,7 @@ class TreatmentSourceAdmin(admin.ModelAdmin):
admin.site.register(models.TreatmentSource, TreatmentSourceAdmin)
-class HierarchicalTypeAdmin(admin.ModelAdmin):
+class HierarchicalTypeAdmin(GeneralTypeAdmin):
list_display = ['label', 'txt_idx', 'parent', 'available']
admin.site.register(models.MaterialType, HierarchicalTypeAdmin)
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index f02a70d7a..9f8d2d809 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -20,27 +20,74 @@
"""
Admin description
"""
+import csv
-from django import forms
from django.conf import settings
from django.contrib import admin
-from django.core.exceptions import ObjectDoesNotExist
-from django.utils.translation import ugettext_lazy as _
+from django.http import HttpResponseRedirect
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.template.defaultfilters import slugify
+
+from django import forms
import models
+
+class ImportGenericForm(forms.Form):
+ _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
+ csv_file = forms.FileField(
+ "CSV file", help_text="Only unicode encoding is managed - convert your"
+ " file first")
+
+
+def gen_import_generic(self, request, queryset):
+ form = None
+
+ if 'apply' in request.POST:
+ form = ImportGenericForm(request.POST, request.FILES)
+
+ if form.is_valid():
+ csv_file = request.FILES['csv_file']
+ reader = csv.reader(csv_file)
+ idx = 0
+ for row in reader:
+ slug = slugify(row[0])
+ if self.model.objects.filter(txt_idx=slug).count():
+ continue
+ obj, c = self.model.objects.get_or_create(
+ label=row[0], txt_idx=slug)
+ if c:
+ idx += 1
+ self.message_user(request, "Successfully added %d new items." % (
+ idx))
+ return HttpResponseRedirect(request.get_full_path())
+ if not form:
+ form = ImportGenericForm(
+ initial={'_selected_action':
+ request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})
+ return render_to_response(
+ 'admin/import_from_csv.html', {'csv_form': form},
+ context_instance=RequestContext(request))
+
+gen_import_generic.short_description = "Import from a CSV file"
+
+
class HistorizedObjectAdmin(admin.ModelAdmin):
readonly_fields = ('history_modifier',)
+
def save_model(self, request, obj, form, change):
obj.history_modifier = request.user
obj.save()
+
class DepartmentAdmin(admin.ModelAdmin):
list_display = ('number', 'label',)
model = models.Department
admin.site.register(models.Department, DepartmentAdmin)
+
class OrganizationAdmin(HistorizedObjectAdmin):
list_display = ('name', 'organization_type')
list_filter = ("organization_type",)
@@ -49,6 +96,7 @@ class OrganizationAdmin(HistorizedObjectAdmin):
admin.site.register(models.Organization, OrganizationAdmin)
+
class PersonAdmin(HistorizedObjectAdmin):
list_display = ('name', 'surname', 'raw_name', 'email')
list_filter = ("person_types",)
@@ -57,8 +105,9 @@ class PersonAdmin(HistorizedObjectAdmin):
admin.site.register(models.Person, PersonAdmin)
+
class TownAdmin(admin.ModelAdmin):
- list_display = ['name',]
+ list_display = ['name', ]
search_fields = ['name']
if settings.COUNTRY == 'fr':
list_display += ['numero_insee', 'departement', ]
@@ -68,6 +117,7 @@ class TownAdmin(admin.ModelAdmin):
admin.site.register(models.Town, TownAdmin)
+
class AuthorAdmin(admin.ModelAdmin):
list_display = ['person', 'author_type']
list_filter = ("author_type",)
@@ -75,61 +125,78 @@ class AuthorAdmin(admin.ModelAdmin):
admin.site.register(models.Author, AuthorAdmin)
+
class PersonTypeAdmin(admin.ModelAdmin):
model = models.PersonType
filter_vertical = ('groups',)
admin.site.register(models.PersonType, PersonTypeAdmin)
+
class GlobalVarAdmin(admin.ModelAdmin):
list_display = ['slug', 'description', 'value']
admin.site.register(models.GlobalVar, GlobalVarAdmin)
+
class GeneralTypeAdmin(admin.ModelAdmin):
list_display = ['label', 'txt_idx', 'available']
+ actions = ['import_generic']
+ import_generic = gen_import_generic
-general_models = [models.OrganizationType, models.SourceType, models.AuthorType]
+
+general_models = [models.OrganizationType, models.SourceType,
+ models.AuthorType]
for model in general_models:
admin.site.register(model, GeneralTypeAdmin)
+
class ImporterDefaultValuesInline(admin.TabularInline):
model = models.ImporterDefaultValues
+
class ImporterDefaultAdmin(admin.ModelAdmin):
list_display = ('importer_type', 'target')
model = models.ImporterDefault
inlines = (ImporterDefaultValuesInline,)
admin.site.register(models.ImporterDefault, ImporterDefaultAdmin)
+
class ImporterTypeAdmin(admin.ModelAdmin):
list_display = ('name', 'associated_models', 'is_template')
admin.site.register(models.ImporterType, ImporterTypeAdmin)
+
class RegexpAdmin(admin.ModelAdmin):
list_display = ('name', 'description', "regexp")
admin.site.register(models.Regexp, RegexpAdmin)
+
class ImporterDuplicateFieldInline(admin.TabularInline):
model = models.ImporterDuplicateField
+
class ImportTargetInline(admin.TabularInline):
model = models.ImportTarget
+
class ImporterColumnAdmin(admin.ModelAdmin):
list_display = ('importer_type', 'col_number', 'description', 'required')
list_filter = ('importer_type',)
inlines = (ImporterDuplicateFieldInline, ImportTargetInline)
admin.site.register(models.ImporterColumn, ImporterColumnAdmin)
+
class FormaterTypeAdmin(admin.ModelAdmin):
list_display = ('formater_type', 'options')
admin.site.register(models.FormaterType, FormaterTypeAdmin)
+
class ImportAdmin(admin.ModelAdmin):
list_display = ('importer_type', 'imported_file', 'user', 'state',
'creation_date')
admin.site.register(models.Import, ImportAdmin)
+
class TargetKeyAdmin(admin.ModelAdmin):
list_display = ('target', 'key', 'value', 'is_set')
list_filter = ("is_set",)
diff --git a/ishtar_common/templates/admin/import_from_csv.html b/ishtar_common/templates/admin/import_from_csv.html
new file mode 100644
index 000000000..282cbcca2
--- /dev/null
+++ b/ishtar_common/templates/admin/import_from_csv.html
@@ -0,0 +1,14 @@
+{% extends "admin/base_site.html" %}
+
+{% block content %}
+
+<form action="." method="post" enctype="multipart/form-data">
+{% csrf_token %}
+<table>
+{{ csv_form }}
+</table>
+<input type="hidden" name="action" value="import_generic" />
+<input type="submit" name="apply" value="Import" />
+</form>
+
+{% endblock %}
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 4f089d258..81f394bbb 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -147,7 +147,7 @@ def get_autocomplete_generic(model, extra={'available': True}):
limit = 20
objects = model.objects.filter(query)[:limit]
get_label = lambda x: x.full_label() if hasattr(x, 'full_label') \
- else unicode(x)
+ else unicode(x)
data = json.dumps([{'id': obj.pk, 'value': get_label(obj)}
for obj in objects])
return HttpResponse(data, mimetype='text/plain')