Confluence에서 페이지를 업데이트할 때 두 가지 옵션이 있습니다. 그냥 [업데이트]와 [업데이트 설정 조정을 통해 버전 댓글을 남겨 업데이트]가 있습니다.
버전 댓글을 남기게 된다면 Git에서 Commit 같이 어떤 내용이 변경되었는지 버전 별로 간단하게 메시지를 남길 수 있어 필요한 기능이라고 생각이 되는데 이를 강제할 수 있는 방법은 현재 없는 것으로 보입니다.
그래서 사용자가 버전 댓글을 남기지 않고 그냥 업데이트 했을 때 관리자에게 메일을 통해 알려서 버전 댓글을 달 수 있게 하는 방법에 대해 소개하려고 합니다.
먼저 gmail의 smtp를 이용하기 위해서 Google [앱 비밀번호]를 먼저 발급받아야 합니다.
발급된 [기기용 앱 비밀번호]를 따로 복사 해둡니다.
[ScriptRunner] > [Script Listeners]에서 [Add Listener]를 눌러줍니다. Called에 간단히 제목이나 설명을 추가하고 [On these events]에 우리는 버전 댓글 없이 업데이트 됐을 때니 [Page updated]를 선택합니다.
그리고 Code to Run에 아래 코드를 입력 후 [Save] 합니다.
import javax.mail.internet.*
import javax.mail.*
def pageID = page["id"] // 현재 업데이트 된 페이지 ID
def curVerID = page["version"] // 업데이트 된 페이지 현재 버전
def res = get("/wiki/api/v2/pages/${pageID}/versions").asObject(Map).body
def value = get("/wiki/api/v2/pages/${pageID}?expand=body.storage").asObject(Map).body
def lastVersionRes = res["results"].find { ver ->
ver["number"] == curVerID
} // 마지막으로 update 된 버전의 정보
if ( lastVersionRes["message"] == "" ) {
Properties prop = new Properties()
//Enter the details of your SMTP server
prop.put("mail.smtp.auth", true)
prop.put("mail.smtp.host", "smtp.gmail.com")
prop.put("mail.smtp.port", "587")
prop.put("mail.smtp.starttls.enable", "true")
String emailId = "Gmail ID"
String password = "App Password"
Session session = Session.getInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
new PasswordAuthentication(emailId, password)
}
})
MimeMessage msg = new MimeMessage(session)
msg.setFrom(new InternetAddress(emailId, "Confluence Alert"))
msg.setSubject("[Confluence] 페이지 업데이트 버전 댓글이 제대로 기록되지 않았습니다.", "UTF-8")
String htmlBody = """
<html>
<body>
<p><strong> 업데이트 한 ${page["title"]}에 버전 댓글이 입력되지 않았습니다.</strong></p>
<p><strong> Url = <a href="${page["self"]}">${page["self"]}</a></strong></p>
</body>
</html>
"""
msg.setContent(htmlBody, "text/html; charset=UTF-8")
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("Admin Email", false))
Transport.send(msg)
logger.info("Email Sent Successfully!!")
} // 버전 정보가 비어져 있으면 버전 메시지를 추가해서 다시 업데이트
이제 Listener를 등록해 놨으니 버전 댓글 없이 업데이트 시 아래처럼 메일이 오게 됩니다.
그리고 만약에 버전 댓글을 기록하지 않은 버전을 지우고 싶다면 먼저 버전 댓글이 입력되지 않은 상태에서 업데이트 버튼을 누른 후 글의 내용은 일절 수정하지 않고 버전 기록만 남긴 후 업데이트 합니다.
다음으로 [버전 이력]으로 들어가 버전 이력을 남기지 않은 버전을 삭제합니다.(관리자 계정으로만 가능)
보통 QTreeWidget에서 아이템을 싹 비우려고 할 때 Clear() 함수를 많이 사용합니다. 하지만 이 함수의 경우 QTreeWidget에 가지고 있는 아이템들의 메모리를 해제시키기 때문에 아래와 같이 아이템을 다시 불러오려고 할 때 문제가 생기게 됩니다.
class Test {
Test(uchar nItemCount) {
for ( int i=0; i < nItemCount; i++ ) {
QTreeWidgetItem* it = new QTreeWidgetItem;
items.append(it);
}
}
QList<QTreeWidgetItem*> getItems() { return Items; }
QList<QTreeWidgetItem*> Items;
};
int main() {
Test* t1 = new Test(3);
Test* t2 = new Test(10);
auto items = t1->getItems();
for ( auto i : items ) {
ui->tree->addTopLevelCount(i);
}
ui->tree->clear(); // t1이 갖고 있는 item들 delete 됨
auto items = t2->getItems();
for ( auto i : items ) {
ui->tree->addTopLevelCount(i);
}
ui->tree->clear(); // t2이 갖고 있는 item들 delete 됨
auto items = t1->getItems();
for ( auto i : items ) {
ui->tree->addTopLevelCount(i); // i는 쓰레기 값
}
...
}
이럴때는 clear를 사용하는 것이 아닌 takeTopLevelItem을 통해 단순히 트리에서 제거해주면 됩니다.
while (topLevelItemCount() > 0) {
takeTopLevelItem(0);
} // clear but not delete items