Commits

hirunatan committed cf39716

Entity change proposal form working

Comments (0)

Files changed (15)

src/macadjan_base/forms.py

 class EntityProposalForm(forms.ModelForm):
 
     captcha = CaptchaField(
-            label = _(u'Clave de seguridad'),
-            help_text = _(u'Introduce el texto que ves en la imagen (esto es para evitar spam).'))
+        label = _(u'Clave de seguridad'),
+        help_text = _(u'Introduce el texto que ves en la imagen (esto es para evitar spam).')
+    )
 
     class Meta:
         model = models.EntityProposal
-        exclude = ('existing_entity', 'status', 'status_info', 'creation_date', 'modification_date', 'map_source')
+        exclude = ('existing_entity', 'status', 'status_info', 'internal_comment', 'creation_date', 'modification_date', 'map_source')
 
     def __init__(self, *args, **kwargs):
         super(EntityProposalForm, self).__init__(*args, **kwargs)

src/macadjan_base/models.py

             help_text = _(u'Un posible nombre alternativo para la entidad.'))
     summary = models.CharField(max_length = 300, null = False, blank = True,
             verbose_name = _(u'Resumen'),
-            help_text = _(u'Descripción breve (para salir en el globo).'))
+            help_text = _(u'Descríbela en una frase.'))
 
     # Container info
     is_container = models.BooleanField(
             help_text = _(u'Un posible nombre alternativo para la entidad.'))
     summary = models.CharField(max_length = 300, null = False, blank = True,
             verbose_name = _(u'Resumen'),
-            help_text = _(u'Descripción breve (para salir en el globo).'))
+            help_text = _(u'Descríbela en una frase.'))
 
     # Other subcategories
     subcategories = models.ManyToManyField(SubCategory, related_name = 'entity_proposals', blank = True,
             current_status = self._current_status
             self._current_status = self.status
             if current_status == EntityProposal.STATUS_PENDING \
-               and self.status == EntityProposal.STATUS_ACCEPTED \
-               and not self.existing_entity:
-                self.generate_entity()
+               and self.status == EntityProposal.STATUS_ACCEPTED:
+                if not self.existing_entity:
+                    self.generate_entity()
+                else:
+                    self.update_entity()
                 self.send_mail_accepted()
             if current_status == EntityProposal.STATUS_PENDING \
                and self.status == EntityProposal.STATUS_REJECTED:
     def active_subcategories(self):
         return self.subcategories.filter(is_active = True)
 
+    def load_from_entity(self, entity):
+        self.existing_entity = entity
+        self.name = entity.name
+        slug = entity.slug
+        self.alias = entity.alias
+        self.summary = entity.summary
+        is_container = entity.is_container
+        contained_in = entity.contained_in
+        self.latitude = entity.latitude
+        self.longitude = entity.longitude
+        self.address_1 = entity.address_1
+        self.address_2 = entity.address_2
+        self.zipcode = entity.zipcode
+        self.city = entity.city
+        self.province = entity.province
+        self.country = entity.country
+        self.zone = entity.zone
+        self.contact_phone_1 = entity.contact_phone_1
+        self.contact_phone_2 = entity.contact_phone_2
+        self.fax = entity.fax
+        self.email = entity.email
+        self.email_2 = entity.email_2
+        self.web = entity.web
+        self.web_2 = entity.web_2
+        self.contact_person = entity.contact_person
+        self.creation_year = entity.creation_year
+        self.legal_form = entity.legal_form
+        self.description = entity.description
+        self.goals = entity.goals
+        self.finances = entity.finances
+        self.social_values = entity.social_values
+        self.how_to_access = entity.how_to_access
+        self.networks_member = entity.networks_member
+        self.networks_works_with = entity.networks_works_with
+        self.ongoing_projects = entity.ongoing_projects
+        self.needs = entity.needs
+        self.offerings = entity.offerings
+        self.additional_info = entity.additional_info
+        self.map_source = entity.map_source
+        creation_date = None, # will be autogenerated
+        modification_date = None, # will be autogenerated
+        self.entity_type = entity.entity_type
+        self.main_subcategory = entity.main_subcategory
+        self.save()
+
+        for subcat in entity.subcategories.all():
+            self.subcategories.add(subcat)
+
     def generate_entity(self):
         entity = Entity.objects.create(
                 name = self.name,
         self.save()
         task__geolocalize_entity.delay(self.existing_entity.pk)
 
+    def update_entity(self):
+        if self.existing_entity.name != self.name:
+            self.existing_entity.name = self.name
+            self.existing_entity.slug = slugify_uniquely(self.existing_entity.name, self.existing_entity.__class__)
+        self.existing_entity.alias = self.alias
+        self.existing_entity.summary = self.summary
+        self.existing_entity.is_container = False
+        self.existing_entity.contained_in = None
+        if self.latitude and self.longitude:
+            self.existing_entity.latitude = self.latitude
+            self.existing_entity.longitude = self.longitude
+        self.existing_entity.address_1 = self.address_1
+        self.existing_entity.address_2 = self.address_2
+        self.existing_entity.zipcode = self.zipcode
+        self.existing_entity.city = self.city
+        self.existing_entity.province = self.province
+        self.existing_entity.country = self.country
+        self.existing_entity.zone = self.zone
+        self.existing_entity.contact_phone_1 = self.contact_phone_1
+        self.existing_entity.contact_phone_2 = self.contact_phone_2
+        self.existing_entity.fax = self.fax
+        self.existing_entity.email = self.email
+        self.existing_entity.email_2 = self.email_2
+        self.existing_entity.web = self.web
+        self.existing_entity.web_2 = self.web_2
+        self.existing_entity.contact_person = self.contact_person
+        self.existing_entity.creation_year = self.creation_year
+        self.existing_entity.legal_form = self.legal_form
+        self.existing_entity.description = self.description
+        self.existing_entity.goals = self.goals
+        self.existing_entity.finances = self.finances
+        self.existing_entity.social_values = self.social_values
+        self.existing_entity.how_to_access = self.how_to_access
+        self.existing_entity.networks_member = self.networks_member
+        self.existing_entity.networks_works_with = self.networks_works_with
+        self.existing_entity.ongoing_projects = self.ongoing_projects
+        self.existing_entity.needs = self.needs
+        self.existing_entity.offerings = self.offerings
+        self.existing_entity.additional_info = self.additional_info
+        self.existing_entity.map_source = self.map_source
+        self.existing_entity.is_active = True
+        self.existing_entity.entity_type = self.entity_type
+        self.existing_entity.main_subcategory = self.main_subcategory
+        self.existing_entity.save()
+
+        self.existing_entity.subcategories.clear()
+        for subcat in self.subcategories.all():
+            self.existing_entity.subcategories.add(subcat)
+
     def send_mail_accepted(self):
         self.send_mail(True)
 
         if self.proponent_email:
             current_site = Site.objects.get_current()
             site_info = current_site.site_info
+            if self.existing_entity:
+                action = _(u'actualizar')
+            else:
+                action = _(u'dar de alta')
 
             if accepted:
-                email_subject = _(u'Hemos aceptado tu solicitud para dar de alta %(entity_name)s en %(website_name)s') % \
-                               {'entity_name': self.name,
-                                'website_name': site_info.website_name}
+                email_subject = _(u'Hemos aceptado tu solicitud para %(action)s %(entity_name)s en %(website_name)s') % {
+                    'entity_name': self.name,
+                    'action': action,
+                    'website_name': site_info.website_name
+                }
             else:
-                email_subject = _(u'Hemos rechazado tu solicitud para dar de alta %(entity_name)s en %(website_name)s') % \
-                               {'entity_name': self.name,
-                                'website_name': site_info.website_name}
+                email_subject = _(u'Hemos rechazado tu solicitud para %(action)s %(entity_name)s en %(website_name)s') % {
+                    'entity_name': self.name,
+                    'action': action,
+                    'website_name': site_info.website_name
+                }
             email_from = settings.DEFAULT_FROM_EMAIL
             email_to = (self.proponent_email,)
             email_context = Context({
                 'entity_name': self.name,
+                'action': action,
                 'status_info': self.status_info,
                 'website_name': site_info.website_name,
             })

src/macadjan_base/templates/macadjan_base/email_notify_accept_to_proponent.txt

-Hemos aceptado tu solicitud para dar de alta {{ entity_name }}
-en {{ website_name }}.
+{% load i18n %}{% blocktrans with action=action entity_name=entity_name website_name=website_name %}Hemos aceptado tu solicitud para {{ action }} {{ entity_name }}
+en {{ website_name }}.{% endblocktrans %}
 
-Puedes ver el resultado en
+{% trans 'Puedes ver el resultado en' %}
 {{ entity_url }}
-
 {% if status_info %}
-Aquí puedes ver los comentarios de los administradores:
+{% trans 'Aquí puedes ver los comentarios de los administradores:' %}
 {{ status_info }}
 {% endif %}
-
-Esperamos que esté todo correcto. Si tienes cualquier duda, o comentario,
+{% blocktrans %}Esperamos que esté todo correcto. Si tienes cualquier duda, o comentario,
 ponte en contacto con nosotros y te atenderemos con mucho gusto.
 
-¡Muchas gracias por tu aportación! Un saludo.
+¡Muchas gracias por tu aportación! Un saludo.{% endblocktrans %}
 

src/macadjan_base/templates/macadjan_base/email_notify_proposal_to_managers.txt

-Se ha recibido la solicitud para dar de alta la entidad {{ entity_name }}.
+{% load i18n %}{% blocktrans with action=action entity_name=entity_name %}Se ha recibido la solicitud para {{ action }} la entidad {{ entity_name }}.{% endblocktrans %}
 
 {{ sender }}
 
 {{ comment }}
 
-Para tramitar la propuesta, ir aquí:
+{% trans 'Para tramitar la propuesta, ir aquí:' %}
 
 {{ link }}
 

src/macadjan_base/templates/macadjan_base/email_notify_proposal_to_proponent.txt

-Hemos recibido tu solicitud para dar de alta {{ entity_name }}
-en {{ website_name }}.
+{% load i18n %}{% blocktrans with action=action entity_name=entity_name website_name=website_name %}Hemos recibido tu solicitud para {{ action }} {{ entity_name }}
+en {{ website_name }}.{% endblocktrans %}
 
-Nos pondremos con ella y la subiremos al mapa lo antes posible, si está todo
+{% blocktrans %}Nos pondremos con ella y la subiremos al mapa lo antes posible, si está todo
 correcto. Recibirás otro mensaje en el momento en que la subamos, o también
 si decidimos que no la podemos subir, por algún motivo.
 
 En todo caso, no dudes en contactar con nosotros si lo crees necesario, para
 ello consulta la sección de contacto de la web.
 
-¡Un saludo!
+¡Un saludo!{% endblocktrans %}
 

src/macadjan_base/templates/macadjan_base/email_notify_reject_to_proponent.txt

-No hemos aceptado tu solicitud para dar de alta {{ entity_name }}
-en {{ website_name }}.
+{% load i18n %}{% blocktrans with action=action entity_name=entity_name website_name=website_name %}No hemos aceptado tu solicitud para {{ action }} {{ entity_name }}
+en {{ website_name }}.{% endblocktrans %}
 
-Lo sentimos, hemos decidido no incorporar tu propuesta en el mapa,
-al menos por ahora.
-
+{% blocktrans %}Lo sentimos, hemos decidido no incorporar tu propuesta en el mapa,
+al menos por ahora.{% endblocktrans %}
 {% if status_info %}
-Aquí puedes ver los comentarios de los administradores:
+{% trans 'Aquí puedes ver los comentarios de los administradores:' %}
 {{ status_info }}
 {% else %}
-Los administradores no han indicado más información.
+{% trans 'Los administradores no han indicado más información.' %}
 {% endif %}
-
-Si necesitas saber algo más o tienes cualquier duda, o comentario,
+{% blocktrans %}Si necesitas saber algo más o tienes cualquier duda, o comentario,
 ponte en contacto con nosotros y te atenderemos con mucho gusto.
 
-Gracias de todos modos por tu aportación. Un saludo.
+Gracias de todos modos por tu aportación. Un saludo.{% endblocktrans %}
 

src/macadjan_base/templates/macadjan_base/entity.html

 <h3>{% trans "Última actualización de la ficha:" %}</h3>
 <p>{{ entity.modification_date|date:"DATE_FORMAT" }}</p>
 
+{% if current_site_info.entity_change_proposal_enabled %}
+{% url 'base:entity-proposal' entity_slug=entity.slug as modify_url %}
+<p>{% blocktrans with modify_url=modify_url %}¿Quieres modificar los datos de esta ficha? Usa el <a href="{{ modify_url }}"> formulario de solicitud</a>{% endblocktrans %}
+{% endif %}
+
 {% endblock %}
 

src/macadjan_base/templates/macadjan_base/entity_proposal.html

+{% extends "base.html" %}
+{% load i18n %}
+{% load url from future %}
+
+{% block title %}{% trans 'Proponer nueva entidad' %} - {{ current_site_info.website_name }}{% endblock %}
+
+{% block content %}
+    {% if entity %}
+        <iframe src="{% url "base:entity-proposal-iframe" entity_slug=entity.slug %}"
+            frameborder="0" scrolling="auto" width="100%" height="4500px">
+            {% trans "Debes tener un navegador que soporte iframes para poder ver el formulario." %}
+        </iframe>
+    {% else %}
+        <iframe src="{% url "base:entity-proposal-iframe" %}"
+            frameborder="0" scrolling="auto" width="100%" height="4500px">
+            {% trans "Debes tener un navegador que soporte iframes para poder ver el formulario." %}
+        </iframe>
+    {% endif %}
+{% endblock %}
+

src/macadjan_base/templates/macadjan_base/entity_proposal_iframe.html

+{% load url from future %}
+{% load i18n %}
+{% load l10n %}
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>{% trans 'Proponer nueva entidad' %} - {{ current_site_info.website_name }}</title>
+    <link type="text/css" rel="stylesheet" media="screen" href="{{ STATIC_URL }}{{ current_theme.styles_url }}/styles_iframe.css" />
+    <script type="text/javascript" src="{{ STATIC_URL }}macadjan_base/scripts/jquery-1.6.2.min.js"></script>
+</head>
+
+<body>
+    {% if not form.instance.existing_entity %}
+    <h1>{% trans 'Proponer una nueva entidad' %}</h1>
+    <p>{% trans '¿Quieres aparecer en el mapa? Rellena este formulario y te daremos de alta.' %}</p>
+    {% else %}
+    <h1>{% blocktrans with entity_name=form.instance.existing_entity.name %}Modificar datos de {{ entity_name }}{% endblocktrans %}</h1>
+    <p>{% trans '¿Quieres modificar los datos que salen en el mapa? Rellena este formulario y los cambiaremos.' %}</p>
+    {% endif %}
+    {% blocktrans %}
+        <p>Asegúrate de ser la persona titular de esta información, o de contar con su autorización.</p>
+        <p>Las casillas con (*) son obligatorias, el resto son opcionales, pero cuanto más información nos des,
+        más útil será la ficha para los visitantes del mapa. Como mínimo procura rellenar la casilla Descripción
+        y algún dato de contacto (teléfono, web, email, etc.). Además deberás rellenar la dirección o bien las
+        casillas Latitud/Longitud si quieres salir en el mapa; de lo contrario la entidad aparecerá listada en
+        la pestaña "Entidades sin ubicación geográfica".</p>
+    {% endblocktrans %}
+
+    {% if messages %}
+        <ul class="messages">
+            {% for message in messages %}
+                <li{% if message.tags %} class="{{message.tags}}"{% endif %}>{{ message }}</li>
+            {% endfor %}
+        </ul>
+    {% endif %}
+
+    <form name="proposal_form" method="post">
+    <table>
+        {% csrf_token %}
+
+        <table width="100%" class="form_table">
+            <colgroup>
+                <col width="20%"/>
+                <col width="30%"/>
+                <col width="50%"/>
+            </colgroup>
+            <tbody>
+                {% for field in form %}
+                    <tr>
+                        <th>
+                            {{ field.label_tag }}
+                            {% if field.field.required %} (*){% endif %}
+                        </th>
+                        <td>
+                            {{ field }}
+                            {{ field.errors }}
+                        </td>
+                        <td class="help_text">
+                            {{ field.help_text }}
+                            {% if field.field.hints %}
+                                <br/>
+                                <a href="#" id="open_hint_{{ field.name }}">{% trans 'Más ayuda' %}</a>
+                                <a href="#" id="close_hint_{{ field.name }}">{% trans 'Cerrar' %}</a>
+                                <div id="hint_content_{{ field.name }}">
+                                    <p>{{ field.field.hints|linebreaksbr }}</p>
+                                </div>
+                                <script>
+                                    $("#close_hint_{{ field.name }}").hide();
+                                    $("#hint_content_{{ field.name }}").hide();
+                                    $('#open_hint_{{ field.name }}').click(function(){
+                                        $("#open_hint_{{ field.name }}").hide();
+                                        $("#close_hint_{{ field.name }}").show();
+                                        $("#hint_content_{{ field.name }}").show();
+                                    });
+                                    $('#close_hint_{{ field.name }}').click(function(){
+                                        $("#open_hint_{{ field.name }}").show();
+                                        $("#close_hint_{{ field.name }}").hide();
+                                        $("#hint_content_{{ field.name }}").hide();
+                                    });
+                                </script>
+                            {% endif %}
+                        </td>
+                    </tr>
+                {% endfor %}
+            </tbody>
+        </table>
+        <div class="boton_principal">
+            <input type="submit" name="submit_form" value="{% trans 'Enviar' %}"/>
+        </div>
+        <div>
+            {% blocktrans %}
+            <p>La información aquí enviada, en caso de ser aprobada, pasará a formar parte de la base de datos de
+            este mapa con el fin de ser mostrada públicamente en el mismo, o también posiblemente en otro de los
+            mapas de la red de mapeo de alternativas en la que este mapa está integrado.</p>
+            <p>Una excepción son las casillas "Email de quien hace la propuesta" y "Comentarios de la propuesta",
+            que no se mostrarán nunca al público, y serán usadas exclusivamente para ponernos en contacto con esa
+            persona y notificar el estado de la propuesta, si es o no aceptada, y por qué.</p>
+            <p>En cualquier caso, quien hace la propuesta o la entidad en sí puede contactar con nosotros para
+            consultar, modificar o borrar cualquiera de los datos, consultando la sección de contacto de esta web.</p>
+            {% endblocktrans %}
+        </div>
+    </form>
+
+    {% include "include_piwik_tracking.html" %}
+
+</body>
+</html>
+

src/macadjan_base/templates/macadjan_base/entity_proposal_ok.html

+{% load url from future %}
+{% load i18n %}
+{% load l10n %}
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>{% trans 'Proponer nueva entidad' %} - {{ current_site_info.website_name }}</title>
+    <link type="text/css" rel="stylesheet" media="screen" href="{{ STATIC_URL }}{{ current_theme.styles_url }}/styles_iframe.css" />
+</head>
+<body>
+    <h1>{% trans 'Proponer una nueva entidad' %}</h1>
+    <p>{% trans 'Tu propuesta ha sido enviada, la revisaremos y la incluiremos en el mapa lo antes posible. Comprueba tu correo, te hemos enviado un mensaje de confirmación.' %}</p>
+    {% include "include_piwik_tracking.html" %}
+</body>
+</html>
+

src/macadjan_base/templates/macadjan_base/new_entity_proposal.html

-{% extends "base.html" %}
-{% load i18n %}
-{% load url from future %}
-
-{% block title %}{% trans 'Proponer nueva entidad' %} - {{ current_site_info.website_name }}{% endblock %}
-
-{% block content %}
-    <iframe src="{% url "base:new-entity-proposal-iframe" %}"
-        frameborder="0" scrolling="auto" width="100%" height="4500px">
-        {% trans "Debes tener un navegador que soporte iframes para poder ver el formulario." %}
-    </iframe>
-{% endblock %}
-

src/macadjan_base/templates/macadjan_base/new_entity_proposal_iframe.html

-{% load url from future %}
-{% load i18n %}
-{% load l10n %}
-<html>
-<head>
-    <meta charset="utf-8" />
-    <title>{% trans 'Proponer nueva entidad' %} - {{ current_site_info.website_name }}</title>
-    <link type="text/css" rel="stylesheet" media="screen" href="{{ STATIC_URL }}{{ current_theme.styles_url }}/styles_iframe.css" />
-    <script type="text/javascript" src="{{ STATIC_URL }}macadjan_base/scripts/jquery-1.6.2.min.js"></script>
-</head>
-
-<body>
-    <h1>{% trans 'Proponer una nueva entidad' %}</h1>
-    {% blocktrans %}
-        <p>¿Quieres aparecer en el mapa? Rellena este formulario y te daremos de alta.</p>
-        <p>Asegúrate de ser la persona titular de esta información, o de contar con su autorización.</p>
-        <p>Las casillas con (*) son obligatorias, el resto son opcionales, pero cuanto más información nos des,
-        más útil será la ficha para los visitantes del mapa. Como mínimo procura rellenar la casilla Descripción
-        y algún dato de contacto (teléfono, web, email, etc.). Además deberás rellenar la dirección o bien las
-        casillas Latitud/Longitud si quieres salir en el mapa; de lo contrario la entidad aparecerá listada en
-        la pestaña "Entidades sin ubicación geográfica".</p>
-    {% endblocktrans %}
-
-    {% if messages %}
-        <ul class="messages">
-            {% for message in messages %}
-                <li{% if message.tags %} class="{{message.tags}}"{% endif %}>{{ message }}</li>
-            {% endfor %}
-        </ul>
-    {% endif %}
-
-    <form name="proposal_form" method="post">
-    <table>
-        {% csrf_token %}
-
-        <table width="100%" class="form_table">
-            <colgroup>
-                <col width="20%"/>
-                <col width="30%"/>
-                <col width="50%"/>
-            </colgroup>
-            <tbody>
-                {% for field in form %}
-                    <tr>
-                        <th>
-                            {{ field.label_tag }}
-                            {% if field.field.required %} (*){% endif %}
-                        </th>
-                        <td>
-                            {{ field }}
-                            {{ field.errors }}
-                        </td>
-                        <td class="help_text">
-                            {{ field.help_text }}
-                            {% if field.field.hints %}
-                                <br/>
-                                <a href="#" id="open_hint_{{ field.name }}">{% trans 'Más ayuda' %}</a>
-                                <a href="#" id="close_hint_{{ field.name }}">{% trans 'Cerrar' %}</a>
-                                <div id="hint_content_{{ field.name }}">
-                                    <p>{{ field.field.hints|linebreaksbr }}</p>
-                                </div>
-                                <script>
-                                    $("#close_hint_{{ field.name }}").hide();
-                                    $("#hint_content_{{ field.name }}").hide();
-                                    $('#open_hint_{{ field.name }}').click(function(){
-                                        $("#open_hint_{{ field.name }}").hide();
-                                        $("#close_hint_{{ field.name }}").show();
-                                        $("#hint_content_{{ field.name }}").show();
-                                    });
-                                    $('#close_hint_{{ field.name }}').click(function(){
-                                        $("#open_hint_{{ field.name }}").show();
-                                        $("#close_hint_{{ field.name }}").hide();
-                                        $("#hint_content_{{ field.name }}").hide();
-                                    });
-                                </script>
-                            {% endif %}
-                        </td>
-                    </tr>
-                {% endfor %}
-            </tbody>
-        </table>
-        <div class="boton_principal">
-            <input type="submit" name="submit_form" value="{% trans 'Enviar' %}"/>
-        </div>
-        <div>
-            {% blocktrans %}
-            <p>La información aquí enviada, en caso de ser aprobada, pasará a formar parte de la base de datos de
-            este mapa con el fin de ser mostrada públicamente en el mismo, o también posiblemente en otro de los
-            mapas de la red de mapeo de alternativas en la que este mapa está integrado.</p>
-            <p>Una excepción son las casillas "Email de quien hace la propuesta" y "Comentarios de la propuesta",
-            que no se mostrarán nunca al público, y serán usadas exclusivamente para ponernos en contacto con esa
-            persona y notificar el estado de la propuesta, si es o no aceptada, y por qué.</p>
-            <p>En cualquier caso, quien hace la propuesta o la entidad en sí puede contactar con nosotros para
-            consultar, modificar o borrar cualquiera de los datos, consultando la sección de contacto de esta web.</p>
-            {% endblocktrans %}
-        </div>
-    </form>
-
-    {% include "include_piwik_tracking.html" %}
-
-</body>
-</html>
-

src/macadjan_base/templates/macadjan_base/new_entity_proposal_ok.html

-{% load url from future %}
-{% load i18n %}
-{% load l10n %}
-<html>
-<head>
-    <meta charset="utf-8" />
-    <title>{% trans 'Proponer nueva entidad' %} - {{ current_site_info.website_name }}</title>
-    <link type="text/css" rel="stylesheet" media="screen" href="{{ STATIC_URL }}{{ current_theme.styles_url }}/styles_iframe.css" />
-</head>
-<body>
-    <h1>{% trans 'Proponer una nueva entidad' %}</h1>
-    <p>{% trans 'Tu propuesta ha sido enviada, la revisaremos y la incluiremos en el mapa lo antes posible. Comprueba tu correo, te hemos enviado un mensaje de confirmación.' %}</p>
-    {% include "include_piwik_tracking.html" %}
-</body>
-</html>
-

src/macadjan_base/urls.py

 
 urlpatterns = patterns('',
     url(r'^$', Home.as_view(), name='home'),
-    
+
     # Main page with the category menu and the map.
     url(r'^map/(?P<category_slug>[a-zA-Z0-9_\-]+)/(?P<subcategory_slug>[a-zA-Z0-9_\-]+)/$',
         Map.as_view(), name='map'),
     url(r'^import/$', ImportSelect.as_view(), name='import-select'),
     url(r'^import/(?P<importer_name>[a-zA-Z0-9_\-]+)/$', Import.as_view(), name='import'),
     url(r'^import/(?P<importer_name>[a-zA-Z0-9_\-]+)/finish/$', ImportFinish.as_view(), name='import-finish'),
-    
-    # New entity proposal form.
-    url(r'^new_entity_proposal/$', NewEntityProposal.as_view(), name='new-entity-proposal'),
-    url(r'^new_entity_proposal_iframe/$', NewEntityProposalIframe.as_view(), name='new-entity-proposal-iframe'),
-    url(r'^new_entity_proposal/ok$', NewEntityProposalOk.as_view(), name='new-entity-proposal-ok'),
+
+    # Entity proposal form.
+    url(r'^entity_proposal/(?P<entity_slug>[a-zA-Z0-9_\-]+)/$', EntityProposal.as_view(), name='entity-proposal'),
+    url(r'^entity_proposal/$', EntityProposal.as_view(), name='entity-proposal'),
+    url(r'^entity_proposal_iframe/(?P<entity_slug>[a-zA-Z0-9_\-]+)/$', EntityProposalIframe.as_view(), name='entity-proposal-iframe'),
+    url(r'^entity_proposal_iframe/$', EntityProposalIframe.as_view(), name='entity-proposal-iframe'),
+    url(r'^entity_proposal/ok/(?P<entity_slug>[a-zA-Z0-9_\-]+)/$', EntityProposalOk.as_view(), name='entity-proposal-ok'),
+    url(r'^entity_proposal/ok/$', EntityProposalOk.as_view(), name='entity-proposal-ok'),
 )
 

src/macadjan_base/views.py

         return super(ImportFinish, self).dispatch(request, *args, **kwargs)
 
 
-class NewEntityProposal(TemplateView):
-    template_name = 'macadjan_base/new_entity_proposal.html'
+class EntityProposal(TemplateView):
+    template_name = 'macadjan_base/entity_proposal.html'
 
-    def dispatch(self, request, *args, **kwargs):
+    def dispatch(self, request, entity_slug = None, *args, **kwargs):
         if not Site.objects.get_current().site_info.new_entity_proposal_enabled :
-            raise Http404()
-        return super(NewEntityProposal, self).dispatch(request, *args, **kwargs)
+            raise Http404('Entry proposal form is disabled')
+        self.entity = get_object_or_404(models.Entity, slug = entity_slug) if entity_slug else None
+        return super(EntityProposal, self).dispatch(request, *args, **kwargs)
 
+    def get_context_data(self, **kwargs):
+        context = super(EntityProposal, self).get_context_data(**kwargs)
+        context.update({
+                'entity': self.entity,
+            })
+        return context
 
-class NewEntityProposalIframe(FormView):
-    template_name = 'macadjan_base/new_entity_proposal_iframe.html'
+
+class EntityProposalIframe(FormView):
+    template_name = 'macadjan_base/entity_proposal_iframe.html'
     form_class = forms.EntityProposalForm
 
+    def get_form_kwargs(self):
+        kwargs = super(EntityProposalIframe, self).get_form_kwargs()
+        if self.entity:
+            instance = models.EntityProposal()
+            instance.load_from_entity(self.entity)
+            kwargs.update({'instance': instance})
+            instance.delete()  # remove from db but still useful to render the form
+        return kwargs
+
     def get_success_url(self):
-        return reverse('base:new-entity-proposal-ok')
+        if self.entity:
+            return reverse('base:entity-proposal-ok', args=[self.entity.slug])
+        else:
+            return reverse('base:entity-proposal-ok')
 
     def form_valid(self, form):
         proposal = form.save()
-        self.send_mail_to_managers(proposal)
-        self.send_mail_to_proponent(proposal)
-        return super(NewEntityProposalIframe, self).form_valid(form)
+        if proposal.existing_entity:
+            action = _(u'actualizar')
+        else:
+            action = _(u'dar de alta')
+        self.send_mail_to_managers(proposal, action)
+        self.send_mail_to_proponent(proposal, action)
+        return super(EntityProposalIframe, self).form_valid(form)
 
     def form_invalid(self, form):
         messages.error(self.request, _(u'Ha habido algún error, comprueba los mensajes más abajo.'))
-        return super(NewEntityProposalIframe, self).form_invalid(form)
+        return super(EntityProposalIframe, self).form_invalid(form)
 
-    def dispatch(self, request, *args, **kwargs):
-        if not Site.objects.get_current().site_info.new_entity_proposal_enabled:
-            raise Http404()
-        return super(NewEntityProposalIframe, self).dispatch(request, *args, **kwargs)
+    def dispatch(self, request, entity_slug = None, *args, **kwargs):
+        if not entity_slug:
+            if not Site.objects.get_current().site_info.new_entity_proposal_enabled:
+                raise Http404('Entry proposal form is disabled')
+        else:
+            if not Site.objects.get_current().site_info.entity_change_proposal_enabled:
+                raise Http404('Entry change form is disabled')
+        self.entity = get_object_or_404(models.Entity, slug = entity_slug) if entity_slug else None
+        return super(EntityProposalIframe, self).dispatch(request, *args, **kwargs)
 
-    def send_mail_to_managers(self, proposal):
+    def send_mail_to_managers(self, proposal, action):
         current_site = Site.objects.get_current()
         site_info = current_site.site_info
 
-        email_subject = _(u'[%(website_name)s] Se ha recibido una solicitud de entidad nueva') % \
-                       {'website_name': site_info.website_name}
+        email_subject = _(u'[%(website_name)s] Se ha recibido una solicitud de %(action)s entidad') %  {
+                'website_name': site_info.website_name,
+                'action': action
+        }
         email_from = settings.DEFAULT_FROM_EMAIL
         email_to = [tuple[1] for tuple in settings.MANAGERS]
         email_template = loader.get_template('macadjan_base/email_notify_proposal_to_managers.txt')
         email_context = Context({
             'entity_name': proposal.name,
+            'action': action,
             'sender': (_(u'Dirección del remitente: %s') % proposal.proponent_email)
                        if proposal.proponent_email else _(u'Sin dirección de remitente.'),
             'comment': proposal.proponent_comment
         email_obj.content_subtype = 'plain'
         email_obj.send()
 
-    def send_mail_to_proponent(self, proposal):
+    def send_mail_to_proponent(self, proposal, action):
         if proposal.proponent_email:
 
             current_site = Site.objects.get_current()
             site_info = current_site.site_info
 
-            email_subject = _(u'Hemos recibido tu solicitud para dar de alta %(entity_name)s en %(website_name)s') % \
-                           {'entity_name': proposal.name,
-                            'website_name': site_info.website_name}
+            email_subject = _(u'Hemos recibido tu solicitud para %(action)s %(entity_name)s en %(website_name)s') % {
+                'entity_name': proposal.name,
+                'action': action,
+                'website_name': site_info.website_name
+            }
             email_from = settings.DEFAULT_FROM_EMAIL
             email_to = (proposal.proponent_email,)
             email_template = loader.get_template('macadjan_base/email_notify_proposal_to_proponent.txt')
             email_context = Context({
                 'entity_name': proposal.name,
+                'action': action,
                 'website_name': site_info.website_name,
             })
             email_body = email_template.render(email_context)
             email_obj.send()
 
 
-class NewEntityProposalOk(TemplateView):
-    template_name = 'macadjan_base/new_entity_proposal_ok.html'
+class EntityProposalOk(TemplateView):
+    template_name = 'macadjan_base/entity_proposal_ok.html'
 
-    def dispatch(self, request, *args, **kwargs):
-        if not Site.objects.get_current().site_info.new_entity_proposal_enabled:
-            raise Http404()
-        return super(NewEntityProposalOk, self).dispatch(request, *args, **kwargs)
+    def dispatch(self, request, entity_slug = None, *args, **kwargs):
+        if not Site.objects.get_current().site_info.new_entity_proposal_enabled :
+            raise Http404('Entry proposal form is disabled')
+        self.entity = get_object_or_404(models.Entity, slug = entity_slug) if entity_slug else None
+        return super(EntityProposalOk, self).dispatch(request, *args, **kwargs)
 
 
 # Utilities