Пример #1
0
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
Пример #2
0
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})
Пример #3
0
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
Пример #4
0
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)
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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))
Пример #9
0
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,
    )
Пример #10
0
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())
Пример #11
0
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({})
Пример #12
0
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
Пример #13
0
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({})
Пример #14
0
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
Пример #15
0
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'],
            })
Пример #16
0
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
Пример #17
0
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