def project_members(): ''' List all members ''' pid = request.args['pid'] result = [] for team in Team.list_by_pid(pid=pid): data = {} data['name'] = team['name'] data['tid'] = team['tid'] data['chiefs'] = [] for user in User.get_info(uids=team['chiefs']).values(): h = hashlib.md5() h.update(user['oauth']['email'].encode('utf-8')) data['chiefs'].append({ 'name': user['profile']['badge_name'], 'email_hash': h.hexdigest(), }) data['members'] = [] for user in User.get_info( uids=list(set(team['members']) - set(team['chiefs']))).values(): h = hashlib.md5() h.update(user['oauth']['email'].encode('utf-8')) data['members'].append({ 'name': user['profile']['badge_name'], 'email_hash': h.hexdigest(), }) result.append(data) return jsonify({'data': result})
def members(pid, tid): team, project, _redirect = check_the_team_and_project_are_existed(pid=pid, tid=tid) if _redirect: return _redirect is_admin = (g.user['account']['_id'] in team['chiefs'] or \ g.user['account']['_id'] in team['owners'] or \ g.user['account']['_id'] in project['owners']) uids = [] uids.extend(team['chiefs']) uids.extend(team['members']) uids = list(set(uids)) users_info = User.get_info(uids=uids) members = [] for uid in uids: if uid in users_info: user = users_info[uid] user['chat'] = {} mid = MattermostTools.find_possible_mid(uid=uid) if mid: user['chat'] = {'mid': mid, 'name': MattermostTools.find_user_name(mid=mid)} members.append(user) members = sorted(members, key=lambda u: u['profile']['badge_name'].lower()) return render_template('./team_members.html', project=project, team=team, is_admin=is_admin, members=members)
def mail_member_del(sender): ''' mail member del ''' tplenv = Environment(loader=FileSystemLoader('./templates/mail')) template = tplenv.get_template('./base_member_del.html') team_member_change_db = TeamMemberChangedDB() awsses = AWSSES( aws_access_key_id=setting.AWS_ID, aws_secret_access_key=setting.AWS_KEY, source=setting.AWS_SES_FROM) for raw in team_member_change_db.find( {'done.mail': {'$exists': False}, 'case': 'del'}, sort=(('create_at', 1), )): team = Team.get(raw['pid'], raw['tid']) user = User.get_info(uids=(raw['uid'], ))[raw['uid']] body = template.render( name=user['profile']['badge_name'], team_name=team['name'], ) raw_mail = awsses.raw_mail( to_addresses=( dict(name=user['profile']['badge_name'], mail=user['oauth']['email']), ), subject=f"您已被移除 {team['name']} 的組員資格!", body=body, ) resp = mail_member_send.apply_async( kwargs={'raw_mail': raw_mail.as_string(), 'rid': str(raw['_id'])}) logger.info(resp)
def mail_member_welcome(sender, **kwargs): TPLENV = Environment(loader=FileSystemLoader('./templates/mail')) template = TPLENV.get_template('./welcome.html') awsses = AWSSES(aws_access_key_id=setting.AWS_ID, aws_secret_access_key=setting.AWS_KEY, source=setting.AWS_SES_FROM) uids = [] for u in MailLetterDB().need_to_send(code='welcome'): uids.append(u['_id']) if not uids: return service_sync_mattermost_invite.apply_async(kwargs={'uids': uids}) users = User.get_info(uids=uids) for uid in uids: logger.info('uid: %s' % uid) body = template.render(name=users[uid]['profile']['badge_name'], ) raw_mail = awsses.raw_mail( to_addresses=(dict(name=users[uid]['profile']['badge_name'], mail=users[uid]['oauth']['email']), ), subject=u'歡迎使用志工服務系統 - %s' % users[uid]['profile']['badge_name'], body=body, ) resp = awsses.send_raw_email(data=raw_mail) logger.info(resp) if resp['ResponseMetadata']['HTTPStatusCode'] != 200: raise Exception('HTTPStatusCode not `200`, do retry') MailLetterDB().make_sent(uid=uid, code='welcome')
def get_from_user(pid, tids): ''' Get users from userdb by project, team :param str pid: pid :param str tids: team id or ids :return: fields, raws ''' if isinstance(tids, str): tids = (tids, ) team_users = Team.get_users(pid=pid, tids=tids) uids = [] for user_ids in team_users.values(): uids.extend(user_ids) user_infos = User.get_info(uids=uids) datas = [] for uid in user_infos: # append, plus more data here in the future datas.append({ 'name': user_infos[uid]['profile']['badge_name'], 'mail': user_infos[uid]['oauth']['email'], }) raws = [] for data in datas: raw = [] for field in ('name', 'mail'): raw.append(data[field]) raws.append(raw) return (('name', 'mail'), raws)
def service_sync_gsuite_team_members(sender, **kwargs): team = Team.get(pid=kwargs['pid'], tid=kwargs['tid']) if 'to_team' in kwargs: to_team = Team.get(pid=kwargs['to_team'][0], tid=kwargs['to_team'][1]) if 'mailling' not in to_team or not to_team['mailling']: return mailling = to_team['mailling'] else: if 'mailling' not in team or not team['mailling']: return mailling = team['mailling'] uids = [] uids.extend(team['chiefs']) uids.extend(team['members']) users_info = User.get_info(uids=uids) sync_gsuite = SyncGSuite(credentialfile=setting.GSUITE_JSON, with_subject=setting.GSUITE_ADMIN) sync_gsuite.add_users_into_group( group=mailling, users=[u['oauth']['email'] for u in users_info.values()]) logger.info('%s %s', mailling, [u['oauth']['email'] for u in users_info.values()])
def project_form_accommodation(pid): ''' Project form accommodation ''' project = Project.get(pid) if g.user['account']['_id'] not in project['owners']: return redirect( url_for('project.team_page', pid=pid, _scheme='https', _external=True)) if request.method == 'GET': return render_template('./project_form_accommodation.html', project=project) if request.method == 'POST': post_data = request.get_json() if post_data['casename'] == 'get': all_users = {} for team in Team.list_by_pid(pid=pid): for uid in team['chiefs'] + team['members']: all_users[uid] = {'tid': team['tid']} raws = [] for raw in FormAccommodation.get(pid): if raw['uid'] not in all_users: continue raws.append(raw) user_infos = User.get_info(uids=[raw['uid'] for raw in raws], need_sensitive=True) datas = [] for raw in raws: user_info = user_infos[raw['uid']] datas.append({ 'uid': raw['uid'], 'name': user_info['profile']['badge_name'], 'picture': user_info['oauth']['picture'], 'roc_id': user_info['profile_real']['roc_id'], 'tid': all_users[raw['uid']]['tid'], 'room': raw['data'].get('room', ''), 'room_key': raw['data'].get('room_key', ''), 'data': raw['data'], }) return jsonify({'datas': datas}) if post_data['casename'] == 'update': for data in post_data['datas']: logging.info('uid: %s, room: %s', data['uid'].strip(), data['room'].strip()) FormAccommodation.update_room(pid=pid, uid=data['uid'].strip(), room=data['room'].strip()) return jsonify({}) return jsonify({}), 404
def user_page(uid, nickname=None): user = User(uid=uid).get() if not user: return u'', 200 oauth = OAuth(user['mail']).get() if 'profile' in user and 'badge_name' in user['profile']: _nickname = user['profile']['badge_name'] else: _nickname = oauth['data']['name'] _nickname = quote_plus(_nickname) if nickname is None or nickname != _nickname: return redirect(url_for('user.user_page', uid=uid, nickname=_nickname)) if 'profile' not in user: badge_name = '' intro = '' else: badge_name = user['profile']['badge_name'] intro = re.sub('<a href="javascript:.*"', '<a href="/"', markdown(html.escape(user['profile']['intro']))) participate_in = [] for p in Team.participate_in(uid): p['_project'] = Project.get(p['pid']) p['_title'] = '???' if uid in p['chiefs']: p['_title'] = 'chief' elif uid in p['members']: p['_title'] = 'member' p['_action_date'] = arrow.get( p['_project']['action_date']).format('YYYY/MM') participate_in.append(p) participate_in = sorted(participate_in, key=lambda p: p['_project']['action_date'], reverse=True) mattermost_data = {} mid = MattermostTools.find_possible_mid(uid=uid) if mid: mattermost_data['mid'] = mid mattermost_data['username'] = MattermostTools.find_user_name(mid=mid) return render_template( './user.html', badge_name=badge_name, intro=intro, oauth=oauth, user=user, mattermost_data=mattermost_data, participate_in=participate_in, )
def service_sync_mattermost_invite(sender, **kwargs): mmb = MattermostBot(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) users_info = User.get_info(uids=kwargs['uids']) r = mmb.post_invite_by_email( team_id=setting.MATTERMOST_TEAM_ID, emails=[users_info[uid]['oauth']['email'] for uid in users_info]) logger.info(r.json())
def team_edit_user_api(pid, tid): team, project, _redirect = check_the_team_and_project_are_existed(pid=pid, tid=tid) if _redirect: return _redirect is_admin = (g.user['account']['_id'] in team['chiefs'] or \ g.user['account']['_id'] in team['owners'] or \ g.user['account']['_id'] in project['owners']) if not is_admin: return redirect('/') if request.method == 'GET': user = User(uid=request.args['uid']).get() user_waitting = WaitList.list_by_team(pid=pid, tid=tid, uid=user['_id']) if not user_waitting: return jsonify({}) users_info = User.get_info([user['_id'], ]) user_data = { 'badge_name': users_info[user['_id']]['profile']['badge_name'], 'picture': users_info[user['_id']]['oauth']['picture'], 'uid': user['_id'], 'note': user_waitting['note'], 'wid': u'%(_id)s' % user_waitting, } return jsonify(user_data) elif request.method == 'POST': all_members = len(team['members']) + len(team['chiefs']) if 'headcount' in team and team['headcount'] and all_members >= team['headcount']: return jsonify({'status': 'fail', 'message': 'over headcount.'}), 406 data = request.json w = WaitList.make_result(wid=data['wid'], pid=pid, uid=data['uid'], result=data['result']) if w and 'result' in w: if w['result'] == 'approval': Team.update_members(pid=pid, tid=tid, add_uids=[data['uid'], ]) elif w['result'] == 'deny': TeamMemberChangedDB().make_record(pid=pid, tid=tid, deny_uids=(data['uid'], )) return jsonify({'status': 'ok'})
def service_sync_mattermost_invite(sender, **kwargs): ''' Sync mattermost invite ''' mmb = MattermostBot(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) users_info = User.get_info(uids=kwargs['uids']) resp = mmb.post_invite_by_email( team_id=setting.MATTERMOST_TEAM_ID, emails=[value['oauth']['email'] for value in users_info.values()]) logger.info(resp.json())
def test_create_and_oauth(): ''' test create user ''' _mail = '*****@*****.**' with pytest.raises(Exception) as error: User.create(mail=_mail) assert str(error.value) == f'mail: `{_mail}` not in the oauth dbs' OAuthDB().add_data(mail=_mail, data={}) OAuthDB().find_one_and_update({'_id': _mail}, {'$set': { 'owner': '00000000' }}) with pytest.raises(Exception) as error: User.create(mail=_mail) assert str(error.value) == f'mail:`{_mail}` already bind'
def get_all_users() -> tuple[tuple[str, str], list[tuple[str, str]]]: ''' Get all users Returns: Return a tuple with `('name', 'mail')` at first. The second is the all datas. ''' uids = [] for user in User.get_all_users(): uids.append(user['_id']) user_infos = User.get_info(uids=uids) raws = [] for value in user_infos.values(): raws.append(( value['profile']['badge_name'], value['oauth']['email'], )) return (('name', 'mail'), raws)
def test_update_profile(): ''' Test update profile ''' _mail = '*****@*****.**' OAuthDB().add_data(mail=_mail, data={}) created_user = User.create(mail=_mail) data = {'nickname': 'nick coscup'} updated_user = User(uid=created_user['_id']).update_profile(data=data) assert updated_user['profile']['nickname'] == 'nick coscup' real_data = {'name': 'COSCUP'} updated_user = User(uid=created_user['_id']).update_profile_real( data=real_data) assert updated_user['profile_real']['name'] == 'COSCUP' suspend_user = User(uid=created_user['_id']).property_suspend() assert suspend_user['property']['suspend']
def by_project_index(pid): ''' Project index ''' project = Project.get(pid) if not project: return redirect('/') is_admin = Budget.is_admin(pid=pid, uid=g.user['account']['_id']) if not is_admin: return redirect('/') if request.method == 'GET': return render_template('./expense.html', project=project, is_admin=is_admin) if request.method == 'POST': data = request.get_json() if data['casename'] == 'get': datas = list(Expense.get_all_by_pid(pid=pid)) buids = set() uids = set() for expense in datas: buids.add(expense['request']['buid']) uids.add(expense['create_by']) budgets = {} if buids: for raw in Budget.get(buids=list(buids), pid=pid): budgets[raw['_id']] = raw users = {} if uids: user_datas = User.get_info(uids=list(uids)) for uid, value in user_datas.items(): users[uid] = { 'oauth': value['oauth'], 'profile': {'badge_name': value['profile']['badge_name']}, } return jsonify({'datas': datas, 'budgets': budgets, 'users': users, 'status': Expense.status()}) if data['casename'] == 'update': # update invoices Expense.update_invoices( expense_id=data['data']['_id'], invoices=data['data']['invoices']) Expense.update_enable( expense_id=data['data']['_id'], enable=data['data']['enable']) result = Expense.update_status( expense_id=data['data']['_id'], status=data['data']['status']) return jsonify({'result': result}) return jsonify({}), 404
def team_expense_index(pid, tid): ''' Team expense index ''' team, project, _redirect = check_the_team_and_project_are_existed(pid=pid, tid=tid) if _redirect: return _redirect if not (g.user['account']['_id'] in team['members'] or g.user['account']['_id'] in team['chiefs']): return redirect('/') if request.method == 'POST': data = request.get_json() if data['casename'] == 'get': teams = [] for _team in Team.list_by_pid(pid=project['_id']): teams.append({'name': _team['name'], 'tid': _team['tid']}) select_team = data['select_team'] if select_team == '': select_team = team['tid'] items = [] for item in Budget.get_by_tid(pid=pid, tid=select_team, only_enable=True): items.append(item) bank = User.get_bank(uid=g.user['account']['_id']) return jsonify({ 'teams': teams, 'items': items, 'select_team': select_team, 'bank': bank }) if data['casename'] == 'add_expense': # create expense and send notification. expense = Expense.process_and_add(pid=project['_id'], tid=team['tid'], uid=g.user['account']['_id'], data=data) expense_create.apply_async(kwargs={'expense': expense}) return jsonify(data) if data['casename'] == 'get_has_sent': data = Expense.get_has_sent(pid=project['_id'], budget_id=data['buid']) return jsonify({'data': list(data)}) return jsonify({}), 404
def mail_member_waiting(sender): ''' mail member waiting ''' template = Environment(loader=FileSystemLoader( './templates/mail')).get_template('./base_member_waiting.html') team_member_change_db = TeamMemberChangedDB() awsses = AWSSES( aws_access_key_id=setting.AWS_ID, aws_secret_access_key=setting.AWS_KEY, source=setting.AWS_SES_FROM) for raw in team_member_change_db.find( {'done.mail': {'$exists': False}, 'case': 'waiting'}, sort=(('create_at', 1), )): team = Team.get(raw['pid'], raw['tid']) uids = [] uids.extend(team['chiefs']) uids.append(raw['uid']) users = User.get_info(uids=uids) mmt = MattermostTools(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) for uid in team['chiefs']: body = template.render( name=users[uid]['profile']['badge_name'], uid=raw['uid'], apply_name=users[raw['uid']]['profile']['badge_name'], team_name=team['name'], pid=team['pid'], tid=team['tid'], ) raw_mail = awsses.raw_mail( to_addresses=(dict( name=users[uid]['profile']['badge_name'], mail=users[uid]['oauth']['email']), ), subject=f"申請加入通知信 - {users[raw['uid']]['profile']['badge_name']}", body=body, ) resp = mail_member_send.apply_async( kwargs={'raw_mail': raw_mail.as_string(), 'rid': str(raw['_id'])}) logger.info(resp) mid = mmt.find_possible_mid(uid=uid) if mid: channel_info = mmt.create_a_direct_message( users=(mid, setting.MATTERMOST_BOT_ID)).json() resp = mmt.posts( channel_id=channel_info['id'], message=f"收到 **{users[raw['uid']]['profile']['badge_name']}** 申請加入 **{team['name']}**,前往 [管理組員](https://volunteer.coscup.org/team/{team['pid']}/{team['tid']}/edit_user)", # pylint: disable=line-too-long ) logger.info(resp.json())
def user_add() -> None: ''' Create an dev user ''' user_info = { 'id': '000000000000000000000', 'email': '*****@*****.**', 'verified_email': True, 'name': 'Volunteer Dev (testing)', 'given_name': 'Volunteer', 'family_name': 'Dev', 'picture': '', 'locale': 'en', } # ----- save oauth info ----- # OAuth.add(mail=user_info['email'], data=user_info, token=Token()) # ----- Check account or create ----- # owner = OAuth.owner(mail=user_info['email']) if owner: user = User(uid=owner).get() else: user = User.create(mail=user_info['email']) user_session = USession.make_new(uid=user['_id'], header={}) click.echo(click.style('\n[!] Next step', bold=True)) click.echo( click.style(' | Please visit these link to setup the cookie/session:', fg='yellow', bold=True)) click.echo( click.style( f' -> http://127.0.0.1/dev/cookie?sid={user_session.inserted_id}', fg='green', bold=True)) click.echo('') click.echo( click.style('Thank you for your contribution!', fg='cyan', bold=True)) click.echo('')
def index(pid, tid): ''' Index page ''' team, project, _redirect = check_the_team_and_project_are_existed(pid=pid, tid=tid) if _redirect: return _redirect is_admin = (g.user['account']['_id'] in team['chiefs'] or g.user['account']['_id'] in team['owners'] or g.user['account']['_id'] in project['owners']) if not is_admin: return redirect('/') # ..note:: # 1. create campaign (campaign name) / list campaign # 2. write title, content(jinja2, markdown) # 3. pick up receiver # 4. send / send test if request.method == 'GET': return render_template('./sender.html') if request.method == 'POST': data = request.get_json() if 'casename' in data and data['casename'] == 'get': campaigns = list( SenderCampaign.get_list(pid=team['pid'], tid=team['tid'])) raw_users_info = User.get_info( uids=[c['created']['uid'] for c in campaigns]) users_info = {} for uid, value in raw_users_info.items(): users_info[uid] = { 'uid': uid, 'name': value['profile']['badge_name'] } return jsonify({'campaigns': campaigns, 'users_info': users_info}) if 'casename' in data and data['casename'] == 'create': resp = SenderCampaign.create(name=data['name'], pid=team['pid'], tid=team['tid'], uid=g.user['account']['_id']) return jsonify({'cid': resp['_id']}) return jsonify({})
def read(pid, task_id): ''' Read ''' project_info = Project.get(pid=pid) if not project_info: return '404', 404 task = Tasks.get_with_pid(pid=pid, _id=task_id) if not task: return redirect( url_for('tasks.project', pid=pid, _scheme='https', _external=True)) task['starttime'] = arrow.get( task['starttime']).to('Asia/Taipei').format('YYYY-MM-DD HH:mm') if task['endtime']: task['endtime'] = arrow.get( task['endtime']).to('Asia/Taipei').format('YYYY-MM-DD HH:mm') uid = g.get('user', {}).get('account', {}).get('_id') if request.method == 'GET': creator = {} user_info = User.get_info(uids=[ task['created_by'], ]) creator['name'] = user_info[ task['created_by']]['profile']['badge_name'] creator['uid'] = task['created_by'] mid = MattermostTools.find_possible_mid(uid=task['created_by']) if mid: creator['mattermost_uid'] = MattermostTools.find_user_name(mid=mid) return render_template('./tasks_detail.html', task=task, creator=creator, uid=uid) if request.method == 'POST': if not uid: return jsonify({'info': 'Need login'}), 401 post_data = request.get_json() if post_data['casename'] == 'join': Tasks.join(pid=pid, task_id=task['_id'], uid=uid) elif post_data['casename'] == 'cancel': Tasks.cancel(pid=pid, task_id=task['_id'], uid=uid) return jsonify({}) return jsonify({})
def project_dietary_habit(pid): ''' Project dietary habit ''' project = Project.get(pid) if g.user['account']['_id'] not in project['owners']: return redirect( url_for('project.team_page', pid=pid, _scheme='https', _external=True)) if request.method == 'GET': return render_template('./project_dietary_habit.html', project=project) if request.method == 'POST': post_data = request.get_json() if post_data['casename'] == 'get': all_users = {} for team in Team.list_by_pid(pid=pid): for uid in team['chiefs'] + team['members']: all_users[uid] = {'tid': team['tid']} user_infos = User.get_info(uids=list(all_users.keys()), need_sensitive=True) datas = [] for uid, value in all_users.items(): user_info = user_infos[uid] data = { 'uid': uid, 'name': user_info['profile']['badge_name'], 'picture': user_info['oauth']['picture'], 'tid': value['tid'], 'dietary_habit': [], } if 'profile_real' in user_info and 'dietary_habit' in user_info[ 'profile_real']: data['dietary_habit'] = user_info['profile_real'][ 'dietary_habit'] datas.append(data) return jsonify({ 'datas': datas, 'dietary_habit': DietaryHabit.ITEMS }) return '', 404
def profile_real(): if request.method == 'GET': user = g.user['account'] default_code = '886' if 'profile_real' not in user: user['profile_real'] = {} else: try: phone = phonenumbers.parse(user['profile_real']['phone'], None) user['profile_real']['phone'] = phonenumbers.format_number(phone, phonenumbers.PhoneNumberFormat.NATIONAL) default_code = phone.country_code except phonenumbers.phonenumberutil.NumberParseException: pass if 'bank' not in user['profile_real']: user['profile_real']['bank'] = {} phone_codes = sorted(phonenumbers.COUNTRY_CODE_TO_REGION_CODE.items(), key= lambda x: x[1][0]) return render_template('./setting_profile_real.html', user=user, phone_codes=phone_codes, default_code=default_code) elif request.method == 'POST': try: phone = phonenumbers.parse('+%(phone_code)s %(phone)s' % request.form) phone = phonenumbers.format_number(phone, phonenumbers.PhoneNumberFormat.E164) except phonenumbers.phonenumberutil.NumberParseException: phone = '' data = { 'name': request.form['name'].strip(), 'phone': phone, 'birthday': request.form['birthday'].strip(), 'roc_id': request.form['roc_id'].strip(), 'company': request.form['company'].strip(), 'bank': { 'code': request.form['account_bank_code'].strip(), 'no': request.form['account_bank_no'].strip(), 'branch': request.form['account_bank_branch'].strip(), 'name': request.form['account_bank_name'].strip(), } } User(uid=g.user['account']['_id']).update_profile_real(data) MC.get_client().delete('sid:%s' % session['sid']) return redirect(url_for('setting.profile_real', _scheme='https', _external=True))
def profile(): if request.method == 'GET': user = g.user['account'] if 'profile' not in user: user['profile'] = {} return render_template('./setting_profile.html', user=user) elif request.method == 'POST': data = { 'badge_name': request.form['badge_name'], 'intro': request.form['intro'], } User(uid=g.user['account']['_id']).update_profile(data) MC.get_client().delete('sid:%s' % session['sid']) return redirect(url_for('setting.profile', _scheme='https', _external=True))
def project_contact_book(pid): ''' Project contact book ''' project = Project.get(pid) if g.user['account']['_id'] not in project['owners']: return redirect( url_for('project.team_page', pid=pid, _scheme='https', _external=True)) if request.method == 'GET': return render_template('./project_contact_book.html', project=project) if request.method == 'POST': post_data = request.get_json() if post_data['casename'] == 'get': all_users = {} for team in Team.list_by_pid(pid=pid): for uid in team['chiefs'] + team['members']: all_users[uid] = {'tid': team['tid']} user_infos = User.get_info(uids=list(all_users.keys()), need_sensitive=True) mmt = MattermostTools(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) datas = [] for uid, value in all_users.items(): user_info = user_infos[uid] data = { 'uid': uid, 'name': user_info['profile']['badge_name'], 'picture': user_info['oauth']['picture'], 'tid': value['tid'], 'email': user_info['oauth']['email'], } if 'profile_real' in user_info: data['phone'] = user_info['profile_real'].get('phone', '') data['user_name'] = mmt.find_user_name( mmt.find_possible_mid(uid=uid)) datas.append(data) return jsonify({'datas': datas}) return jsonify({}), 404
def service_sync_gsuite_team_leader(sender, **kwargs): chiefs = [] # note: sync all, include `disabled` team for team in TeamDB(pid=None, tid=None).find({'pid': kwargs['pid']}): chiefs.extend(team['chiefs']) users_info = User.get_info(uids=chiefs) project = Project.get(pid=kwargs['pid']) sync_gsuite = SyncGSuite(credentialfile=setting.GSUITE_JSON, with_subject=setting.GSUITE_ADMIN) sync_gsuite.add_users_into_group( group=project['mailling_staff'], users=[u['oauth']['email'] for u in users_info.values()]) logger.info('%s %s', project['mailling_staff'], [u['oauth']['email'] for u in users_info.values()])
def get_peoples_info(pid: str, task_id: str) -> Optional[dict[str, Any]]: ''' Get peoples info Args: pid (str): Project id. task_id (str): Task id. Returns: Return the datas. ''' task = TasksDB().find_one({'pid': pid, '_id': task_id}, {'people': 1}) if task: uids = task['people'] return User.get_info(uids=uids) return None
def mail_member_add(sender, **kwargs): TPLENV = Environment(loader=FileSystemLoader('./templates/mail')) template = TPLENV.get_template('./base_member_add.html') team_member_change_db = TeamMemberChangedDB() awsses = AWSSES(aws_access_key_id=setting.AWS_ID, aws_secret_access_key=setting.AWS_KEY, source=setting.AWS_SES_FROM) for raw in team_member_change_db.find( { 'done.mail': { '$exists': False }, 'case': 'add' }, sort=(('create_at', 1), )): team = Team.get(raw['pid'], raw['tid']) user = User.get_info(uids=(raw['uid'], ))[raw['uid']] body = template.render( name=user['profile']['badge_name'], team_name=team['name'], pid=team['pid'], tid=team['tid'], ) raw_mail = awsses.raw_mail( to_addresses=(dict(name=user['profile']['badge_name'], mail=user['oauth']['email']), ), subject=u'申請加入 %s 核准' % team['name'], body=body, ) r = mail_member_send.apply_async(kwargs={ 'raw_mail': raw_mail.as_string(), 'rid': str(raw['_id']) }) service_sync_mattermost_add_channel.apply_async(kwargs={ 'pid': raw['pid'], 'uids': (raw['uid'], ) }) logger.info(r)
def expense_create(sender, **kwargs): ''' Expense create ''' pid = kwargs['expense']['pid'] buid = kwargs['expense']['request']['buid'] budget = None for data in Budget.get(buids=[ buid, ], pid=pid): budget = data if not budget: return uids = set() for team in TeamDB(pid=None, tid=None).find({ 'pid': pid, 'tid': 'finance' }): uids.update(team['chiefs']) uids.update(team['members']) uids.update(Project.get(pid=pid)['owners']) uids.add(kwargs['expense']['create_by']) logger.info(uids) users = User.get_info(uids=list(uids)) mmt = MattermostTools(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) for uid in uids: mid = mmt.find_possible_mid(uid=uid) if mid: channel_info = mmt.create_a_direct_message( users=(mid, setting.MATTERMOST_BOT_ID)).json() resp = mmt.posts( channel_id=channel_info['id'], message= f"""收到 **{users[kwargs['expense']['create_by']]['profile']['badge_name']}** 申請費用 - **[{kwargs['expense']['code']}] / {budget['name']}**,前往 [管理費用](https://volunteer.coscup.org/expense/{pid})""", ) logger.info(resp.json())
def replace(pid: str, cid: str, datas: list[dict[str, Any]]) -> None: ''' Replace Args: pid (str): Project id. cid (str): Campaign id. datas (list): List of receiver datas. `name`, `mail` are required or include `uid` for auto replace the `name`, `mail` value. ''' sender_receiver_db = SenderReceiverDB() sender_receiver_db.remove_past(pid=pid, cid=cid) uids = [] for data in datas: if 'uid' in data and data['uid']: uids.append(data['uid']) user_infos = User.get_info(uids=uids) user_info_uids = {} for uid, data in user_infos.items(): user_info_uids[uid] = { 'name': data['profile']['badge_name'], 'mail': data['oauth']['email'], } save_datas = [] for data in datas: if 'uid' in data and data['uid'] and data['uid'] in user_info_uids: _data = SenderReceiverDB.new(pid=pid, cid=cid, name=user_info_uids[data['uid'] ]['name'], mail=user_info_uids[data['uid'] ]['mail'], ) else: _data = SenderReceiverDB.new( pid=pid, cid=cid, name=data['name'], mail=data['mail']) _data['data'].update(data) save_datas.append(_data) sender_receiver_db.update_data(pid=pid, cid=cid, datas=save_datas)
def get_by_tags(pid: str, tid: str, tags: list[str]) -> tuple[tuple[str, str], list[tuple[str, str]]]: ''' Get users by tags Returns: Return a tuple with `('name', 'mail')` at first. The second is the all datas. ''' uids = Team.get_members_uid_by_tags(pid=pid, tid=tid, tags=tags) user_infos = User.get_info(uids=uids) raws = [] for value in user_infos.values(): raws.append(( value['profile']['badge_name'], value['oauth']['email'], )) return (('name', 'mail'), raws)