¿Cómo recopilar estadísticas de comentarios de página en Confluence?
Sí, y ¿por qué podría ser necesario?

Porque y porque
En el proyecto en el que trabajé, nació el siguiente proceso de preparación y aprobación de requisitos:
- La confluencia se utilizó para la documentación.
- El equipo del proveedor preparó descripciones de los procesos comerciales y sus pasos en forma de páginas separadas de acuerdo con la plantilla.
- Una vez a la semana, se entregó un lote de descripciones preparadas al cliente para su revisión.
- El equipo del cliente dejó todas las preguntas y adiciones en la página correspondiente en forma de comentarios integrados.
- Y el equipo del proveedor complementó el contenido, respondió a los comentarios, resolvió preguntas para un estudio adicional.
- Si se responde la pregunta y se actualiza el contenido o se corrige la tarea de estudio, el equipo del cliente debe cerrar el comentario.
- Las preguntas sobre un lote de documentos de la semana actual deben cerrarse para cuando se transfiera el siguiente lote la próxima semana.
Cada semana, los gerentes de proyecto tienen la tarea de comprender cuánto ha funcionado el lote de documentos entregados y qué se puede considerar condicionalmente listo a partir de él. Y los participantes del equipo de proveedores deben verificar periódicamente el estado de los comentarios en sus documentos y trabajar a propósito con el resto. ¿Pero cómo encontrarlos? Puede abrir cada página, busque el primer comentario con sus ojos (o con la ayuda de un
pequeño truco ), luego haga clic en todos los comentarios, porque el equipo del cliente no tiene prisa por cerrarlos, pensar en cada uno y buscar una respuesta.
El lote semanal contiene 50-100 páginas separadas, y hacer esto con sus manos es una cantidad significativa de trabajo. Y si aún intenta reunir argumentos para convencer al otro lado, se vuelve muy triste. Y también hay comentarios colgantes que resultan de la edición inexacta de la página cuando el texto fuente se elimina accidentalmente. Tal comentario es visible en los resueltos, pero no se puede volver a abrir (puede hacerlo, si recrea un marcador invisible en el texto de la página).
La búsqueda de herramientas no tuvo éxito. Además, Confluence se implementa en el lado del cliente, no puede instalar complementos, sin mencionar la compra. Sin experiencia en desarrollo macro.
En algún momento, recordé la
API REST de Confluence y la experiencia previa con el uso de la
API Jira similar. La búsqueda y los experimentos con funciones de llamada desde el navegador mostraron que puede acceder a los comentarios y sus propiedades. Luego, tenía que elegir una herramienta para la automatización, y puede comenzar a resolver. Tengo cierta experiencia creando scripts en herramientas que tienen más probabilidades de estar más cerca de administradores como Bash, Perl, JScript. No soy desarrollador, no tenía ninguna herramienta familiar o familiar. Quería probar algo más común o adecuado. Luego descubrí un
contenedor para la API de Python y decidí probarlo.
Principio general
El problema se formuló de la siguiente manera. Necesita encontrar todas las páginas relacionadas con una entrega semanal específica. Recopile comentarios sobre ellos en una lista: página, enlace al comentario, autor y fecha del comentario, texto fuente en la página, comentario y respuestas, autor y fecha de la última respuesta, estado del comentario. Además, recopile estadísticas para cada página, cuántos comentarios en total, cuántos peligros, cuántos abiertos. Guárdelo todo en una página especial de estadísticas.
Puse Python, revisé los conceptos básicos para trabajar con él y vamos. Primero, crea una conexión:
from atlassian import Confluence UserLogin = 'xxxxxx'
Para buscar páginas de un lote semanal, decidí usar etiquetas. Cómo entregarlos en masa es una tarea separada.
page_label = 'week123' cql = 'space.key={} and label = "{}" and type = page ' 'ORDER BY title '.format('YYY', page_label) pages = confluence.cql(cql, expand=None, start=0, limit=200)
Así que tenemos una lista de páginas para verificar. A continuación, comenzamos a procesar cada página individual. Recopilamos de sus datos los comentarios con sus parámetros. En base a estos datos, creamos estadísticas sobre cuántos comentarios hay en la página y en qué condiciones. A continuación, eliminamos el resultado de todas las páginas y comenzamos a formatear el resultado. Creamos el cuerpo de la página con el resultado en forma de una tabla de estadísticas y una lista detallada de comentarios abiertos.
Procesamiento de lista de páginas statistics = [] open_comments = []
Características API
Ahora veamos cómo procesar la página. De forma predeterminada, la API solo devuelve información básica, como un identificador o nombre de página. Todas las propiedades adicionales deben especificarse explícitamente. Se pueden ver analizando el resultado de la llamada. Se pueden encontrar datos adicionales en secciones o subsecciones de _expandable. Agregamos el elemento deseado para expandir y buscar más hasta encontrar los datos necesarios.
Ejemplo de problema http://wiki.xxxxxx/rest/api/content/101743895?expand=body,children.comment { "id": "97517865", "type": "page", "status": "current", "title": "w2019-47 comments status", "children": { "comment": { "results": [], "start": 0, "limit": 25, "size": 25, "_links": {} }, "_links": {}, "_expandable": { "attachment": "/rest/api/content/97517865/child/attachment", "page": "/rest/api/content/97517865/child/page" } }, "body": { "_expandable": { "editor": "", "view": "", "export_view": "", "styled_view": "", "storage": "", "anonymous_export_view": "" } }, "extensions": { "position": "none" }, "_links": {}, "_expandable": { "metadata": "", "operations": "", "restrictions": "/rest/api/content/97517865/restriction/byOperation", "history": "/rest/api/content/97517865/history", "ancestors": "", "version": "", "descendants": "/rest/api/content/97517865/descendant", } }
Y también hay una restricción en el número de resultados emitidos, paginación. Está configurado en el lado del servidor (API?) Y en nuestro caso es 25. Para algunas solicitudes, se puede cambiar especificando explícitamente, pero solo funcionará para el nivel superior. Y revelando comentarios a la página, de todos modos recibimos solo 25, mientras que el tamaño también es falso. En el ejemplo había 29 en realidad. Logramos evitar la paginación de comentarios usando una función separada en el módulo Confluence: get_page_comments con la capacidad de especificar el tamaño de la página.
El siguiente escollo fue esperar en las características de la preservación y emisión de caracteres especiales. El cuerpo de una página o comentario se puede obtener en varias vistas: XML interno - almacenamiento, HTML intermedio sin salida de macro - vista y HTML con salida de macro - export_view. Pero el título de la página y el texto original comentado originalSelection siempre se emitió en una forma adecuada para la lectura. Porque en el futuro, estos datos se incluirán en el cuerpo de la página con estadísticas, luego algunos caracteres provocaron errores de conversión. Tuve que escribir un procedimiento de reemplazo arriba.
Comentarios de la página
Ahora para analizar la página. Este es un procedimiento que carga una página, recopila sus datos, luego extrae una lista de comentarios con respuestas y los recopila en correspondencia. El resultado es una lista de diccionarios, donde cada elemento de la lista corresponde a un comentario con respuestas. Y todos los atributos de este comentario se encuentran en los campos correspondientes del diccionario.
Procesamiento de una página def page_comments_data(page_identifier):
Estadísticas y tablas
Para mayor claridad en la presentación de los datos, recopilamos estadísticas sobre ellos y los organizamos en forma de tablas.
Procesamos estadísticas def page_statistics(comments_data): open_count = 0 dang_count = 0 comment_count = len(comments_data) if comment_count > 0: for comment in comments_data:
Para hacer los datos en forma de tablas, haremos un procedimiento más. Forma el código HTML de la tabla a partir de la lista de diccionarios, como encabezados agrega una línea a partir de los nombres de las teclas del diccionario y agrega una columna con números de línea.
def create_table(tab_data): tab_start = '<table style="width: 100.00%;"><colgroup><col />' '<col /></colgroup><tbody>' tab_end = '</tbody></table>' tab_code = tab_start + '<tr>' row_num = 1 if len(tab_data) > 0: tab_code += '<th>Num</th>' for key in tab_data[0].keys(): tab_code += '<th>{}</th>'.format(key) tab_code += '</tr>' for row in tab_data: tab_code += '<tr><td>{}</td>'.format(row_num) row_num += 1 for field in row.values(): tab_code += '<td>{}</td>'.format(field) tab_code += '</tr>' tab_code += tab_end + '\n' return tab_code
Ahora todo está listo. Después de etiquetar y ejecutar el script, obtenemos una página que se ve así:

PS
Por supuesto, esto no es todo lo que resultó al final. Hubo un análisis de páginas y una búsqueda de una macro con el número de tarea en Jira. Hubo un etiquetado automático por números de tarea en Jira y enlaces desde ellos a Confluence. Hubo una comparación y verificación de las listas de entregas semanales. Se guardaron comentarios en Excel y se recopilaron datos comunes de varios archivos semanales de Excel. Y recientemente se han agregado los comentarios de análisis de Word.