diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2015-09-23 22:43:59 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2015-09-23 22:44:31 +0200 |
commit | d23f19fe226ffe900c5f00c3deed65de2a5a47b1 (patch) | |
tree | 36ad98bde6c927e16ddbb88380fd4e3b80e197a8 | |
parent | 4e937bb9391f719ba5073e183b5fa30db2237fd0 (diff) | |
download | Ishtar-d23f19fe226ffe900c5f00c3deed65de2a5a47b1.tar.bz2 Ishtar-d23f19fe226ffe900c5f00c3deed65de2a5a47b1.zip |
Add an action in admin for importing general types from CSV
-rw-r--r-- | archaeological_finds/admin.py | 2 | ||||
-rw-r--r-- | ishtar_common/admin.py | 77 | ||||
-rw-r--r-- | ishtar_common/templates/admin/import_from_csv.html | 14 | ||||
-rw-r--r-- | ishtar_common/views.py | 2 |
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') |