From d85cf24a131ba45d35386afa30d4383dae3df5bb Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Tue, 17 Dec 2013 18:07:31 +0100 Subject: [PATCH] add replacement method for enumeration value (fixes #99) --- .../telemeta/enumeration_edit_value.html | 26 ++++++++++++-- telemeta/urls.py | 4 +++ telemeta/views/admin.py | 35 +++++++++++++++---- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/telemeta/templates/telemeta/enumeration_edit_value.html b/telemeta/templates/telemeta/enumeration_edit_value.html index 18bb0b69..fa45276d 100644 --- a/telemeta/templates/telemeta/enumeration_edit_value.html +++ b/telemeta/templates/telemeta/enumeration_edit_value.html @@ -9,7 +9,6 @@ {% trans "Modify an entry" %}
-

@@ -20,6 +19,29 @@
-
+ +
{% csrf_token %} +
+ {% trans "Replace by" %} +
+ + {% trans "delete value after replacing" %} +
+
+ +
+
+ +
{% endblock %} diff --git a/telemeta/urls.py b/telemeta/urls.py index 40a484ea..1c8bbedf 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -252,6 +252,10 @@ urlpatterns = patterns('', + r'(?P[0-9]+)/update/$', admin_view.update_enumeration_value, name="telemeta-enumeration-record-update"), + url(r'^admin/enumerations/(?P[0-9a-z]+)/' + + r'(?P[0-9]+)/replace/$', + admin_view.replace_enumeration_value, + name="telemeta-enumeration-replace"), # Geographic browsing url(r'^geo/$', geo_view.list_continents, name="telemeta-geo-continents"), diff --git a/telemeta/views/admin.py b/telemeta/views/admin.py index ef8acb80..f3b37c21 100644 --- a/telemeta/views/admin.py +++ b/telemeta/views/admin.py @@ -134,6 +134,8 @@ class AdminView(object): vars["enumeration_id"] = enumeration._meta.module_name vars["enumeration_name"] = enumeration._meta.verbose_name vars["enumeration_record"] = enumeration.objects.get(id__exact=value_id) + vars["enumeration_records"] = enumeration.objects.all() + return render(request, 'telemeta/enumeration_edit_value.html', vars) @method_decorator(permission_required('telemeta.change_keyword')) @@ -152,15 +154,34 @@ class AdminView(object): @method_decorator(permission_required('telemeta.change_keyword')) def replace_enumeration_value(self, request, enumeration_id, value_id): - if request.method == 'POST': - enumeration = self.__get_enumeration(enumeration_id) - if enumeration == None: - raise Http404 + enumeration = self.__get_enumeration(enumeration_id) + to_value_id = request.POST["value"] + delete = False + if 'delete' in request.POST.keys(): + delete = True - record = enumeration.objects.get(id__exact=value_id) - record.value = request.POST["value"] - record.save() + if enumeration == None: + raise Http404 + + from_record = enumeration.objects.get(id__exact=value_id) + to_record = enumeration.objects.get(id__exact=to_value_id) + links = [rel.get_accessor_name() for rel in from_record._meta.get_all_related_objects()] + + for link in links: + objects = getattr(from_record, link).all() + for obj in objects: + for name in obj._meta.get_all_field_names(): + try: + field = obj._meta.get_field(name) + if type(field) == WeakForeignKey: + if field.rel.to == enumeration: + setattr(obj, name, to_record) + obj.save() + except: + continue + if delete: + from_record.delete() return self.edit_enumeration(request, enumeration_id) -- 2.39.5