From: Guillaume Pellerin Date: Tue, 17 Dec 2013 17:07:31 +0000 (+0100) Subject: add replacement method for enumeration value (fixes #99) X-Git-Tag: 1.4.5~3^2~9 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=d85cf24a131ba45d35386afa30d4383dae3df5bb;p=telemeta.git add replacement method for enumeration value (fixes #99) --- 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)