Skip to content

Commit 7ee698b

Browse files
committed
Working on member sync
1 parent ec631f2 commit 7ee698b

File tree

8 files changed

+48
-1
lines changed

8 files changed

+48
-1
lines changed

project/config/settings/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@
272272
HOLVI_BARCODE_IBAN = env('HOLVI_BARCODE_IBAN', default=None)
273273
HOLVI_NOTIFICATION_INTERVAL_DAYS = env('HOLVI_NOTIFICATION_INTERVAL_DAYS', default=7)
274274
SLACK_APIKEY = env('SLACK_APIKEY', default=None)
275+
SLACK_API_USERNAME = env('SLACK_API_USERNAME', default=None)
275276

276277
REST_FRAMEWORK = {
277278
'DEFAULT_AUTHENTICATION_CLASSES': [

project/slacksync/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# -*- coding: utf-8 -*-

project/slacksync/admin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
from django.contrib import admin
23

34
# Register your models here.

project/slacksync/membersync.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# -*- coding: utf-8 -*-
2+
from django.conf import settings
3+
from members.objects import Member
4+
from requests.sessions import Session
5+
6+
from .utils import api_configured, get_client
7+
8+
logger = logger.getLogger()
9+
10+
11+
class SlackMemberSync(object):
12+
def get_slack_users_simple(self, slack, exclude_api_user=True):
13+
response = slack.users.list()
14+
emails = []
15+
for member in response.body['members']:
16+
if 'email' not in memeber['profile']:
17+
# bot or similar
18+
continue
19+
if exclude_api_user and member['name'] == settings.SLACK_API_USERNAME:
20+
continue
21+
emails.append((member['id'], member['name'], member['profile']['email']))
22+
return emails
23+
24+
def sync_members(self, autodeactivate=False):
25+
"""Sync members, NOTE: https://github.com/ErikKalkoken/slackApiDoc/blob/master/users.admin.setInactive.md says
26+
deactivation via API works only on paid tiers"""
27+
with Session() as session:
28+
slack = get_client(session=session)
29+
slack_users = self.get_slack_users_simple(slack)
30+
slac_emails = [x[2] for x in slack_users]
31+
add_members = Member.objects.exclude(email__in=slack_emails)
32+
for member in add_members:
33+
try:
34+
resp = slack.users.admin.invite(member.email)
35+
if 'ok' not in resp.body or not resp.body['ok']:
36+
self.logger.error("Could not invite {}, response: {}".format(member.email, response.body))
37+
except Exception as e:
38+
logger.exception("Got exception when trying to invite {}".format(member.email))
39+
# TODO: check which members should be removed

project/slacksync/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
from django.db import models
23

34
# Create your models here.

project/slacksync/tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
from django.test import TestCase
23

34
# Create your tests here.

project/slacksync/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
# -*- coding: utf-8 -*-
12
from django.conf import settings
23
from slacker import Slacker
34

45

56
def api_configured():
6-
return bool(settings.SLACK_APIKEY)
7+
return bool(settings.SLACK_APIKEY) and bool(settings.SLACK_API_USERNAME)
8+
79

810
def get_client(**kwargs):
911
if not api_configured():

project/slacksync/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
from django.shortcuts import render
23

34
# Create your views here.

0 commit comments

Comments
 (0)