Wie können wir sehen wer bei uns als nächstes Geburtstag hat? Eine nicht selten gestellte Frage in vielen Unternehmen. Die Antwort ist: “Mit Confluence und dem User Profile Plugin von Communardo”! Sehen Sie hier wie es funktioniert…
Das User Profile Plugin bietet eine Vielzahl an Funktionen um die Confluence Profile nach den eigenen Wünschen und Vorstellungen anzupassen. So können zum Beispiel neue Profile Elemente hinzugefügt oder beliebige Nutzerdaten aus externen Nutzerverzeichnissen in das Confluence synchronisiert werden. Als netter Nebeneffekt werden diese Informationen auch im Confluence Suchindex zur Verfügung gestellt. Weiterhin bietet das User Profile Plugin ab der Version 1.9 eine REST Schnittstelle um die Nutzerdaten auszulesen. Und genau das können wir nutzen um eine Auflistung aller Nutzer, die um das aktuelle Datum Geburtstag haben, zu bekommen.
Was brauchen wir?
Grundvoraussetzung für das Funktionieren ist ein installiertes User Profile Plugin ab der Version 1.9. Mit diesem ist es nun möglich in der globalen Administration im Abschnitt “User Profile Plugin” bei “Profile Elements” ein neues Profilelement anzulegen. Diesem geben wir den Namen “Birthday”. Als Hilfetext sollte man nun noch hinzufügen dass das Geburtsdatum im Format “TT.MM.JJJJ” oder TT.MM. erwartet wird.
Nun haben alle Nutzer in Ihrem Profil die Möglichkeit das eigene Geburtsdatum zu hinterlegen.
Ein Nutzermakro trägt unseren Code
Wir verwenden ein Nutzermakro in welchem wir ein wenig Javascript Code und Style-Definitionen hinterlegen. Dem Nutzermakro geben wir einen beliebigen Namen und fügen folgenden Code als Nutzermakro Code ein.
## @noparams <style type="text/css"> .upp-birthday-list { margin-top: 10px; } .upp-birthday-user .upp-pic { display: inline-block; } .upp-birthday-user .upp-data { display: inline-block; vertical-align: top; margin-left: 10px; width: 130px; text-align: left; } .upp-birthday-user { display: inline-block; vertical-align: top; margin-right: 10px; margin-bottom: 10px; padding: 5px; border: 1px solid #ccc; } </style> <h2>Birthday List</h2> <div class="upp-birthday-list"> Search for birthdays... </div> <script type="text/javascript"> jQuery(document).ready(function(){ var queryStringArray = []; var actualDate = new Date(); for(var i = -5; i <= 5; i++) { var newDate = new Date(actualDate.getFullYear(), actualDate.getMonth(), actualDate.getDate()+i); var day = (newDate.getDate() < 10 ? "0" : "") + newDate.getDate(); var month = ((newDate.getMonth() + 1) < 10 ? "0" : "") + (newDate.getMonth()+1); queryStringArray.push("Birthday:" + day + "." + month + "*"); } var queryString = queryStringArray.join(" OR "); jQuery.getJSON(contextPath+"/rest/searchv3/1.0/search?type=userinfo&queryString="+queryString ,function(result){ if(result.results && result.results.length > 0) { jQuery(".upp-birthday-list").html(""); jQuery.each(result.results, function(index, value){ var match = value.url.match(/~(.*)\?/)[1]; if(match) { var userRawContainer = jQuery("<div class='upp-birthday-user' username='"+match+"'><div class='upp-pic'></div><div class='upp-data'></div></div>"); jQuery(".upp-birthday-list").append(userRawContainer); initializeUppBirthdayUser(userRawContainer); } }); } else { jQuery(".upp-birthday-list").html("No birthdays found <img src='http://www.communardo.de/home/techblog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> "); } }); function initializeUppBirthdayUser(userRawContainer) { var userName = userRawContainer.attr("username"); jQuery.getJSON(contextPath+"/rest/mobile/1.0/profile/"+userName, function(result){ var userImg = jQuery("<img src='"+result.avatarUrl+"' >"); userRawContainer.find(".upp-pic").append(userImg); var userNameContainer = jQuery("<div>"+result.fullName+"</div>"); userRawContainer.find(".upp-data").append(userNameContainer); getUppFieldValue(userName, "Birthday", userRawContainer.find(".upp-data")); }); } function getUppFieldValue(username, fieldKey, containerToAppendTo) { jQuery.getJSON(contextPath+"/rest/communardo/upp/1.0/profileData/"+username+"?expand=profileData.profileElement", function(uppdata){ jQuery.each(uppdata.profileData, function(uppindex, uppvalue) { if(uppvalue.profileElement.defaultName == fieldKey) { var birthdayStampArray = uppvalue.data.split("."); var valueContainer = jQuery("<div>"+uppvalue.data+"</div>").hide(); containerToAppendTo.closest(".upp-birthday-user").attr("birthdayforsort", (birthdayStampArray[1]+birthdayStampArray[0])); containerToAppendTo.append(valueContainer); sortBirthdayElements(); valueContainer.fadeIn(); } }); }); } function sortBirthdayElements() { var uppBirthdayList = jQuery(".upp-birthday-list"); var sortedItems = uppBirthdayList.find(".upp-birthday-user").sort(function(a, b) { if(!a || !b || !jQuery(a).attr("birthdayforsort") || !jQuery(b).attr("birthdayforsort")) { return 0; } return (jQuery(a).attr("birthdayforsort") < jQuery(b).attr("birthdayforsort") ? -1 : (jQuery(a).attr("birthdayforsort") > jQuery(b).attr("birthdayforsort") ? 1 : 0)); }); uppBirthdayList.find(".upp-birthday-user").remove(); uppBirthdayList.append(sortedItems); } }); </script>
Was genau passiert im Nutzermakro?
Der Ablauf im Nutzermakro ist an sich recht einfach. Als erstes wird eine Suchanfrage per Javascript an Confluence geschickt. Diese gibt uns alle Nutzer die in den letzten 5 Tagen Geburtstag hatten oder in den nächsten 5 Tagen Geburtstagen Geburtstag haben. Pro gefundenem Nutzer wird nun nach dem eigentlichen Geburtstag gefragt. Sobald alle Profile mit Ihrem Geburtstag geladen wurden werden diese noch abschließend nach Geburtsdatum aufsteigend sortiert.