]> git.parisson.com Git - telemeta.git/commitdiff
add replacement method for enumeration value (fixes #99)
authorGuillaume Pellerin <yomguy@parisson.com>
Tue, 17 Dec 2013 17:07:31 +0000 (18:07 +0100)
committerGuillaume Pellerin <yomguy@parisson.com>
Tue, 17 Dec 2013 17:07:31 +0000 (18:07 +0100)
telemeta/templates/telemeta/enumeration_edit_value.html
telemeta/urls.py
telemeta/views/admin.py

index 18bb0b69d55a88cdbd432b80c8ba7971b5949eda..fa45276da3272ce8bb8b08d7dd8fbf7b2925a504 100644 (file)
@@ -9,7 +9,6 @@
    <legend>{% trans "Modify an entry" %}</legend>
    <div class="field">
     <label>{% trans "Value" %}: <input id="id_value_edit" type="text" name="value" value="{{enumeration_record.value}}" /></label>
-
    </div>
    <br />
    <div class="buttons">
    </div>
   </fieldset>
  </form>
-  <br style="clear: right"/>
+
+ <form class="mod" id="replenum" method="post"
+    action="{% url telemeta-enumeration-replace enumeration_id,enumeration_record.id %}">{% csrf_token %}
+  <fieldset>
+   <legend>{% trans "Replace by" %}</legend>
+   <div class="field">
+    <select name="value">
+    {% for record in enumeration_records %}
+      <option value="{{ record.id }}" />{{ record.value }}</option>
+    {% endfor %}
+    </select>
+    <input type="checkbox" name="delete" value="delete"> {% trans "delete value after replacing" %}
+   </div>
+   <br />
+   <div class="buttons">
+        <a href="#" class="component_icon button icon_save"
+   onclick="document.getElementById('replenum').submit(); return false;">{% trans "Replace" %}</a>
+        <a href="{% url telemeta-enumeration-edit enumeration_id %}"
+           class="component_icon button icon_cancel">{% trans "Cancel" %}</a>
+   </div>
+  </fieldset>
+ </form>
+<br style="clear: right"/>
 
 {% endblock %}
index 40a484ea43afbf277de349eb2e202cff3d1a49bc..1c8bbedf990033224bc6f6b4e5b2724616e72ccd 100644 (file)
@@ -252,6 +252,10 @@ urlpatterns = patterns('',
         + r'(?P<value_id>[0-9]+)/update/$',
         admin_view.update_enumeration_value,
         name="telemeta-enumeration-record-update"),
+    url(r'^admin/enumerations/(?P<enumeration_id>[0-9a-z]+)/'
+        + r'(?P<value_id>[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"),
index ef8acb8053a2b684630c12478694493807c3bb53..f3b37c21065e993ce4aab1514b34e12caf364a4a 100644 (file)
@@ -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)