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 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 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 project_edit_create_team(pid): 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)) teams = Team.list_by_pid(project['_id'], show_all=True) return render_template('./project_edit_create_team.html', project=project, teams=teams)
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 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_mattermost_users_position(sender, **kwargs): ''' Sync mattermost users position ''' # pylint: disable=too-many-locals,too-many-branches pids = [] for project in Project.all(): if project['action_date'] >= time(): pids.append(project['_id']) if not pids: return for pid in pids: users = {} for team in Team.list_by_pid(pid=pid): team_name = team['name'].split('-')[0].strip() for chief in team['chiefs']: if chief not in users: users[chief] = [] if team['tid'] == 'coordinator': users[chief].append('ЪїЪуИйтЈг') else: users[chief].append(f'РГљ№ИЈухёжЋи@{team_name}') team['members'] = set(team['members']) - set(team['chiefs']) for member in team['members']: if member not in users: users[member] = [] users[member].append(f'{team_name}(ухётЊА)') mmt = MattermostTools(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) mmb = MattermostBot(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) for uid, value in users.items(): mid = mmt.find_possible_mid(uid=uid) if not mid: continue position = [ pid, ] position.extend(value) position.append(f'[{uid}]') mmb.put_users_patch(uid=mid, position=' '.join(position))
def service_sync_mattermost_users_position(sender, **kwargs): pids = [] for project in Project.all(): if project['action_date'] >= time(): pids.append(project['_id']) if not pids: return for pid in pids: users = {} for team in Team.list_by_pid(pid=pid): team_name = team['name'].split('-')[0].strip() for chief in team['chiefs']: if chief not in users: users[chief] = [] if team['tid'] == 'coordinator': users[chief].append('ЪїЪуИйтЈг') else: users[chief].append('РГљ№ИЈухёжЋи@%s' % team_name) team['members'] = set(team['members']) - set(team['chiefs']) for member in team['members']: if member not in users: users[member] = [] users[member].append('%s(ухётЊА)' % team_name) mmt = MattermostTools(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) mmb = MattermostBot(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) for uid in users: mid = mmt.find_possible_mid(uid=uid) if not mid: continue position = [ pid, ] position.extend(users[uid]) position.append('[%s]' % uid) mmb.put_users_patch(uid=mid, position=' '.join(position))
def team_page(pid): ''' Team page ''' teams = [] project = Project.get(pid) if not project: return 'no data', 404 data = list(Team.list_by_pid(project['_id'])) uids = [] for team in data: uids.extend(team['chiefs']) total = 0 user_info = User.get_info(uids) for team in data: team['chiefs_name'] = [] for uid in team['chiefs']: team['chiefs_name'].append( f'''<a href="/user/{uid}">{user_info[uid]['profile']['badge_name']}</a>''' ) team['count'] = len(set(team['chiefs'] + team['members'])) total += team['count'] # ----- group for layout ----- # per = 3 for i in range(int(math.ceil(len(data) / float(per)))): teams.append(data[per * i:min([per * (i + 1), len(data)])]) editable = g.user['account']['_id'] in project['owners'] return render_template( './project_teams_index.html', teams=teams, project=project, editable=editable, total=total, )
def service_sync_mattermost_projectuserin_channel(sender, **kwargs): pids = {} for project in Project.all(): if project['action_date'] >= time( ) and 'mattermost_ch_id' in project and project['mattermost_ch_id']: pids[project['_id']] = project['mattermost_ch_id'] if not pids: return mmt = MattermostTools(token=setting.MATTERMOST_BOT_TOKEN, base_url=setting.MATTERMOST_BASEURL) for pid in pids: uids = set() for team in Team.list_by_pid(pid=pid): uids.update(team['chiefs']) uids.update(team['members']) for uid in uids: mid = mmt.find_possible_mid(uid=uid) if mid: r = mmt.post_user_to_channel(channel_id=pids[pid], uid=mid) logger.info(r.json())
def by_project_index(pid): ''' index ''' # pylint: disable=too-many-return-statements,too-many-branches 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('./budget.html', project=project, is_admin=is_admin) 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']}) default_budget = { 'bid': '', 'uid': '', 'name': '', 'total': 0, 'paydate': '', 'desc': '', 'estimate': '', 'tid': '', 'currency': 'TWD', } items = [] for item in Budget.get_by_pid(pid=pid): if item['enabled']: item['enabled'] = 'true' else: item['enabled'] = 'false' items.append(item) return jsonify({ 'teams': teams, 'default_budget': default_budget, 'items': items }) if data['casename'] == 'check_bid': return jsonify( {'existed': bool(Budget.get_by_bid(pid=pid, bid=data['bid']))}) if data['casename'] == 'add': item = Budget.add(pid=pid, tid=data['data']['tid'], data=data['data']) return jsonify({'data': item}) if data['casename'] == 'edit': if data['data']['enabled'] == 'true': data['data']['enabled'] = True else: data['data']['enabled'] = False item = Budget.edit(pid=pid, data=data['data']) if item['enabled']: item['enabled'] = 'true' else: item['enabled'] = 'false' return jsonify({'data': item}) return jsonify({})
def team_expense_my(pid, tid): ''' Team expense my ''' # pylint: disable=too-many-locals 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 == 'GET': budget_admin = Budget.is_admin(pid=pid, uid=g.user['account']['_id']) return render_template('./expense_my.html', project=project, team=team, budget_menu=budget_admin) 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']}) buids = set() uids = set() items = [] for item in Expense.get_by_create_by( pid=pid, create_by=g.user['account']['_id']): buids.add(item['request']['buid']) uids.add(item['create_by']) items.append(item) 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({ 'teams': teams, 'items': items, 'budgets': budgets, 'users': users, 'status': Expense.status() }) if data['casename'] == 'update': invoices = {} status = '' for expense in Expense.get_by_eid(expense_id=data['eid']): status = expense['status'] for invoice in expense['invoices']: invoices[invoice['iv_id']] = invoice for invoice in data['invoices']: if invoice['iv_id'] in invoices: if status in ('1', ): invoices[invoice['iv_id']]['total'] = invoice['total'] if status in ('1', '2', '3'): invoices[invoice['iv_id']]['status'] = invoice[ 'status'].strip() invoices[invoice['iv_id']]['name'] = invoice[ 'name'].strip() Expense.update_invoices(expense_id=data['eid'], invoices=list(invoices.values())) if status in ('1', ): Expense.update_bank(expense_id=data['eid'], bank=data['bank']) if status in ('1', '2', '3'): Expense.update_request(expense_id=data['eid'], rdata=data['req']) return jsonify({'data': data}) if data['casename'] == 'remove': status = '' for expense in Expense.get_by_eid(expense_id=data['eid']): status = expense['status'] if status in ('1', ): Expense.update_enable(expense_id=data['eid'], enable=False) return jsonify({}) return jsonify({}), 404
def batch(pid): ''' batch upload ''' 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('./budget_batch.html', project=project, is_admin=is_admin) if request.method == 'POST': if request.is_json: data = request.get_json() if data and data.get('casename') == 'get': teams = [{ 'name': team['name'], 'tid': team['tid'] } for team in Team.list_by_pid(pid=project['_id'])] return jsonify({'teams': teams}) if request.files and 'file' in request.files: csv_file = list( csv.DictReader( io.StringIO('\n'.join(request.files['file'].read().decode( 'utf8').split('\n')[1:])))) result, error_result = Budget.verify_batch_items(items=csv_file) dedup_result = [] dup_bids = [] # Pylint unnecessary-lambda-assignment / C3001 # Lambda expression assigned to a variable. # Define a function using the "def" keyword instead. def has_bid_in_budget(bid): return Budget.get_by_bid(pid=pid, bid=bid) def has_added(item): return item['action'] == 'add' and has_bid_in_budget( item['bid']) def did_update_nonexisted_entry(item): return \ item['action'] == 'update' and not has_bid_in_budget( item['bid']) for item in result: if has_added(item) or did_update_nonexisted_entry(item): dup_bids.append(item['bid']) else: dedup_result.append(item) if request.form['casename'] == 'verify': return jsonify({ 'file': csv_file, 'confirmed': dedup_result, 'error_items': error_result, 'dup_bids': dup_bids, }) if request.form['casename'] == 'save': for item in dedup_result: if item['action'] == 'add': Budget.add(pid=pid, tid=item['tid'], data=item) elif item['action'] == 'update': budget_id = Budget.get_by_bid(pid=pid, bid=item['bid']) if budget_id: item['_id'] = budget_id Budget.edit(pid=pid, data=item) return jsonify({})
def members(pid, tid): ''' members ''' # pylint: disable=too-many-locals 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 request.method == 'GET': return render_template('./team_members.html', project=project, team=team, is_admin=is_admin) if request.method == 'POST': post_data = request.get_json() if post_data['casename'] == 'get': list_teams = [] if 'tid' in post_data and post_data['tid'] != tid: team = Team.get(pid=pid, tid=post_data['tid']) else: for lteam in Team.list_by_pid(pid=pid): list_teams.append({ '_id': lteam['tid'], 'name': lteam['name'] }) uids = [] uids.extend(team['chiefs']) uids.extend(team['members']) uids = list(set(uids)) users_info = User.get_info(uids=uids) result_members = [] for uid in uids: if uid in users_info: user = { '_id': uid, 'profile': { 'badge_name': users_info[uid]['profile']['badge_name'] }, 'oauth': { 'picture': users_info[uid]['oauth']['picture'] } } user['is_chief'] = False if uid in team['chiefs']: user['is_chief'] = True user['chat'] = {} mid = MattermostTools.find_possible_mid(uid=uid) if mid: user['chat'] = { 'mid': mid, 'name': MattermostTools.find_user_name(mid=mid) } result_members.append(user) result_members = sorted( result_members, key=lambda u: u['profile']['badge_name'].lower()) tags = [] if 'tag_members' in team and team['tag_members']: tags = team['tag_members'] members_tags = Team.get_members_tags(pid=team['pid'], tid=team['tid']) return jsonify({ 'members': result_members, 'teams': list_teams, 'tags': tags, 'members_tags': members_tags }) return jsonify({}), 404
def campaign_receiver(pid, tid, cid): team, project, _redirect = check_the_team_and_project_are_existed(pid=pid, tid=tid) if _redirect: return _redirect if g.user['account']['_id'] not in team['chiefs']: return redirect('/') campaign_data = SenderCampaign.get(cid=cid, pid=team['pid'], tid=team['tid']) if request.method == 'GET': return render_template('./sender_campaign_receiver.html', campaign=campaign_data, team=team) if request.method == 'POST': data = request.get_json() if data and 'casename' in data and data['casename'] == 'getinit': teams = [] for team in Team.list_by_pid(pid=team['pid']): teams.append({'tid': team['tid'], 'name': team['name']}) sender_receiver = SenderReceiver.get(pid=team['pid'], cid=cid) return jsonify({ 'teams': teams, 'pickteams': campaign_data['receiver']['teams'], 'filedata': sender_receiver, }) if data and 'casename' in data and data['casename'] == 'save': tids = [team['tid'] for team in Team.list_by_pid(pid=team['pid'])] _result = [] for tid in tids: if tid in data['pickteams']: _result.append(tid) return jsonify( SenderCampaign.save_receiver(cid=cid, teams=_result)['receiver']) if request.form['uploadtype'] == 'remove': SenderReceiver.remove(pid=team['pid'], cid=cid) return jsonify({ 'file': [], 'uploadtype': request.form['uploadtype'], }) if request.files and 'file' in request.files: csv_file = list( csv.DictReader( io.StringIO(request.files['file'].read().decode('utf8')))) if request.form['uploadtype'] == 'replace': SenderReceiver.replace(pid=team['pid'], cid=cid, datas=csv_file) elif request.form['uploadtype'] == 'update': SenderReceiver.update(pid=team['pid'], cid=cid, datas=csv_file) return jsonify({ 'file': csv_file, 'uploadtype': request.form['uploadtype'], })
def project_form_api(pid): ''' Project form API ''' # pylint: disable=too-many-return-statements,too-many-branches,too-many-statements 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 == 'POST': data = request.get_json() if 'case' not in data: return redirect( url_for('project.team_page', pid=pid, _scheme='https', _external=True)) if data['case'] == 'volunteer_certificate': fieldnames = ('uid', 'picture', 'value', 'name', 'roc_id', 'birthday', 'company') with io.StringIO() as str_io: csv_writer = csv.DictWriter(str_io, fieldnames=fieldnames) csv_writer.writeheader() for raw in Form.all_volunteer_certificate(pid): user_info = UsersDB().find_one({'_id': raw['uid']}) oauth = OAuthDB().find_one({'owner': raw['uid']}, {'data.picture': 1}) data = { 'uid': raw['uid'], 'picture': oauth['data']['picture'], 'value': raw['data']['value'], 'name': user_info['profile_real']['name'], 'roc_id': user_info['profile_real']['roc_id'], 'birthday': user_info['profile_real']['birthday'], 'company': user_info['profile_real']['company'], } csv_writer.writerow(data) result = [] for raw in csv.reader(io.StringIO(str_io.getvalue())): result.append(raw) return jsonify({'result': result}) elif data['case'] == 'traffic_fee': fieldnames = ('uid', 'picture', 'name', 'apply', 'fee', 'fromwhere', 'howto') with io.StringIO() as str_io: csv_writer = csv.DictWriter(str_io, fieldnames=fieldnames) csv_writer.writeheader() for raw in Form.all_traffic_fee(pid): user_info = User.get_info(uids=[ raw['uid'], ])[raw['uid']] data = { 'uid': raw['uid'], 'picture': user_info['oauth']['picture'], 'name': user_info['profile']['badge_name'], 'apply': raw['data']['apply'], 'fee': raw['data']['fee'], 'fromwhere': raw['data']['fromwhere'], 'howto': raw['data']['howto'], } csv_writer.writerow(data) result = [] for raw in csv.reader(io.StringIO(str_io.getvalue())): result.append(raw) return jsonify({'result': result}) elif data['case'] == 'accommodation': fieldnames = ('uid', 'picture', 'name', 'key', 'status') with io.StringIO() as str_io: csv_writer = csv.DictWriter(str_io, fieldnames=fieldnames) csv_writer.writeheader() for raw in Form.all_accommodation(pid): user_info = User.get_info(uids=[ raw['uid'], ])[raw['uid']] data = { 'uid': raw['uid'], 'picture': user_info['oauth']['picture'], 'name': user_info['profile']['badge_name'], 'key': raw['data']['key'], 'status': raw['data']['status'], } csv_writer.writerow(data) result = [] for raw in csv.reader(io.StringIO(str_io.getvalue())): result.append(raw) return jsonify({'result': result}) elif data['case'] == 'appreciation': fieldnames = ('uid', 'picture', 'name', 'available', 'key', 'value') with io.StringIO() as str_io: csv_writer = csv.DictWriter(str_io, fieldnames=fieldnames) csv_writer.writeheader() for raw in Form.all_appreciation(pid): if not raw['data']['available']: continue user_info = User.get_info(uids=[ raw['uid'], ])[raw['uid']] data = { 'uid': raw['uid'], 'picture': user_info['oauth']['picture'], 'name': user_info['profile']['badge_name'], 'available': raw['data']['available'], 'key': raw['data']['key'], 'value': raw['data']['value'], } csv_writer.writerow(data) result = [] for raw in csv.reader(io.StringIO(str_io.getvalue())): result.append(raw) return jsonify({'result': result}) elif data['case'] == 'clothes': 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_info = User.get_info(uids=list(all_users.keys())) fieldnames = ('uid', 'picture', 'name', '_has_data', 'tid', 'clothes', 'htg') with io.StringIO() as str_io: csv_writer = csv.DictWriter(str_io, fieldnames=fieldnames) csv_writer.writeheader() for raw in Form.all_clothes(pid): if raw['uid'] not in all_users: continue all_users[raw['uid']]['clothes'] = raw['data']['clothes'] if 'htg' in raw['data']: all_users[raw['uid']]['htg'] = raw['data']['htg'] for uid, value in all_users.items(): data = { 'uid': uid, 'picture': user_info[uid]['oauth']['picture'], 'name': user_info[uid]['profile']['badge_name'], '_has_data': bool(value.get('clothes', False)), 'tid': value['tid'], 'clothes': value.get('clothes'), 'htg': value.get('htg'), } csv_writer.writerow(data) result = [] for raw in csv.reader(io.StringIO(str_io.getvalue())): result.append(raw) return jsonify({'result': result}) elif data['case'] == 'parking_card': fieldnames = ('uid', 'picture', 'name', 'carno', 'dates') with io.StringIO() as str_io: csv_writer = csv.DictWriter(str_io, fieldnames=fieldnames) csv_writer.writeheader() for raw in Form.all_parking_card(pid): if not raw['data']['dates']: continue user_info = User.get_info(uids=[ raw['uid'], ])[raw['uid']] data = { 'uid': raw['uid'], 'picture': user_info['oauth']['picture'], 'name': user_info['profile']['badge_name'], 'carno': raw['data']['carno'], 'dates': ', '.join(raw['data']['dates']), } csv_writer.writerow(data) result = [] for raw in csv.reader(io.StringIO(str_io.getvalue())): result.append(raw) return jsonify({'result': result}) elif data['case'] == 'drink': 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_info = User.get_info(uids=list(all_users.keys())) fieldnames = ('uid', 'picture', 'name', '_has_data', 'tid', 'y18') with io.StringIO() as str_io: csv_writer = csv.DictWriter(str_io, fieldnames=fieldnames) csv_writer.writeheader() for raw in Form.all_drink(pid): if raw['uid'] not in all_users: continue all_users[raw['uid']]['y18'] = raw['data']['y18'] for uid, value in all_users.items(): data = { 'uid': uid, 'picture': user_info[uid]['oauth']['picture'], 'name': user_info[uid]['profile']['badge_name'], '_has_data': bool(value.get('y18')), 'tid': value['tid'], 'y18': value.get('y18'), } csv_writer.writerow(data) result = [] for raw in csv.reader(io.StringIO(str_io.getvalue())): result.append(raw) return jsonify({'result': result}) return jsonify({}), 404
def campaign_receiver(pid, tid, cid): ''' campaign receiver ''' # pylint: disable=too-many-branches,too-many-locals,too-many-return-statements 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('/') campaign_data = SenderCampaign.get(cid=cid, pid=team['pid'], tid=team['tid']) if request.method == 'GET': return render_template('./sender_campaign_receiver.html', campaign=campaign_data, team=team) if request.method == 'POST': data = {} if request.is_json: data = request.get_json() if data and 'casename' in data and data['casename'] == 'getinit': teams = [] for _team in Team.list_by_pid(pid=team['pid']): teams.append({'tid': _team['tid'], 'name': _team['name']}) team_w_tags = [] if 'tag_members' in team: team_w_tags = team['tag_members'] sender_receiver = SenderReceiver.get(pid=team['pid'], cid=cid) picktags = [] if 'team_w_tags' in campaign_data['receiver'] and \ team['tid'] in campaign_data['receiver']['team_w_tags']: picktags = campaign_data['receiver']['team_w_tags'][ team['tid']] return jsonify({ 'teams': teams, 'team_w_tags': team_w_tags, 'pickteams': campaign_data['receiver']['teams'], 'picktags': picktags, 'is_all_users': campaign_data['receiver']['all_users'], 'all_users_count': User.count(), 'filedata': sender_receiver, }) if data and 'casename' in data and data['casename'] == 'save': tids = [team['tid'] for team in Team.list_by_pid(pid=team['pid'])] _result = [] for tid_info in tids: if tid_info in data['pickteams']: _result.append(tid_info) _team_w_tags = [] if 'tag_members' in team: for tag in team['tag_members']: if tag['id'] in data['picktags']: _team_w_tags.append(tag['id']) return jsonify( SenderCampaign.save_receiver( cid=cid, teams=_result, team_w_tags={team['tid']: _team_w_tags}, all_users=bool(data['is_all_users']))['receiver']) if request.form['uploadtype'] == 'remove': SenderReceiver.remove(pid=team['pid'], cid=cid) return jsonify({ 'file': [], 'uploadtype': request.form['uploadtype'], }) if request.files and 'file' in request.files: csv_file = list( csv.DictReader( io.StringIO(request.files['file'].read().decode('utf8')))) if request.form['uploadtype'] == 'replace': SenderReceiver.replace(pid=team['pid'], cid=cid, datas=csv_file) elif request.form['uploadtype'] == 'update': SenderReceiver.update(pid=team['pid'], cid=cid, datas=csv_file) return jsonify({ 'file': csv_file, 'uploadtype': request.form['uploadtype'], }) return jsonify({}), 404