Skip to content

Commit 8c03835

Browse files
authored
Merge pull request #33 from Scouterna/utv
Utv
2 parents 391e250 + 4fd07dd commit 8c03835

File tree

5 files changed

+177
-399
lines changed

5 files changed

+177
-399
lines changed

Anvandare.gs

Lines changed: 138 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ function Anvandare() {
2020
var defaultOrgUnitPath = "/Scoutnet";
2121
var suspendedOrgUnitPath = defaultOrgUnitPath + "/" + "Avstängda";
2222

23-
var allMembers = fetchScoutnetMembers(); //Alla medlemmar med alla attribut som finns i APIt för konton
24-
Logger.log("AllMembers.length by fetchScoutnetMembers = " + allMembers.length);
23+
if ("group" == organisationType) {
24+
var allMembers = fetchScoutnetMembers(); //Alla medlemmar med alla attribut som finns i APIt för konton
25+
Logger.log("AllMembers.length by fetchScoutnetMembers = " + allMembers.length);
26+
Logger.log("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
27+
Logger.log("Antal medlemmar i scoutnet = % " , allMembers.length);
28+
}
29+
2530
var useraccounts = getGoogleAccounts(defaultOrgUnitPath);
26-
27-
var MembersProcessed = [];
2831

29-
Logger.log("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
30-
Logger.log("Antal medlemmar i scoutnet = % " , allMembers.length);
31-
32+
var MembersProcessed = [];
3233

3334
for (var p = 0; p < userAccountConfig.length; p++) { //Gå igenom Listorna som är definierade i Konfiguration.gs, avsnitt "userAccountConfig"
3435

@@ -48,28 +49,32 @@ function Anvandare() {
4849
Logger.log("Beskrivning: %s",userAccountConfig[p].description);
4950

5051
createSuborganisationIfNeeded(orgUnitPath);
51-
52+
5253
var membersInAList;
5354
if (scoutnetListId) {
5455
membersInAList = fetchScoutnetMembersMultipleMailinglists(scoutnetListId, "", "");
5556
}
56-
else { //Om man ej anger listId för en e-postlista
57+
else if ("group" == organisationType) { //Om man ej anger listId för en e-postlista; endast för kårer, ej distrikt
5758
membersInAList = getScoutleaders(allMembers);
5859
}
5960
Logger.log("MembersInAlist antal personer= " + membersInAList.length);
6061

6162
for (var i = 0; i < membersInAList.length; i++) { //Här Processas alla medlemmar
62-
if(MembersProcessed.find(o => o == membersInAList[i].member_no)) // Leta efter kontot i listan över redan processade konton
63-
{
63+
Logger.log("**************");
64+
if(MembersProcessed.find(o => o == membersInAList[i].member_no)) {// Leta efter kontot i listan över redan processade konton
6465
Logger.log("Användaren är redan processad: " + membersInAList[i].first_name + " " + membersInAList[i].last_name);
6566
}
6667
else
6768
{
6869
Logger.log("Användaren ska processas: " + membersInAList[i].first_name + " " + membersInAList[i].last_name);
6970
MembersProcessed.push(membersInAList[i].member_no); //Lägg till kontot i listan över processade konton
70-
var obj = allMembers.find(obj => obj.member_no == membersInAList[i].member_no); //Leta upp kontot i listan övar alla konton
71-
//anledningen till att inte använda objektet från epostlistan är att det finns bara begränsad information i det objektet
72-
71+
if ("group" == organisationType) { //Alla attribut endast för kårer, ej distrikt
72+
var obj = allMembers.find(obj => obj.member_no == membersInAList[i].member_no); //Leta upp kontot i listan övar alla konton
73+
//anledningen till att inte använda objektet från epostlistan är att det finns bara begränsad information i det objektet
74+
}
75+
else { //För distrikt
76+
var obj = membersInAList[i];
77+
}
7378
var GoUser = useraccounts.find(u => u.externalIds !== undefined && u.externalIds.some(extid => extid.type === "organization" && extid.value === obj.member_no)); // leta upp befintligt Googlekonto som representerar rätt objekt
7479
if(GoUser) {
7580
// Användaren fanns i listan
@@ -81,8 +86,7 @@ function Anvandare() {
8186
//Logger.log("Antal innan: %s, efter: %s",ia,ib );
8287
updateAccount(obj, GoUser, orgUnitPath) //uppdatera alla uppgifter på googlekontot med uppgifter från Scoutnet
8388
}
84-
else
85-
{
89+
else {
8690
Logger.log("Skapar Ny Googleanvändare");
8791
createAccount(obj, orgUnitPath); //Skapa Googlekonto för denna användare
8892
}
@@ -91,8 +95,7 @@ function Anvandare() {
9195
}
9296
Logger.log("Googlekonton som är kvar: %s", useraccounts.length);
9397

94-
for (var goacc in useraccounts)
95-
{
98+
for (var goacc in useraccounts) {
9699
Logger.log("Stänger av konto, id: %s, %s",useraccounts[goacc].id, useraccounts[goacc].name.fullName);
97100
suspendAccount(useraccounts[goacc], suspendedOrgUnitPath)
98101
}
@@ -235,7 +238,7 @@ function createAccount(member, orgUnitPath) {
235238

236239
/*
237240
* Kontrollera om ett konto med denna e-postadress existerar
238-
* @param {string} email - En e-postadress inom kårens GSuite
241+
* @param {string} email - En e-postadress inom kårens Google Workspace
239242
*
240243
* @returns {boolean} - True eller false om e-postadressen finns
241244
*/
@@ -274,23 +277,58 @@ function checkIfEmailExists(email) {
274277
*/
275278
function updateAccount(member, useraccount, orgUnitPath) {
276279

280+
if (member.mobile_phone) { //För distrikt som hämtar attribut via e-postlist-api:et då det är annat namn där
281+
member.contact_mobile_phone = member.mobile_phone;
282+
}
283+
277284
var phnum = intphonenumber(member.contact_mobile_phone); // gör mobilnummret till internationellt nummer om möjligt
278285
var update = false;
279286

287+
var phnum_recovery = "";
288+
if (validatePhonenumberForE164(phnum)) {
289+
phnum_recovery = phnum;
290+
}
291+
else {
292+
phnum_recovery = "";
293+
}
294+
280295
var accountPrimaryPhoneNumber = "";
281296
if (typeof useraccount.phones !=='undefined' && useraccount.phones) {
282297
if (-1 != useraccount.phones.findIndex(phoneNumber => phoneNumber.type === "mobile" && phoneNumber.primary === true)) {
283298
accountPrimaryPhoneNumber = useraccount.phones.find(phoneNumber => phoneNumber.type === "mobile" && phoneNumber.primary === true).value;
284299
}
285300
}
286301

302+
var accountKeywordAvatarUpdated = "";
303+
if (typeof useraccount.keywords !== 'undefined' && useraccount.keywords) {
304+
if (-1 != useraccount.keywords.findIndex(keyword => keyword.type === "custom" && keyword.customType === "avatar_updated")) {
305+
accountKeywordAvatarUpdated = useraccount.keywords.find(keyword => keyword.type === "custom" && keyword.customType === "avatar_updated").value;
306+
}
307+
}
308+
309+
if (typeof syncUserAvatar === 'undefined' || !syncUserAvatar) {
310+
Logger.log("Ska ej synkronisera profilbild");
311+
member.avatar_updated = "";
312+
}
313+
314+
var shouldBeKeywordAvatarUpdated = member.avatar_updated;
315+
if (typeof useraccount.thumbnailPhotoEtag !=='undefined') {
316+
shouldBeKeywordAvatarUpdated += useraccount.thumbnailPhotoEtag;
317+
}
318+
319+
Logger.log("shouldBeKeywordAvatarUpdated " + shouldBeKeywordAvatarUpdated);
320+
Logger.log("accountKeywordAvatarUpdated " + accountKeywordAvatarUpdated);
321+
//Logger.log("Avatar updated " + member.avatar_updated);
322+
Logger.log("Avatar url " + member.avatar_url);
323+
287324
if ( useraccount.name.givenName != member.first_name
288325
|| useraccount.name.familyName != member.last_name
289326
|| useraccount.suspended
290327
|| useraccount.orgUnitPath != orgUnitPath
291-
|| ((!useraccount.recoveryEmail) && (member.email))
292-
|| ((useraccount.recoveryPhone != phnum) && (member.contact_mobile_phone))
293-
|| ((accountPrimaryPhoneNumber != phnum) && (member.contact_mobile_phone)) ) {
328+
|| ((useraccount.recoveryEmail != member.email) && (!(!useraccount.recoveryEmail && member.email==="")))
329+
|| ((useraccount.recoveryPhone != phnum_recovery) && (member.contact_mobile_phone) && (typeof useraccount.recoveryPhone !=='undefined'))
330+
|| ((accountPrimaryPhoneNumber != phnum) && (member.contact_mobile_phone))
331+
|| (accountKeywordAvatarUpdated != shouldBeKeywordAvatarUpdated)) {
294332
// Något behöver uppdateras
295333

296334
Logger.log('Användare %s %s uppdateras', useraccount.name.givenName, useraccount.name.familyName);
@@ -300,36 +338,43 @@ function updateAccount(member, useraccount, orgUnitPath) {
300338
if(useraccount.name.givenName!=member.first_name) {
301339
if (!user.name)
302340
{user.name = {}}
303-
Logger.log("Nytt förnamn: %s",member.first_name);
341+
Logger.log("Nytt förnamn: %s", member.first_name);
304342
user.name.givenName = member.first_name;
305343
update = true;
306344
}
307345
if(useraccount.name.familyName!=member.last_name) {
308346
if (!user.name)
309347
{user.name = {}}
310-
Logger.log("Nytt efternamn: %s",member.last_name);
348+
Logger.log("Nytt efternamn: %s", member.last_name);
311349
user.name.givenName = member.last_name;
312350
update = true;
313351
}
314352
if(useraccount.orgUnitPath!=orgUnitPath) {
315-
Logger.log("Ny OrganizationUnit: %s",orgUnitPath);
353+
Logger.log("Ny OrganizationUnit: %s", orgUnitPath);
316354
user.orgUnitPath = orgUnitPath;
317355
update = true;
318356
}
319-
if((!useraccount.recoveryEmail) && (member.email)) {
320-
Logger.log("Ny återställningsepost: %s",member.email);
357+
358+
//Logger.log("useraccount.recoveryEmail " + useraccount.recoveryEmail);
359+
//Logger.log("useraccount.recoveryEmail typeof " + typeof useraccount.recoveryEmail);
360+
//Logger.log("member.email " + member.email);
361+
//Logger.log("member.email typeof " + typeof member.email);
362+
if((useraccount.recoveryEmail != member.email) && (!(!useraccount.recoveryEmail && member.email===""))) {
363+
Logger.log("Ny återställningse-post: %s",member.email);
321364
user.recoveryEmail = member.email;
322365
update = true;
323366
};
324367
// Lägg till återställningsinformation på Googlekontot
325-
if((useraccount.recoveryPhone != phnum) && (member.contact_mobile_phone)) {
326-
if(phnum) {
327-
Logger.log("Nytt återställningsnummer: %s",phnum);
328-
user.recoveryPhone = phnum;
368+
//Logger.log("useraccount.recoveryPhone " + useraccount.recoveryPhone);
369+
//Logger.log("phnum_recovery " + phnum_recovery);
370+
//Logger.log("phnum " + phnum);
371+
//Logger.log("member.contact_mobile_phone " + member.contact_mobile_phone);
372+
if((useraccount.recoveryPhone != phnum_recovery) && (member.contact_mobile_phone)) {
373+
Logger.log("Nytt återställningsnummer: %s", phnum_recovery);
374+
user.recoveryPhone = phnum_recovery;
329375
update = true;
330-
}
331-
332376
}
377+
333378
if (typeof syncUserContactInfo !=='undefined' && syncUserContactInfo) {
334379
if((accountPrimaryPhoneNumber != phnum) && (member.contact_mobile_phone)) {
335380
if(phnum) {
@@ -356,7 +401,64 @@ function updateAccount(member, useraccount, orgUnitPath) {
356401
}
357402
}
358403
}
359-
if(useraccount.suspended) {
404+
405+
if (accountKeywordAvatarUpdated != shouldBeKeywordAvatarUpdated) {
406+
Logger.log("Profilbilden ska uppdateras");
407+
408+
var userPhoto;
409+
var keywordAvatarUpdatedToUpdate = "";
410+
411+
if (!member.avatar_updated) { //Ingen profilbild i Scoutnet
412+
Logger.log("Ingen profilbild i Scoutnet eller avaktiverad synkronisering");
413+
//Om tomt i Scoutnet, ta bort bilden i Google Workspace
414+
415+
try {
416+
userPhoto = AdminDirectory.Users.Photos.remove(useraccount.primaryEmail);
417+
Logger.log("Tagit bort profilbild");
418+
}
419+
catch(err) {
420+
Logger.log("--------------------------");
421+
Logger.log("Error: %s",err.message);
422+
Logger.log("--------------------------");
423+
}
424+
}
425+
else { //Om bild i Scoutnet, uppdatera bild i Google Workspace
426+
Logger.log("Finns ny profilbild i Scoutnet");
427+
try {
428+
var blob = UrlFetchApp.fetch(member.avatar_url).getBlob();
429+
var data = Utilities.base64EncodeWebSafe(blob.getBytes());
430+
userPhoto = AdminDirectory.Users.Photos.update({photoData: data}, useraccount.primaryEmail);
431+
}
432+
catch(err) {
433+
Logger.log("--------------------------");
434+
Logger.log("Error: %s",err.message);
435+
Logger.log("--------------------------");
436+
}
437+
438+
try {
439+
userPhoto = AdminDirectory.Users.get(useraccount.primaryEmail);
440+
keywordAvatarUpdatedToUpdate = member.avatar_updated + userPhoto.thumbnailPhotoEtag;
441+
Logger.log("Uppdaterat profilbild");
442+
}
443+
catch(err) {
444+
Logger.log("--------------------------");
445+
Logger.log("Error: %s",err.message);
446+
Logger.log("--------------------------");
447+
}
448+
}
449+
//Uppdatera sen Userfältet med avatar_updated och bildens etag
450+
Logger.log("Den nya avatarUpdated " + keywordAvatarUpdatedToUpdate);
451+
var keywordArray = [];
452+
var tmp_avatarUpdated = {
453+
"value": keywordAvatarUpdatedToUpdate,
454+
"type": "custom",
455+
"customType": "avatar_updated"
456+
};
457+
keywordArray.push(tmp_avatarUpdated);
458+
user.keywords = keywordArray;
459+
update = true;
460+
}
461+
if (useraccount.suspended) {
360462
Logger.log("Aktiverad.");
361463
user.suspended = false;
362464
}
@@ -493,7 +595,8 @@ function fetchScoutnetMembers() {
493595
'sex', 'address_co', 'address_1', 'address_2' , 'address_3', 'postcode', 'town',
494596
'country', 'contact_mobile_phone', 'contact_home_phone', 'contact_mothers_name',
495597
'contact_mobile_mum', 'contact_telephone_mum', 'contact_fathers_name', 'contact_mobile_dad',
496-
'contact_telephone_dad', 'prev_term', 'prev_term_due_date', 'current_term', 'current_term_due_date'];
598+
'contact_telephone_dad', 'prev_term', 'prev_term_due_date', 'current_term',
599+
'current_term_due_date', 'avatar_updated', 'avatar_url'];
497600

498601
//Dessa attributvärden ska användas som gemener för bättre jämförelser
499602
var variabel_lista_lowercase = ['email', 'contact_email_mum', 'contact_email_dad', 'contact_alt_email', 'extra_emails'];

Gemensamma_funktioner.gs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ function checkIfEmail(email) {
295295
function fetchScoutnetMembersOneMailinglist(scoutnet_list_id, cell_scoutnet_list_id) {
296296

297297
Logger.log("Scoutnet mailinglist-id=" + scoutnet_list_id);
298-
var email_fields = '&contact_fields=email_mum,email_dad,alt_email';
298+
var email_fields = '&contact_fields=email_mum,email_dad,alt_email,mobile_phone';
299299
var url = 'https://' + scoutnet_url + '/api/' + organisationType + '/customlists?id=' + groupId + '&key='+ api_key_mailinglists + '&list_id=' + scoutnet_list_id + email_fields;
300300
var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
301301
//Logger.log(response);
@@ -323,13 +323,13 @@ function fetchScoutnetMembersOneMailinglist(scoutnet_list_id, cell_scoutnet_list
323323
}
324324
}
325325

326-
var medlemmar = data.data;
326+
var medlemmar = data.data;
327327
//Logger.log(medlemmar);
328328

329329
for (x in medlemmar) {
330330
var medlem = medlemmar[x];
331331

332-
var variabel_lista_not_lowercase = ['member_no', 'first_name', 'last_name'];
332+
var variabel_lista_not_lowercase = ['member_no', 'first_name', 'last_name', 'mobile_phone'];
333333

334334
//Dessa attributvärden ska användas som gemener för bättre jämförelser
335335
var variabel_lista_lowercase = ['email', 'email_mum', 'email_dad', 'alt_email', 'extra_emails'];
@@ -587,7 +587,6 @@ function removeDublicates(list) {
587587
/**
588588
* Gör strängen till ett svenskt internationellt nummer om möjligt
589589
*/
590-
591590
function intphonenumber(phnum) {
592591
var rx = /^\+/;
593592
//Logger.log('telefonnummer före: %s', phnum);
@@ -622,20 +621,31 @@ function intphonenumber(phnum) {
622621
phnum = "+46" + phnum.replace(/[^0-9]/g, '').substr(1)
623622
}
624623
else {
625-
//phnum = null
624+
//phnum = null
626625
}
627626
}
628627
//Logger.log('done... %s',phnum);
629628

630-
return phnum
629+
return phnum
630+
}
631+
632+
633+
/**
634+
* Testa om telefonnumret följer E.164 format
635+
*/
636+
function validatePhonenumberForE164(phnum) {
637+
const regEx = /^\+[1-9]\d{1,14}$/;
638+
return regEx.test(phnum);
631639
}
632640

641+
633642
String.prototype.endsWith = function(suffix) {
634643
if (this.length < suffix.length)
635644
return false;
636645
return this.lastIndexOf(suffix) === this.length - suffix.length;
637646
}
638647

648+
639649
/**
640650
* Ersätt specialtecken med deras engelska bokstavsmotsvarigheter
641651
* https://stackoverflow.com/questions/18123501/replacing-accented-characters-with-plain-ascii-ones

Grupper.gs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,9 @@ function Grupper(start, slut) {
213213
//ändrat till en ogiltig e-postadress och sen ändrar tillbaka
214214
Logger.log("E-post ej ändrad för grupppen " + email);
215215
var cell=selection.getCell(rad_nummer, grd["e-post"]+1);
216-
cell.setBackground("white");
216+
if ("#ffffff" != cell.getBackground()) {
217+
cell.setBackground("white");
218+
}
217219

218220
var cell=selection.getCell(rad_nummer, grd["cell_url"]+1).getValue();
219221
if (cell=="") {
@@ -400,7 +402,7 @@ function deleteGroup(groupId) {
400402
*/
401403
function getGroupMember(groupId, memberkey) {
402404

403-
//Logger.log("Försöker hämta gruppmedlem:" + groupId);
405+
//Logger.log("Försöker hämta grupp:" + groupId);
404406
//Logger.log("Försöker med memberKey:" + memberkey);
405407

406408
for (var n=0; n<6; n++) {
@@ -1294,7 +1296,8 @@ function patchAdminGroupSettings(group, email) {
12941296
* @returns {object} - En Googlegrupp
12951297
*/
12961298
function getAdminDirectoryGroup(groupKey) {
1297-
1299+
Logger.log("GroupKey");
1300+
Logger.log(groupKey);
12981301
for (var n=0; n<6; n++) {
12991302
Logger.log("Funktionen getAdminDirectoryGroup körs " + n);
13001303

0 commit comments

Comments
 (0)