Skip to content

Commit

Permalink
Merge pull request #87 from Scouterna/utv
Browse files Browse the repository at this point in the history
Utv
  • Loading branch information
Emil Öhman authored Jan 28, 2023
2 parents 2499c67 + f5652d4 commit 40b9217
Show file tree
Hide file tree
Showing 6 changed files with 323 additions and 119 deletions.
10 changes: 3 additions & 7 deletions Anvandare.gs
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
/**
* @author Emil Öhman <[email protected]>
* @website https://github.com/Scouterna
* @version 2022-12-30
* @version 2023-01-27
*/


/**
* Huvudfunktion för att hantera synkronisering av användarkonton med Scoutnet
*/
function synkroniseraAnvandare() {

const defaultOrgUnitPath = "/Scoutnet";
const suspendedOrgUnitPath = defaultOrgUnitPath + "/" + "Avstängda";

ScoutnetSynkLib.synkroniseraAnvandare(KONFIG_OBJECT, defaultOrgUnitPath, suspendedOrgUnitPath);
function synkroniseraAnvandare() {
ScoutnetSynkLib.synkroniseraAnvandare(KONFIG_OBJECT);
}


Expand Down
73 changes: 8 additions & 65 deletions Bibliotek/Anvandare-lib.gs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@
* Huvudfunktion för att hantera synkronisering av användarkonton med Scoutnet
*
* @param {Object} INPUT_KONFIG_OBJECT - Objekt med kårens konfiguration
* @param {string} deafultOrgUnitPath - Sökväg för underorganisation där alla användarekonton ska synkas
* @param {string} suspendedOrgUnitPath - Sökväg för underorganisationen för avstängda användarkonton
*/
function synkroniseraAnvandare(INPUT_KONFIG_OBJECT, defaultOrgUnitPath, suspendedOrgUnitPath) {
function synkroniseraAnvandare(INPUT_KONFIG_OBJECT) {

KONFIG = INPUT_KONFIG_OBJECT;

Expand All @@ -21,7 +19,7 @@ function synkroniseraAnvandare(INPUT_KONFIG_OBJECT, defaultOrgUnitPath, suspende
console.info("Antal medlemmar i kåren " + allMembers.length);
}

let useraccounts = getGoogleAccounts_(defaultOrgUnitPath);
let useraccounts = getGoogleAccounts_();

const defaultUserAvatar = getByteArrayOfDefaultImage_();
const defaultUserAvatarId = getAvatarId_(defaultUserAvatar);
Expand All @@ -32,7 +30,7 @@ function synkroniseraAnvandare(INPUT_KONFIG_OBJECT, defaultOrgUnitPath, suspende
//Går igenom Listorna som är definierade i Konfiguration.gs, avsnitt "USER_ACCOUNT_CONFIG"

let scoutnetListId = KONFIG.USER_ACCOUNT_CONFIG[p].scoutnetListId;
let orgUnitPath = defaultOrgUnitPath;
let orgUnitPath = KONFIG.DEFAULT_ORG_UNIT_PATH;

if (KONFIG.USER_ACCOUNT_CONFIG[p].orgUnitPath) {
//Bara om man anger någon suborg så anger vi den, annars blir det knas med
Expand Down Expand Up @@ -103,7 +101,7 @@ function synkroniseraAnvandare(INPUT_KONFIG_OBJECT, defaultOrgUnitPath, suspende
console.info("Googlekonton som är eller ska vara avstänga: %s", useraccounts.length);

for (let googleUserAccount in useraccounts) {
suspendAccount_(useraccounts[googleUserAccount], suspendedOrgUnitPath)
suspendAccount_(useraccounts[googleUserAccount])
}
}

Expand Down Expand Up @@ -584,21 +582,20 @@ function updateUserPhoto_(member, useraccount, defaultUserAvatar, defaultUserAva
* Stäng av användarkonto om det inte redan är avstängt
*
* @param {Object} userAccount - Ett objekt av ett Googlekonto
* @param {string} suspendedOrgUnitPath - Sökväg för underorganisationen för avstängda konton
*/
function suspendAccount_(userAccount, suspendedOrgUnitPath) {
function suspendAccount_(userAccount) {

const email = userAccount.primaryEmail;
const suspended = userAccount.suspended;
const orgUnitPath = userAccount.orgUnitPath;

createSuborganisationIfNeeded_(suspendedOrgUnitPath);
createSuborganisationIfNeeded_(KONFIG.SUSPENDED_ORG_UNIT_PATH);

if (!suspended || (orgUnitPath !== suspendedOrgUnitPath)) {
if (!suspended || (orgUnitPath !== KONFIG.SUSPENDED_ORG_UNIT_PATH)) {

let user = {
suspended: true,
"orgUnitPath": suspendedOrgUnitPath
"orgUnitPath": KONFIG.SUSPENDED_ORG_UNIT_PATH
};

user = AdminDirectory.Users.update(user, email);
Expand All @@ -610,60 +607,6 @@ function suspendAccount_(userAccount, suspendedOrgUnitPath) {
}


/**
* Returnerar en lista över alla Googlekonton för underorganisationen som synkroniserar med Scoutnet
*
* @param {string} defaultOrgUnitPath - Sökväg för en underorganisation
*
* @returns {Object[]} - Lista med objekt av Googlekonton i denna underorganisation
*/
function getGoogleAccounts_(defaultOrgUnitPath) {

let listOfUsers = [];

for (let n = 0; n < 6; n++) {
if (0 !== n) {
console.warn("Funktionen getGoogleAcounts körs " + n);
}
try {
let pageToken, page;
do {
page = AdminDirectory.Users.list({
domain: KONFIG.DOMAIN,
query: "orgUnitPath='" + defaultOrgUnitPath + "'",
orderBy: 'givenName',
maxResults: 150,
pageToken: pageToken
});
const users = page.users;
if (users) {
for (let i = 0; i < users.length; i++) {
const user = users[i];
listOfUsers.push(user);
//console.log('%s (%s)', user.name.fullName, user.primaryEmail);
}
} else {
console.warn('Ingen användare hittades i denna underoganisation.');
const empty = [];
return empty;
}
pageToken = page.nextPageToken;
} while (pageToken);

return listOfUsers;

} catch(e) {
console.error("Problem med att anropa GoogleTjänst Users.list i funktionen getGoogleAccounts");
if (n === 5) {
throw e;
}
Utilities.sleep((Math.pow(2,n)*1000) + (Math.round(Math.random() * 1000)));
}
}

}


/**
* Hämta en lista över alla aktiva scoutledare och andra funktionärer
* genom att kontrollera om de har en avdelningsroll (unit_role) eller kårroll (group_role)
Expand Down
73 changes: 50 additions & 23 deletions Bibliotek/Gemensamma_funktioner-lib.gs
Original file line number Diff line number Diff line change
Expand Up @@ -30,29 +30,6 @@ function addMenuForSpreadsheet() {
}


/**
* Ställer in egna attribut och de funktioner som körs för att räkna ut
* värdet på attributet för respektive person.
* Funktionerna använder R1C1 notation för att skriva formeln i google kalkylark
* och hänvisar då relativt aktuell kolumn till en rad R eller kolumn C från denna
* R[0]C[-37] betyder därmed att man hänvisar till samma rad (0 rader förändring) och
* till värdet i cellen 37 kolumner till vänster.
*
* Vilken plats som varje eget attribut får är att först sätts alla standardattribut
* ut och sedan nedanstående i ordning. Enklast är att testa för att se till att det
* blir korrekt.
* Observera att dessa påverkar alla medlemslistor som används, så var försiktig om du
* tar bort någon funktion nedan då den kanske används i någon annan lista.
*/
MEDLEMSLISTA_EGNA_ATTRIBUT_FUNKTIONER = [
{'namn': 'Ålder', 'formel': '=DATEDIF(R[0]C[-37]; TODAY(); "Y")'},
{'namn': 'Dagar till nästa födelsedag', 'formel': '=DATE(YEAR(R[0]C[-38])+DATEDIF(R[0]C[-38];TODAY();"Y")+1;MONTH(R[0]C[-38]);DAY(R[0]C[-38]))-TODAY()'},
{'namn': 'Antal dagar som medlem i kåren', 'formel': '=DATEDIF(R[0]C[-36];TODAY(); "D")'},
{'namn': 'Primär e-post som anhörigs e-post', 'formel': '=IF(AND(ISTEXT(R[0]C[-23]);OR(R[0]C[-23]=R[0]C[-18];R[0]C[-23]=R[0]C[-14])); "LIKA"; "OLIKA")'}
];
/***Medlemslistor - Slut***/


/**
* Kontrollerar om inställningarna i Konfiguration.gs verkar korrekta
*
Expand Down Expand Up @@ -170,6 +147,56 @@ function getGmailAdressWithoutDots_(email) {
}


/**
* Returnerar en lista över alla Googlekonton för underorganisationen som synkroniserar med Scoutnet
*
* @returns {Object[]} - Lista med objekt av Googlekonton i denna underorganisation
*/
function getGoogleAccounts_() {

let listOfUsers = [];

for (let n = 0; n < 6; n++) {
if (0 !== n) {
console.warn("Funktionen getGoogleAcounts körs " + n);
}
try {
let pageToken, page;
do {
page = AdminDirectory.Users.list({
domain: KONFIG.DOMAIN,
query: "orgUnitPath='" + KONFIG.DEFAULT_ORG_UNIT_PATH + "'",
orderBy: 'givenName',
maxResults: 150,
pageToken: pageToken
});
const users = page.users;
if (users) {
for (let i = 0; i < users.length; i++) {
const user = users[i];
listOfUsers.push(user);
//console.log('%s (%s)', user.name.fullName, user.primaryEmail);
}
} else {
console.warn('Ingen användare hittades i denna underoganisation.');
return [];
}
pageToken = page.nextPageToken;
} while (pageToken);

return listOfUsers;

} catch(e) {
console.error("Problem med att anropa GoogleTjänst Users.list i funktionen getGoogleAccounts");
if (n === 5) {
throw e;
}
Utilities.sleep((Math.pow(2,n)*1000) + (Math.round(Math.random() * 1000)));
}
}
}


/**
* Returnera gruppmedlemmar för en specifik grupp
*
Expand Down
56 changes: 37 additions & 19 deletions Bibliotek/Grupper-lib.gs
Original file line number Diff line number Diff line change
Expand Up @@ -980,17 +980,46 @@ function updateGroupEmailThatAlreadyExists_(groupId, group_members, member_email


/**
* Ger lista över alla aktiva Google-konton i denna domän
* om det finns flera domänen tillåter vi bara huvuddomänen
* Ger lista över alla aktiva Google-kontons e-postadresser i denna domän
* Om det finns flera domäner tillåter vi bara huvuddomänen
*
* @returns {string[]} - E-postadresser för aktiva Googlekonton
*/
function getEmailAdressesofAllActiveGoogleAccounts_() {

const emailAddresses = [];

const catchAllAddress = "*@" + KONFIG.DOMAIN;
const activeGoogleAccounts = getAllActiveGoogleAccounts_();

for (let i = 0; i < activeGoogleAccounts.length; i++) {
const user = activeGoogleAccounts[i];
//console.log('%s (%s)', user.name.fullName, user.primaryEmail);
for (let k = 0; k < user.emails.length; k++) { //Varje användare kan ha alias också

const email = user.emails[k].address;
if (email.endsWith(KONFIG.DOMAIN)) { //Endast adresser för huvuddomänen
if (email !== catchAllAddress) {
emailAddresses.push(email);
//console.log(email);
}
}
}
}
return emailAddresses;
}


/**
* Ger lista över alla Googlekonton som inte är avstängda
*
* @param {Object} - Lista med googlekonton som inte är avstängda
*/
function getAllActiveGoogleAccounts_() {

const activeAccounts = [];
let users;
let pageToken, page;
const catchAllAddress = "*@" + KONFIG.DOMAIN;
do {
page = AdminDirectory.Users.list({
domain: KONFIG.DOMAIN,
Expand All @@ -1002,30 +1031,19 @@ function getEmailAdressesofAllActiveGoogleAccounts_() {
if (users) {
for (let i = 0; i < users.length; i++) {
const user = users[i];
//console.log('%s (%s)', user.name.fullName, user.primaryEmail);

//console.log('%s (%s)', user.name.fullName, user.primaryEmail);
if (!user.suspended) {
for (let k = 0; k < user.emails.length; k++) { //Varje användare kan ha alias också

const email = user.emails[k].address;
if (email.endsWith(KONFIG.DOMAIN)) { //Endast adresser för huvuddomänen
if (email !== catchAllAddress) {
emailAddresses.push(email);
//console.log(email);
}
}
}
activeAccounts.push(user);
}
}
} else {
console.warn('Inget Google-konto hittades.');
const empty = [];
return empty;
return [];
}
pageToken = page.nextPageToken;
} while (pageToken);

return emailAddresses;
return activeAccounts;
}


Expand Down
Loading

0 comments on commit 40b9217

Please sign in to comment.