sql - ultima - Redmine: Copia del problema varias veces
redmine windows (2)
Copiar un problema y sus problemas secundarios es una característica incorporada de forma nativa y, por lo tanto, funciona bien.
¿Pero hay una manera de hacer esto varias veces? ¿Como recrear un tema (incluidos sus hijos) veinte o cincuenta veces?
Editar 2
Esta nueva funcionalidad debe ser accesible a través de la interfaz de Redmine
y compatible con cualquier navegador.
No importa si se trata de un complemento completamente nuevo, una extensión de la función de copia incorporada, una llamada a un PHP-script
o cualquier otra cosa. Debido a la compatibilidad (redes, navegadores, etc.) supongo que una modificación completamente del lado del servidor es la única manera de hacerlo aquí.
¿Qué partes del complemento predeterminado (como se crearon en el tutorial votación) o un elemento central tendrían que cambiarse?
¿Dónde puedo encontrar el código para la función nativa de copia de problemas?
O, si todo esto es demasiado complicado, ¿cómo escribiría mi complemento para que apunte a un archivo PHP
que manipula la base de datos SQL
directamente?
Editar :
Para aclarar: al igual que la función de copia normal (ya sea en el menú contextual o en el enlace de arriba a la derecha, no me importa) quiero copiar un problema y sus problemas secundarios n veces. Para permitir que el usuario establezca la cantidad n, cualquier entrada de número de usuario puede ser suficiente, como un cuadro de texto, una ventana emergente, etc.
Creo que este complemento específico no es de alta prioridad para la comunidad de Redmine. Sin embargo, puede escribir llamadas API muy sencillas para Java, Python u otro lenguaje para hacer lo que quiere exactamente.
Aquí, puede ver la documentación de la API sobre cómo enumerar, crear y actualizar problemas. Documentación de la API
PD: Puede dejar su solicitud en la comunidad de redmine, tal vez tenga suerte https://redmine.org/projects/redmine/issues
Creo que la forma más sencilla de hacer esto es comenzar con la modificación de la fuente de redmine. Una vez que funcione, puede seguir adelante e intentar extraer esta función en el complemento.
Tenga en cuenta que no soy un desarrollador de ruby, por lo que algunas de las siguientes cosas son solo mis suposiciones. Pero hice algunas pequeñas modificaciones de redmine como esta antes y espero que mis pensamientos puedan ser útiles.
También será más fácil si está familiarizado con algunos de los marcos MVC (para cualquier idioma), porque en su mayoría tienen una estructura similar con rutas, controladores, vistas y modelos.
La idea
El enlace para copiar un solo problema tiene este aspecto: //redmine.myserver.com/projects/myapp/issues/12407/copy
.
Mi idea es agregar un parámetro num_copies
a este enlace y usarlo en el código para crear muchas copias.
No necesita una interfaz de usuario para eso, una vez implementada, la función funcionará así:
- encuentra el problema que necesitas
- Elija la acción de
copy
para ello. - una vez que se abrió el formulario, agregue manualmente el parámetro
?num_copies=XX
en la URL (//redmine.myserver.com/projects/myapp/issues/12407/copy?num_copies=50
) y presione ''Enter'' para volver a cargar el formulario - verifique los detalles y envíe el formulario; creará varias copias de acuerdo con el parámetro
num_copies
El plan de implementacion
Ahora, cómo hacer esto. Me refiero al espejo redmine en github que parece fresco.
1) Encuentre donde se maneja el enlace .../copy
Cuando abra el formulario para copiar el problema, verá un formulario como este:
<form action="/projects/myapp/issues" class="new_issue" id="issue-form" method="post">
<input id="copy_from" name="copy_from" type="hidden" value="12407">
<div class="box tabular">
<div id="all_attributes">
...
</form>
Observe la acción del formulario, apunta al enlace /issues
y enviará el parámetro copy_from
(este es el ID del problema que estamos copiando).
2) Encuentra el código que maneja el envío del formulario
Primero podríamos ir y verificar a través de config/routes.rb
, pero podemos suponer que necesitamos los controllers/issues_controller.rb
Busque el lugar donde se copy_from
parámetro copy_from
.
Verás el método build_new_issue_from_params
. Ahora busca sus usos y encontrarás this :
before_filter :build_new_issue_from_params, :only => [:new, :create]
Por su aspecto, supongo que se llama antes de acciones new
y de create
. Al mirar las definiciones nuevas y crear, la new
acción representa el nuevo formulario de problema y la acción create
encarga de la publicación del formulario.
3) Agregue el parámetro num_copies
al formulario
Encuentre el archivo de vista utilizado por la acción de nuevo problema . Aquí hay una plantilla para el nuevo formulario de problema, intente agregar el parámetro num_copies
similar al copy_from :
<%= title l(:label_issue_new) %>
<%= call_hook(:view_issues_new_top, {:issue => @issue}) %>
...
<%= error_messages_for ''issue'' %>
<%= hidden_field_tag ''copy_from'', params[:copy_from] if params[:copy_from] %>
Aquí no estoy 100% seguro de si funcionará si agrega una línea similar para `num_copies. Es posible que también necesite modificar la route .
Cuando haya terminado, debe tener el nuevo formulario de problema como este:
<form action="/projects/myapp/issues" class="new_issue" id="issue-form" method="post">
<input id="copy_from" name="copy_from" type="hidden" value="12407">
<input id="copy_from" name="num_copies" type="hidden" value="50">
<div class="box tabular">
<div id="all_attributes">
...
</form>
4) Manejar el parámetro num_copies
Se debe hacer en la acción crear :
def create
...
call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
@issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads]))
if @issue.save
...
end
Aquí ya tiene la variable @issue
creada en el método build_new_issue_from_params
y lo que debe hacer es verificar si el parámetro num_copies
está establecido y si está configurado, luego copie / guarde @issue
en un bucle para crear copias adicionales.
No puedo proporcionar el fragmento de código exacto para esto, pero no debería ser muy complejo. Verifique this código en el método bulk_update
, se parece a lo que necesita:
issue = orig_issue.copy({},
:attachments => copy_attachments,
:subtasks => copy_subtasks,
:link => link_copy?(params[:link_copy])
)