Beispiel #1
0
def storage():
    dates_info = {}
    start_str = request.args.get('start_date',
                                 datetime.now().strftime(DATE_FORMAT))
    start = datetime.strptime(start_str, DATE_FORMAT).date()
    m_dict = defaultdict(list)
    dates_list = []
    for x in range(0, 30):
        current = start + timedelta(days=x)
        m_dict[current.month].append(current)
        dates_list.append(current)
    dates_info['dates'] = dates_list
    dates_info['months'] = [(m, len(d_list)) for m, d_list in m_dict.items()]
    medium_id = int(request.args.get('selected_medium', 0))
    select_medium = [(m.id, m.name) for m in Medium.all()]
    select_medium.insert(0, (0, u'全部媒体'))
    positions_info = AdPosition.all_positions_info_by_date()
    if medium_id:
        medium = Medium.get(medium_id)
        positions_info = medium.positions_info_by_date()
    return tpl(
        'storage.html',
        dates_info=dates_info,
        medium=select_medium,
        medium_id=medium_id,
        positions_info=positions_info,
        start_date=start_str,
        per_start_date=(start - timedelta(days=30)).strftime(DATE_FORMAT),
        next_start_date=(start + timedelta(days=30)).strftime(DATE_FORMAT))
Beispiel #2
0
def index():
    if not g.user.is_super_admin():
        abort(403)
    form = ClientOrderForm(request.form)
    mediums = [(m.id, m.name) for m in Medium.all()]
    if request.method == 'POST' and form.validate():
        if ClientOrder.query.filter_by(contract=request.values.get('contract')).count() > 0:
            flash(u'合同号已存在', 'danger')
            return redirect(url_for('util_insert_orders.index'))
        order = ClientOrder.add(agent=Agent.get(form.agent.data),
                                client=Client.get(form.client.data),
                                campaign=form.campaign.data,
                                money=int("%.0f" % (form.money.data or 0)),
                                client_start=form.client_start.data,
                                client_end=form.client_end.data,
                                reminde_date=form.reminde_date.data,
                                direct_sales=User.gets(form.direct_sales.data),
                                agent_sales=User.gets(form.agent_sales.data),
                                contract_type=form.contract_type.data,
                                resource_type=form.resource_type.data,
                                sale_type=form.sale_type.data,
                                contract=request.values.get('contract', ''),
                                creator=g.user,
                                contract_status=2,
                                create_time=datetime.now())
        order.add_comment(g.user,
                          u"导入了客户订单:%s - %s - %s" % (
                              order.agent.name,
                              order.client.name,
                              order.campaign
                          ))
        medium_ids = request.values.getlist('medium')
        medium_moneys = request.values.getlist('medium_money')
        medium_moneys2 = request.values.getlist('medium_money2')
        medium_contracts = request.values.getlist('medium_contract')
        if medium_ids and medium_moneys and len(medium_ids) == len(medium_moneys):
            for x in range(len(medium_ids)):
                medium = Medium.get(medium_ids[x])
                mo = Order.add(campaign=order.campaign,
                               medium=medium,
                               sale_money=int("%.0f" % (form.money.data or 0)),
                               medium_money=int(medium_moneys[x] or 0),
                               medium_money2=int(medium_moneys2[x] or 0),
                               medium_contract=medium_contracts[x],
                               medium_start=order.client_start,
                               medium_end=order.client_end,
                               creator=g.user)
                order.medium_orders = order.medium_orders + [mo]
                order.add_comment(g.user, u"导入了媒体订单: %s %s元" %
                                  (medium.name, mo.sale_money))
            order.save()
        flash(u'导入客户订单成功!', 'success')
        insert_executive_report(order, '')
        return redirect(order.info_path())
    else:
        form.client_start.data = datetime.now().date()
        form.client_end.data = datetime.now().date()
        form.reminde_date.data = datetime.now().date()
    return tpl('insert_order.html', form=form, mediums=mediums)
Beispiel #3
0
 def validate(self):
     if Form.validate(self):
         if not self.estimate_num.hidden:
             if self.ad_type.data == AD_TYPE_NORMAL:
                 if self.max_order_num.data > self.estimate_num.data:
                     self.max_order_num.errors.append(
                         u"最大预订不能大于预估量(如果新添加了广告单元, 请先保存, 然后根据计算所得调整)")
                     return False
             elif self.ad_type.data == AD_TYPE_CPD:
                 if self.cpd_num.data > self.estimate_num.data:
                     self.cpd_num.errors.append(u"CPD量不能大于预估量")
                     return False
         units = AdUnit.gets(self.units.data)
         medium = Medium.get(self.medium.data)
         if not units:
             self.units.errors.append(u"所含广告单元不能为空")
             return False
         for u in units:
             if u.medium != medium:
                 self.units.errors.append(
                     u"%s不属于%s" % (u.display_name, medium.name))
                 return False
         return True
     else:
         return False
Beispiel #4
0
 def __init__(self, *args, **kwargs):
     super(ClientMediumOrderForm, self).__init__(*args, **kwargs)
     self.agent.choices = [(m.id, m.name) for m in Agent.all()]
     self.client.choices = [(c.id, c.name) for c in Client.all()]
     self.direct_sales.choices = [(m.id, m.name) for m in User.sales()]
     self.agent_sales.choices = [(m.id, m.name) for m in User.sales()]
     self.assistant_sales.choices = [(m.id, m.name) for m in User.sales()]
     operaters = User.gets_by_team_type(
         TEAM_TYPE_OPERATER) + User.gets_by_team_type(
             TEAM_TYPE_OPERATER_LEADER)
     self.operaters.choices = [(m.id, m.name) for m in operaters]
     self.operaters.hidden = True
     self.designers.choices = [
         (m.id, m.name) for m in User.gets_by_team_type(TEAM_TYPE_DESIGNER)
     ]
     self.designers.hidden = True
     self.planers.choices = [
         (m.id, m.name) for m in User.gets_by_team_type(TEAM_TYPE_PLANNER)
     ]
     self.planers.hidden = True
     self.sale_CPM.hidden = True
     self.medium_CPM.hidden = True
     self.contract_type.choices = CONTRACT_TYPE_CN.items()
     self.resource_type.choices = RESOURCE_TYPE_CN.items()
     self.sale_type.choices = SALE_TYPE_CN.items()
     self.medium_group.choices = [(m.id, m.name) for m in MediumGroup.all()]
     self.medium.choices = [(m.id, m.name) for m in Medium.all()]
Beispiel #5
0
def mediums():
    medium_rebate = MediumRebate.all()
    medium_rebate_data = {}
    for k in medium_rebate:
        if str(k.medium.id) + '_' + str(k.year.year) not in medium_rebate_data:
            medium_rebate_data[str(k.medium.id) + '_' + str(k.year.year)] = str(k.rebate) + '%'
    medium_data = []
    for medium in Medium.all():
        dict_medium = {}
        dict_medium['files_update_time'] = medium.files_update_time
        dict_medium['abbreviation'] = medium.abbreviation
        dict_medium['level_cn'] = medium.level_cn
        dict_medium['id'] = medium.id
        dict_medium['name'] = medium.name
        dict_medium['level'] = medium.level or 100
        if str(medium.id) + '_2014' in medium_rebate_data:
            dict_medium['rebate_2014'] = medium_rebate_data[str(medium.id) + '_2014']
        else:
            dict_medium['rebate_2014'] = u'无'
        if str(medium.id) + '_2015' in medium_rebate_data:
            dict_medium['rebate_2015'] = medium_rebate_data[str(medium.id) + '_2015']
        else:
            dict_medium['rebate_2015'] = u'无'
        if str(medium.id) + '_2016' in medium_rebate_data:
            dict_medium['rebate_2016'] = medium_rebate_data[str(medium.id) + '_2016']
        else:
            dict_medium['rebate_2016'] = u'无'
        medium_data.append(dict_medium)
    medium_data = sorted(medium_data, key=operator.itemgetter('level'), reverse=False)
    if request.values.get('action') == 'excel':
        return write_medium_excel(mediums=medium_data)
    return tpl('/client/medium/index.html', mediums=medium_data)
Beispiel #6
0
 def validate(self):
     if Form.validate(self):
         if not self.estimate_num.hidden:
             if self.ad_type.data == AD_TYPE_NORMAL:
                 if self.max_order_num.data > self.estimate_num.data:
                     self.max_order_num.errors.append(
                         u"最大预订不能大于预估量(如果新添加了广告单元, 请先保存, 然后根据计算所得调整)")
                     return False
             elif self.ad_type.data == AD_TYPE_CPD:
                 if self.cpd_num.data > self.estimate_num.data:
                     self.cpd_num.errors.append(u"CPD量不能大于预估量")
                     return False
         units = AdUnit.gets(self.units.data)
         medium = Medium.get(self.medium.data)
         if not units:
             self.units.errors.append(u"所含广告单元不能为空")
             return False
         for u in units:
             if u.medium != medium:
                 self.units.errors.append(u"%s不属于%s" %
                                          (u.display_name, medium.name))
                 return False
         return True
     else:
         return False
Beispiel #7
0
def new_position():
    form = PositionForm(request.form)
    form.estimate_num.hidden = True
    form.cpd_num.hidden = True
    form.max_order_num.hidden = True
    # the medium and size field will be set value at the same time: any data post to server side
    if form.medium.data and form.size.data:
        form_size = AdSize.get(form.size.data)
        form.units.choices = [(x.id, x.display_name)
                              for x in AdUnit.query.filter_by(
                                  medium_id=form.medium.data, size=form_size)]
    if request.method == 'POST' and form.validate():
        ad_position = AdPosition.add(name=form.name.data,
                                     description=form.description.data,
                                     size=AdSize.get(form.size.data),
                                     standard=form.standard.data,
                                     status=form.status.data,
                                     medium=Medium.get(form.medium.data),
                                     level=form.level.data,
                                     ad_type=form.ad_type.data,
                                     launch_strategy=form.launch_strategy.data,
                                     price=form.price.data)
        ad_position.units = AdUnit.gets(form.units.data)
        ad_position.cpd_num = sum([x.estimate_num for x in ad_position.units])
        ad_position.max_order_num = sum(
            [x.estimate_num for x in ad_position.units])
        ad_position.save()
        flash(u'新建展示位置成功!', 'success')
        return redirect(
            url_for("medium.position_detail", position_id=ad_position.id))
    return tpl('position.html', form=form, title=u"新建展示位置")
Beispiel #8
0
def index():
    page = int(request.values.get('p', 1))
    medium_id = int(request.values.get('medium_id', 0))
    product_id = int(request.values.get('product_id', 0))
    type = int(request.values.get('type', 0))
    number = request.values.get('number', '')
    filters = {}
    if medium_id:
        filters['medium_id'] = medium_id
    if product_id:
        filters['product'] = product_id
    if type:
        filters['type'] = type
    if filters:
        resources = MediumResource.query.filter_by(**filters)
    else:
        resources = MediumResource.all()
    if number:
        resources = resources.filter(
            MediumResource.number.startswith(number.strip()))
    paginator = Paginator(list(resources), 50)
    try:
        resources = paginator.page(page)
    except:
        resources = paginator.page(paginator.num_pages)
    for k in resources.object_list:
        if k.type == 1:
            k.product_obj = MediumProductPC.get(k.product)
        elif k.type == 2:
            k.product_obj = MediumProductApp.get(k.product)
        elif k.type == 3:
            k.product_obj = MediumProductDown.get(k.product)
    return tpl('/mediums/resource/index.html', resources=resources, mediums=Medium.all(),
               type=type, product_id=product_id, number=number, medium_id=medium_id,
               params="&medium_id=%s&number=%s&type=%s&product_id=%s" % (medium_id, number, type, product_id))
Beispiel #9
0
def index(type):
    page = int(request.values.get('p', 1))
    industry = request.values.get('industry', '')
    medium = int(request.values.get('medium', 0))
    info = request.values.get('info', '')
    cases = list(Case.query.filter_by(type=type))
    if medium:
        cases = [case for case in cases if medium in case.mediums_id]
    if info:
        cases = [case for case in cases if info in case.info]
    if industry:
        cases = [case for case in cases if industry == case.industry]
    paginator = Paginator(cases, 50)
    try:
        cases = paginator.page(page)
    except:
        cases = paginator.page(paginator.num_pages)
    return tpl('/mediums/planning/index.html',
               title=CASE_TYPE_CN[int(type)],
               mediums=Medium.all(),
               medium=medium,
               cases=cases,
               type=type,
               info=info,
               params="&info=%s&medium=%s&industry=%s" %
               (info, str(medium), industry),
               INDUSTRY=INDUSTRY,
               page=page,
               tags=Tag.all(),
               industry=industry)
Beispiel #10
0
def outlet_from_row(row, unused_index=None):
    medium_dict = {
        '__SEARCH_BY__': 'scienceFeedbackIdentifier',
        'name': row['Name'],
        'scienceFeedbackIdentifier': row['airtableId']
    }

    return Medium.create_or_modify(medium_dict)
Beispiel #11
0
def update(type, cid):
    if not (g.user.is_planner() or g.user.is_operater()):
        abort(403)
    case = Case.get(cid)
    mediums_form = MediumsForm(request.form)
    mediums_form.mediums.data = [u.id for u in case.mediums]
    if request.method == 'POST':
        name = request.values.get('name', '')
        url = request.values.get('url', '')
        brand = request.values.get('brand', '')
        industry = request.values.get('industry', '')
        desc = request.values.get('desc', '')
        tags = request.values.get('tags', '').split(',')
        is_win = int(request.values.get('is_win', 0))
        pwd = request.values.get('pwd', '')
        case.name = name
        case.url = url
        case.medium = Medium.get(1)
        case.mediums = Medium.gets(request.values.getlist('mediums'))
        case.brand = brand
        case.industry = industry
        case.desc = desc
        case.is_win = is_win
        case.creator = g.user
        case.create_time = datetime.datetime.now()
        case.pwd = pwd
        case.save()
        TagCase.query.filter_by(case=case).delete()
        for k in tags:
            if k:
                tag = Tag.query.filter_by(name=k)
                if tag.count() > 0:
                    tag = tag.first()
                else:
                    tag = Tag.add(name=k)
                    tag = Tag.get(tag.id)
                TagCase.add(tag=tag, case=case)
        flash(u'修改成功', 'success')
        return redirect(url_for('mediums_planning.update', type=type, cid=cid))
    return tpl('/mediums/planning/update.html',
               title=CASE_TYPE_CN[int(type)],
               mediums=Medium.all(),
               type=type,
               case=case,
               mediums_form=mediums_form,
               INDUSTRY=INDUSTRY)
Beispiel #12
0
def position_detail(position_id):
    position = AdPosition.get(position_id)
    if not position:
        abort(404)
    form = PositionForm(request.form)
    form.units.choices = [(x.id, x.display_name)
                          for x in position.suitable_units]

    if request.method == 'POST':
        if form.validate():
            position.name = form.name.data
            position.description = form.description.data
            position.size = AdSize.get(form.size.data)
            position.standard = form.standard.data
            position.status = form.status.data
            position.units = AdUnit.gets(form.units.data)
            position.medium = Medium.get(form.medium.data)
            position.level = form.level.data
            position.ad_type = form.ad_type.data
            position.cpd_num = form.cpd_num.data
            position.max_order_num = form.max_order_num.data
            position.price = form.price.data
            position.launch_strategy = form.launch_strategy.data
            position.save()
            flash(u'保存成功!', 'success')
        else:
            flash(u'保存失败!', 'danger')
        return tpl('position.html',
                   form=form,
                   title=position.display_name,
                   position=position)
    else:
        form.name.data = position.name
        form.description.data = position.description
        form.size.data = position.size.id
        form.standard.data = position.standard
        form.status.data = position.status
        form.units.data = [x.id for x in position.units]
        form.medium.data = position.medium.id
        form.level.data = position.level
        form.ad_type.data = position.ad_type
        form.cpd_num.data = position.cpd_num or 0
        form.max_order_num.data = position.max_order_num
        form.price.data = position.price
        form.estimate_num.data = position.estimate_num
        form.launch_strategy.data = position.launch_strategy
        form.estimate_num.readonly = True
        sortby = request.args.get('sortby', '')
        orderby = request.args.get('orderby', '')
        reverse = orderby != 'asc'
        items = [o for o in position.order_items]
        schedules = AdItem.items_sort_scheduels(items, sortby, reverse)
    return tpl('position.html',
               form=form,
               title=position.display_name,
               position=position,
               schedules=schedules,
               orderby=orderby)
Beispiel #13
0
def create(type):
    if not (g.user.is_planner() or g.user.is_operater()):
        abort(403)
    mediums_form = MediumsForm(request.form)
    if request.method == 'POST':
        name = request.values.get('name', '')
        url = request.values.get('url', '')
        brand = request.values.get('brand', '')
        industry = request.values.get('industry', '')
        desc = request.values.get('desc', '')
        pwd = request.values.get('pwd', '')
        tags = request.values.get('tags', '').split(',')
        is_win = int(request.values.get('is_win', 0))
        if Case.query.filter_by(name=name, type=type).count() > 0:
            flash(u'名称已存在', 'danger')
            return redirect(url_for('mediums_planning.create', type=type))
        case = Case.add(name=name,
                        url=url,
                        medium=Medium.get(1),
                        mediums=Medium.gets(request.values.getlist('mediums')),
                        brand=brand,
                        industry=industry,
                        desc=desc,
                        creator=g.user,
                        type=type,
                        is_win=is_win,
                        pwd=pwd)
        case = Case.get(case.id)
        for k in tags:
            if k:
                tag = Tag.query.filter_by(name=k)
                if tag.count() > 0:
                    tag = tag.first()
                else:
                    tag = Tag.add(name=k)
                    tag = Tag.get(tag.id)
                TagCase.add(tag=tag, case=case)
        flash(u'添加成功', 'success')
        return redirect(url_for('mediums_planning.index', type=type))
    return tpl('/mediums/planning/create.html',
               title=CASE_TYPE_CN[int(type)],
               mediums=Medium.all(),
               type=type,
               mediums_form=mediums_form,
               INDUSTRY=INDUSTRY)
Beispiel #14
0
    def __init__(self, *args, **kwargs):
        super(UnitForm, self).__init__(*args, **kwargs)
        self.target.choices = TARGET_CN.items()
        self.status.choices = STATUS_CN.items()
        self.size.choices = [(x.id, x.name) for x in AdSize.all()]
        self.positions.choices = [(x.id, x.display_name)
                                  for x in AdPosition.all()]

        self.medium.choices = [(x.id, x.name) for x in Medium.all()]
Beispiel #15
0
    def __init__(self, *args, **kwargs):
        super(UnitForm, self).__init__(*args, **kwargs)
        self.target.choices = TARGET_CN.items()
        self.status.choices = STATUS_CN.items()
        self.size.choices = [(x.id, x.name) for x in AdSize.all()]
        self.positions.choices = [(x.id, x.display_name)
                                  for x in AdPosition.all()]

        self.medium.choices = [(x.id, x.name) for x in Medium.all()]
Beispiel #16
0
def info(mid):
    medium = Medium.get(mid)
    reminder_emails = [(u.name, u.email) for u in User.all_active()]
    return tpl('/mediums/files/info.html', medium=medium,
               ATTACHMENT_TYPE_MEDIUM_INTRODUCE=ATTACHMENT_TYPE_MEDIUM_INTRODUCE,
               ATTACHMENT_TYPE_MEDIUM_PRODUCT=ATTACHMENT_TYPE_MEDIUM_PRODUCT,
               ATTACHMENT_TYPE_MEDIUM_DATA=ATTACHMENT_TYPE_MEDIUM_DATA,
               ATTACHMENT_TYPE_MEDIUM_NEW_PRODUCT=ATTACHMENT_TYPE_MEDIUM_NEW_PRODUCT,
               reminder_emails=reminder_emails)
Beispiel #17
0
def index():
    info = request.values.get('info', '')
    mediums = [{'files_update_time': k.files_update_time,
                'level_cn': k.medium_group.level_cn,
                'id': k.id, 'name': k.medium_group.name + "-" + k.name, 'level': k.medium_group.level or 100
                }for k in Medium.all()]
    if info:
        mediums = [m for m in mediums if info in m['name']]
    mediums = sorted(mediums, key=operator.itemgetter('level'), reverse=False)
    return tpl('/mediums/files/index.html', mediums=mediums, info=info)
Beispiel #18
0
def update(type, cid):
    if not (g.user.is_planner() or g.user.is_operater()):
        abort(403)
    case = Case.get(cid)
    mediums_form = MediumsForm(request.form)
    mediums_form.mediums.data = [u.id for u in case.mediums]
    if request.method == 'POST':
        name = request.values.get('name', '')
        url = request.values.get('url', '')
        brand = request.values.get('brand', '')
        industry = request.values.get('industry', '')
        desc = request.values.get('desc', '')
        tags = request.values.get('tags', '').split(',')
        is_win = int(request.values.get('is_win', 0))
        pwd = request.values.get('pwd', '')
        case.name = name
        case.url = url
        case.medium = Medium.get(1)
        case.mediums = Medium.gets(request.values.getlist('mediums'))
        case.brand = brand
        case.industry = industry
        case.desc = desc
        case.is_win = is_win
        case.creator = g.user
        case.create_time = datetime.datetime.now()
        case.pwd = pwd
        case.save()
        TagCase.query.filter_by(case=case).delete()
        for k in tags:
            if k:
                tag = Tag.query.filter_by(name=k)
                if tag.count() > 0:
                    tag = tag.first()
                else:
                    tag = Tag.add(name=k)
                    tag = Tag.get(tag.id)
                TagCase.add(tag=tag, case=case)
        flash(u'修改成功', 'success')
        return redirect(url_for('mediums_planning.update', type=type, cid=cid))
    return tpl('/mediums/planning/update.html', title=CASE_TYPE_CN[int(type)],
               mediums=Medium.all(), type=type, case=case, mediums_form=mediums_form,
               INDUSTRY=INDUSTRY)
def new_invoice(
        order_id,
        redirect_epoint='saler_client_order_medium_rebate_invoice.index'):
    order = ClientOrder.get(order_id)
    if not order:
        abort(404)
    form = MediumRebateInvoiceForm(request.form)
    form.client_order.choices = [(order.id, order.client.name)]
    form.medium.choices = [(medium.id, medium.name)
                           for medium in order.mediums]
    if request.method == 'POST' and form.validate():
        medium = Medium.get(form.medium.data)
        # if float(form.money.data) > float(order.get_medium_rebate_money(medium) -
        #                                   order.get_medium_rebate_invoice_apply_sum(medium) -
        #                                   order.get_medium_rebate_invoice_pass_sum(medium)):
        #     flash(u"新建发票失败,您申请的发票超过了媒体:%s 返点金额: %s" % (medium.name, order.get_medium_rebate_money(medium)), 'danger')
        #     return redirect(url_for(redirect_epoint, order_id=order_id))
        invoice = MediumRebateInvoice.add(client_order=order,
                                          medium=Medium.get(form.medium.data),
                                          company=form.company.data,
                                          tax_id=form.tax_id.data,
                                          address=form.address.data,
                                          phone=form.phone.data,
                                          bank_id=form.bank_id.data,
                                          bank=form.bank.data,
                                          detail=form.detail.data,
                                          money=form.money.data,
                                          invoice_type=form.invoice_type.data,
                                          invoice_status=INVOICE_STATUS_NORMAL,
                                          creator=g.user,
                                          invoice_num=" ",
                                          back_time=form.back_time.data)
        invoice.save()
        order.add_comment(g.user,
                          u"添加发票申请信息:%s" %
                          (u'发票内容: %s; 发票金额: %s元' %
                           (invoice.detail, str(invoice.money))),
                          msg_channel=6)
    else:
        for k in form.errors:
            flash(u"新建发票失败,%s" % (form.errors[k][0]), 'danger')
    return redirect(url_for(redirect_epoint, order_id=order_id))
Beispiel #20
0
def unit_detail(unit_id):
    unit = AdUnit.get(unit_id)
    if not unit:
        abort(404)
    form = UnitForm(request.form)

    if request.method == 'POST':
        if form.validate():
            unit.name = form.name.data
            unit.description = form.description.data
            unit.size = AdSize.get(form.size.data)
            unit.margin = form.margin.data
            unit.target = form.target.data
            unit.status = form.status.data
            unit.positions = AdPosition.gets(form.positions.data)
            unit.medium = Medium.get(form.medium.data)
            unit.estimate_num = form.estimate_num.data
            unit.save()
            flash(u'保存成功!', 'success')

        if form.medium.data:
            form.positions.choices = [
                (x.id, x.display_name)
                for x in AdPosition.query.filter_by(medium_id=form.medium.data)
            ]
            return tpl('unit.html',
                       form=form,
                       title=unit.display_name,
                       unit=unit)
    else:
        form.name.data = unit.name
        form.description.data = unit.description
        form.size.data = unit.size.id
        form.margin.data = unit.margin
        form.target.data = unit.target
        form.status.data = unit.status
        form.positions.data = [x.id for x in unit.positions]
        form.positions.choices = [
            (x.id, x.display_name)
            for x in AdPosition.query.filter_by(medium_id=unit.medium.id)
        ]
        form.medium.data = unit.medium.id
        form.estimate_num.data = unit.estimate_num
        sortby = request.args.get('sortby', '')
        orderby = request.args.get('orderby', '')
        reverse = orderby != 'asc'
        items = [o for o in unit.order_items]
        schedules = AdItem.items_sort_scheduels(items, sortby, reverse)
    return tpl('unit.html',
               form=form,
               title=unit.display_name,
               unit=unit,
               schedules=schedules,
               orderby=orderby)
Beispiel #21
0
 def __init__(self, *args, **kwargs):
     super(PositionForm, self).__init__(*args, **kwargs)
     self.status.choices = STATUS_CN.items()
     self.size.choices = [(x.id, x.name) for x in AdSize.all()]
     self.medium.choices = [(x.id, x.name) for x in Medium.all()]
     self.level.choices = POSITION_LEVEL_CN.items()
     self.ad_type.choices = AD_TYPE_CN.items()
     self.units.choices = [(x.id, x.display_name) for x in AdUnit.all()]
     self.estimate_num.readonly = True
     self.estimate_num.hidden = False
     self.launch_strategy.choices = LAUNCH_STRATEGY.items()
Beispiel #22
0
 def __init__(self, *args, **kwargs):
     super(PositionForm, self).__init__(*args, **kwargs)
     self.status.choices = STATUS_CN.items()
     self.size.choices = [(x.id, x.name) for x in AdSize.all()]
     self.medium.choices = [(x.id, x.name) for x in Medium.all()]
     self.level.choices = POSITION_LEVEL_CN.items()
     self.ad_type.choices = AD_TYPE_CN.items()
     self.units.choices = [(x.id, x.display_name) for x in AdUnit.all()]
     self.estimate_num.readonly = True
     self.estimate_num.hidden = False
     self.launch_strategy.choices = LAUNCH_STRATEGY.items()
Beispiel #23
0
 def validate(self):
     if Form.validate(self):
         positions = AdPosition.gets(self.positions.data)
         medium = Medium.get(self.medium.data)
         for p in positions:
             if p.medium != medium:
                 self.positions.errors.append(
                     u"%s不属于%s" % (p.display_name, medium.name))
                 return False
         return True
     else:
         return False
Beispiel #24
0
def files_upload(mid):
    medium = Medium.get(mid)
    type = int(request.values.get('type', 5))
    try:
        request.files['file'].filename.encode('gb2312')
    except:
        flash(u'文件名中包含非正常字符,请使用标准字符', 'danger')
        return redirect(url_for('mediums_files.info', mid=mid))
    filename = all_files_set.save(request.files['file'])
    medium.add_medium_files(g.user, filename, type)
    flash(ATTACHMENT_TYPE[type] + u' 上传成功', 'success')
    return redirect(url_for('mediums_files.info', mid=mid))
Beispiel #25
0
 def validate(self):
     if Form.validate(self):
         positions = AdPosition.gets(self.positions.data)
         medium = Medium.get(self.medium.data)
         for p in positions:
             if p.medium != medium:
                 self.positions.errors.append(u"%s不属于%s" %
                                              (p.display_name, medium.name))
                 return False
         return True
     else:
         return False
Beispiel #26
0
def index_json():
    if not (g.user.is_super_leader() or g.user.is_aduit() or g.user.is_finance()):
        abort(403)
    now_date = datetime.datetime.now()
    location = int(request.values.get('location', 0))
    start_year = str(request.values.get('start_year', now_date.year))
    start_month = str(request.values.get('start_month', now_date.month))
    end_year = str(request.values.get('end_year', now_date.year - 1))
    end_month = str(request.values.get('end_month', now_date.month))

    start_date_month = datetime.datetime.strptime(
        start_year + '-' + start_month, '%Y-%m')
    end_date_month = datetime.datetime.strptime(
        end_year + '-' + end_month, '%Y-%m')
    medium_orders = MediumOrderExecutiveReport.query.filter(
        MediumOrderExecutiveReport.month_day >= start_date_month,
        MediumOrderExecutiveReport.month_day <= end_date_month)

    douban_orders = DoubanOrderExecutiveReport.query.filter(
        DoubanOrderExecutiveReport.month_day >= start_date_month,
        DoubanOrderExecutiveReport.month_day <= end_date_month)

    medium_date = [_format_order(k) for k in medium_orders if k.status == 1]
    douban_date = [_format_order(k, 'douban') for k in douban_orders]

    medium_info_params = {}
    medium_info_params[u'豆瓣'] = 0
    for k in Medium.all():
        medium_info_params[k.name] = 0

    for k in medium_date + douban_date:
        if k['medium_name'] in medium_info_params:
            medium_info_params[k['medium_name']] += _get_money_by_location(k, location)
    medium_info_params = sorted(
        medium_info_params.iteritems(), key=lambda x: x[1])
    medium_info_params.reverse()
    data = [{
        "name": u"媒体执行额占比",
        "data": []
    }]
    sum_saler_money = sum([v for k, v in medium_info_params])
    for k, v in medium_info_params:
        if v > 0:
            if sum_saler_money == 0:
                percent = u'0.00%'
            else:
                percent = v / sum_saler_money * 100
            data[0]['data'].append({'name': k,
                                    'y': v,
                                    'percent': percent})
    return jsonify({'data': data, 'title': u'致趣媒体执行额分析',
                    'total': float(sum_saler_money)})
Beispiel #27
0
def medium_detail(medium_id):
    if not (g.user.is_media_leader() or g.user.is_super_leader() or g.user.is_media() or g.user.is_finance()):
        abort(403)
    medium = Medium.get(medium_id)
    if not medium:
        abort(404)
    if request.method == 'POST':
        medium.name = request.values.get('name', '')
        medium.medium_group_id = int(request.values.get('medium_group_id', 100))
        medium.save()
        flash(u'保存成功!', 'success')
    return tpl('/client/medium/info.html', title=u"媒体-" + medium.name, status='update',
               medium=medium, medium_groups=MediumGroup.all())
def new_invoice(order_id, redirect_epoint='finance_client_order_medium_rebate_invoice.info'):
    order = ClientOrder.get(order_id)
    if not order:
        abort(404)
    form = MediumRebateInvoiceForm(request.form)
    form.client_order.choices = [(order.id, order.client.name)]
    form.medium.choices = [(medium.id, medium.name)
                           for medium in order.mediums]
    if request.method == 'POST' and form.validate():
        medium = Medium.get(form.medium.data)
        # if float(form.money.data) > float(order.get_medium_rebate_money(medium) -
        #                                   order.get_medium_rebate_invoice_apply_sum(medium) -
        #                                   order.get_medium_rebate_invoice_pass_sum(medium)):
        #     flash(u"新建发票失败,您申请的发票超过了媒体:%s 返点金额: %s" % (medium.name, order.get_medium_rebate_money(medium)), 'danger')
        #     return redirect(url_for(redirect_epoint, order_id=order_id))
        invoice = MediumRebateInvoice.add(client_order=order,
                                          medium=Medium.get(form.medium.data),
                                          company=form.company.data,
                                          tax_id=form.tax_id.data,
                                          address=form.address.data,
                                          phone=form.phone.data,
                                          bank_id=form.bank_id.data,
                                          bank=form.bank.data,
                                          detail=form.detail.data,
                                          money=form.money.data,
                                          invoice_type=form.invoice_type.data,
                                          invoice_status=INVOICE_STATUS_PASS,
                                          creator=g.user,
                                          invoice_num=form.invoice_num.data,
                                          create_time=request.values.get(
                                              'create_time', datetime.datetime.now().strftime('%Y-%m-%d')),
                                          back_time=form.back_time.data)
        invoice.save()
        order.add_comment(g.user, u"添加发票申请信息:%s" % (
            u'发票内容: %s; 发票金额: %s元' % (invoice.detail, str(invoice.money))), msg_channel=6)
    else:
        for k in form.errors:
            flash(u"新建发票失败,%s" % (form.errors[k][0]), 'danger')
    return redirect(url_for(redirect_epoint, order_id=order_id))
Beispiel #29
0
def storage():
    dates_info = {}
    start_str = request.args.get('start_date', datetime.now().strftime(DATE_FORMAT))
    start = datetime.strptime(start_str, DATE_FORMAT).date()
    m_dict = defaultdict(list)
    dates_list = []
    for x in range(0, 30):
        current = start + timedelta(days=x)
        m_dict[current.month].append(current)
        dates_list.append(current)
    dates_info['dates'] = dates_list
    dates_info['months'] = [(m, len(d_list)) for m, d_list in m_dict.items()]
    medium_id = int(request.args.get('selected_medium', 0))
    select_medium = [(m.id, m.name) for m in Medium.all()]
    select_medium.insert(0, (0, u'全部媒体'))
    positions_info = AdPosition.all_positions_info_by_date()
    if medium_id:
        medium = Medium.get(medium_id)
        positions_info = medium.positions_info_by_date()
    return tpl('storage.html', dates_info=dates_info, medium=select_medium,
               medium_id=medium_id, positions_info=positions_info, start_date=start_str,
               per_start_date=(start - timedelta(days=30)).strftime(DATE_FORMAT),
               next_start_date=(start + timedelta(days=30)).strftime(DATE_FORMAT))
Beispiel #30
0
 def __init__(self, *args, **kwargs):
     super(MediumOrderForm, self).__init__(*args, **kwargs)
     self.medium.choices = [(m.id, m.name) for m in Medium.all()]
     operaters = User.gets_by_team_type(
         TEAM_TYPE_OPERATER) + User.gets_by_team_type(
             TEAM_TYPE_OPERATER_LEADER)
     self.operaters.choices = [(m.id, m.name) for m in operaters]
     self.designers.choices = [
         (m.id, m.name) for m in User.gets_by_team_type(TEAM_TYPE_DESIGNER)
     ]
     self.planers.choices = [
         (m.id, m.name) for m in User.gets_by_team_type(TEAM_TYPE_PLANNER)
     ]
     self.discount.choices = DISCOUNT_SALE.items()
Beispiel #31
0
def index_excle_data():
    now_date = datetime.datetime.now()
    location = int(request.values.get('location', 0))
    start_year = str(request.values.get('start_year', now_date.year))
    start_month = str(request.values.get('start_month', now_date.month))
    end_year = str(request.values.get('end_year', now_date.year - 1))
    end_month = str(request.values.get('end_month', now_date.month))

    start_date_month = datetime.datetime.strptime(
        start_year + '-' + start_month, '%Y-%m')
    end_date_month = datetime.datetime.strptime(
        end_year + '-' + end_month, '%Y-%m')
    medium_orders = MediumOrderExecutiveReport.query.filter(
        MediumOrderExecutiveReport.month_day >= start_date_month,
        MediumOrderExecutiveReport.month_day <= end_date_month)

    douban_orders = DoubanOrderExecutiveReport.query.filter(
        DoubanOrderExecutiveReport.month_day >= start_date_month,
        DoubanOrderExecutiveReport.month_day <= end_date_month)

    medium_date = [_format_order(k) for k in medium_orders if k.status == 1]
    douban_date = [_format_order(k, 'douban') for k in douban_orders]

    medium_info_params = {}
    medium_info_params[u'豆瓣'] = 0
    for k in Medium.all():
        medium_info_params[k.name] = 0

    for k in medium_date + douban_date:
        if k['medium_name'] in medium_info_params:
            medium_info_params[k['medium_name']] += _get_money_by_location(k, location)
    medium_info_params = sorted(
        medium_info_params.iteritems(), key=lambda x: x[1])
    medium_info_params = [(k, v) for k, v in medium_info_params if v > 0]
    medium_info_params.reverse()

    headings = ['#', u'媒体名称', u'执行额', u'占比']
    data = []
    data.append([k + 1 for k in range(len(medium_info_params))])
    data.append([k for k, v in medium_info_params])
    data.append([v for k, v in medium_info_params])
    sum_saler_money = sum([v for k, v in medium_info_params])
    if sum_saler_money:
        data.append(['%.2f%%' % (v / sum_saler_money * 100)
                     for k, v in medium_info_params])
    else:
        data.append(['0.00%' for k, v in medium_info_params])
    return {'data': data, 'title': u'致趣媒体执行额分析',
            'total': float(sum_saler_money), 'headings': headings}
Beispiel #32
0
def create(type):
    if not (g.user.is_planner() or g.user.is_operater()):
        abort(403)
    mediums_form = MediumsForm(request.form)
    if request.method == 'POST':
        name = request.values.get('name', '')
        url = request.values.get('url', '')
        brand = request.values.get('brand', '')
        industry = request.values.get('industry', '')
        desc = request.values.get('desc', '')
        pwd = request.values.get('pwd', '')
        tags = request.values.get('tags', '').split(',')
        is_win = int(request.values.get('is_win', 0))
        if Case.query.filter_by(name=name, type=type).count() > 0:
            flash(u'名称已存在', 'danger')
            return redirect(url_for('mediums_planning.create', type=type))
        case = Case.add(name=name, url=url, medium=Medium.get(1),
                        mediums=Medium.gets(request.values.getlist('mediums')),
                        brand=brand, industry=industry, desc=desc,
                        creator=g.user, type=type, is_win=is_win,
                        pwd=pwd)
        case = Case.get(case.id)
        for k in tags:
            if k:
                tag = Tag.query.filter_by(name=k)
                if tag.count() > 0:
                    tag = tag.first()
                else:
                    tag = Tag.add(name=k)
                    tag = Tag.get(tag.id)
                TagCase.add(tag=tag, case=case)
        flash(u'添加成功', 'success')
        return redirect(url_for('mediums_planning.index', type=type))
    return tpl('/mediums/planning/create.html', title=CASE_TYPE_CN[int(type)],
               mediums=Medium.all(), type=type, mediums_form=mediums_form,
               INDUSTRY=INDUSTRY)
Beispiel #33
0
def create_or_modify_sf_organization_and_media():

    organization = Organization.create_or_modify({
        '__SEARCH_BY__': 'name',
        'name': 'Science Feedback',
    })

    ApiHandler.save(organization)

    climate_medium = Medium.create_or_modify({
        '__SEARCH_BY__': 'name',
        'logoUrl': 'https://climatefeedback.org/wp-content/themes/wordpress-theme/dist/images/Climate_Feedback_logo_s.png',
        'name': 'Climate Feedback',
        'organization': organization,
        'url': 'https://climatefeedback.org',
    })

    health_medium = Medium.create_or_modify({
        '__SEARCH_BY__': 'name',
        'logoUrl': 'https://healthfeedback.org/wp-content/themes/wordpress-theme/dist/images/healthfeedback_logo.png',
        'name': 'Health Feedback',
        'organization': organization,
        'url': 'https://healthfeedback.org',
    })

    science_medium = Medium.create_or_modify({
        '__SEARCH_BY__': 'name',
        'logoUrl': 'https://sciencefeedback.co/wp-content/themes/SF-wordpress/dist/images/sciencefeedback_logo.png',
        'name': 'Science Feedback',
        'organization': organization,
        'url': 'https://sciencefeedback.co',
    })

    ApiHandler.save(climate_medium,
                    health_medium,
                    science_medium)
Beispiel #34
0
def new_medium(medium_group_id):
    if not (g.user.is_media_leader() or g.user.is_super_leader()):
        abort(403)
    if request.method == 'POST':
        medium_group = MediumGroup.get(int(request.values.get('medium_group_id')))
        name = request.values.get('name', '')
        if not medium_group:
            flash(u'新建媒体(%s)失败,请选择正确的供应商!' % name, 'danger')
            return tpl('/client/medium/info.html', title=u"新建媒体", medium=None,
                       medium_groups=MediumGroup.all(), medium_group_id=medium_group_id)
        medium = Medium.add(
            name=name,
            medium_group=medium_group)
        flash(u'新建媒体(%s)成功!' % name, 'success')
        return redirect(url_for("client.medium_detail", medium_id=medium.id))
    return tpl('/client/medium/info.html', title=u"新建媒体", medium=None,
               medium_groups=MediumGroup.all(), medium_group_id=medium_group_id)
Beispiel #35
0
def create():
    form = NewMediumResourceForm(request.form)
    if request.method == 'POST' and form.validate():
        if MediumResource.query.filter_by(number=form.number.data).count() > 0:
            flash(u'资源标号已存在', 'danger')
            return tpl('/mediums/resource/create.html', form=form)
        body = []
        custom_ids = request.values.get('custom_ids', '')
        for x in custom_ids.split('|'):
            key = request.values.get('custom_key_' + str(x), '')
            value = request.values.get('custom_value_' + str(x), '')
            body.append({'c_key': key, 'c_value': value})
        MediumResource.add(medium=Medium.get(form.medium.data),
                           type=form.type.data,
                           number=form.number.data,
                           shape=form.shape.data,
                           product=form.product.data,
                           resource_type=form.resource_type.data,
                           page_postion=form.page_postion.data,
                           ad_position=form.ad_position.data,
                           cpm=form.cpm.data,
                           b_click=form.b_click.data,
                           click_rate=form.click_rate.data,
                           buy_unit=form.buy_unit.data,
                           buy_threshold=form.buy_threshold.data,
                           money=form.money.data,
                           b_directional=form.b_directional.data,
                           directional_type=form.directional_type.data,
                           directional_money=form.directional_money.data,
                           discount=form.discount.data,
                           ad_size=form.ad_size.data,
                           materiel_format=form.materiel_format.data,
                           less_buy=form.less_buy.data,
                           b_give=form.b_give.data,
                           give_desc=form.give_desc.data,
                           b_check_exposure=form.b_check_exposure.data,
                           b_check_click=form.b_check_click.data,
                           b_out_link=form.b_out_link.data,
                           b_in_link=form.b_in_link.data,
                           description=form.description.data,
                           create_time=datetime.datetime.now(),
                           update_time=datetime.datetime.now(),
                           body=json.dumps(body))
        flash(u'添加成功', 'success')
        return redirect(url_for('mediums_resource.index'))
    return tpl('/mediums/resource/create.html', form=form)
Beispiel #36
0
def medium_rebate_create(medium_id):
    medium = Medium.get(medium_id)
    if request.method == 'POST':
        rebate = float(request.values.get('rebate', 0))
        year = request.values.get(
            'year', datetime.datetime.now().strftime('%Y'))
        now_year = datetime.datetime.strptime(year, '%Y').date()
        if MediumRebate.query.filter_by(medium=medium, year=now_year).count() > 0:
            flash(u'该执行年返点信息已存在!', 'danger')
            return tpl('/client/medium/rebate/create.html', medium=medium)
        MediumRebate.add(medium=medium,
                         rebate=rebate,
                         year=now_year,
                         creator=g.user,
                         create_time=datetime.datetime.now())
        flash(u'添加成功!', 'success')
        return redirect(url_for('client.medium_rebate', medium_id=medium_id))
    return tpl('/client/medium/rebate/create.html', medium=medium)
def attach_crowdtangle_entities_from_content(content, request_start_date):

    # create a "CrowdTangle" user to testify that these Facebook posts are connected to the url
    crowdtangle_user = User.create_or_modify({
        '__SEARCH_BY__': 'email',
        'email': "*****@*****.**",
        'password': "******",
        'firstName': "Crowd",
        'lastName': "Tangle"
    })

    # create the Facebook platform so we can link our Facebook posts media to it:
    facebook_platform = Platform.create_or_modify({
        '__SEARCH_BY__': 'name',
        'name': 'Facebook'
    })

    shares = shares_from_url(content.url, request_start_date)

    for share in shares:
        medium_group = Medium.create_or_modify({
            '__SEARCH_BY__': 'name',
            'platform': facebook_platform,
            **share['account']
        })

        content_post = Content.create_or_modify({
            '__SEARCH_BY__': 'url',
            'medium': medium_group,
            'type': ContentType.POST,
            **share['post']
        })

        crowdtangle_identifier = '{}_{}_{}'.format(
            content.id, content_post.crowdtangleIdentifier,
            crowdtangle_user.id)

        appearance = Appearance.create_or_modify({
            '__SEARCH_BY__': 'crowdtangleIdentifier',
            'crowdtangleIdentifier': crowdtangle_identifier,
            'quotedContent': content,
            'quotingContent': content_post,
            'testifier': crowdtangle_user
        })
Beispiel #38
0
def new_invoice(order_id,
                redirect_endpoint='saler_client_order_medium_invoice.index'):
    order = ClientOrder.get(order_id)
    if not order:
        abort(404)
    form = MediumInvoiceForm(request.form)
    form.client_order.choices = [(order.id, order.client.name)]
    form.medium.choices = [(order.id, order.client.name)
                           for k in order.mediums]
    form.bool_invoice.choices = MEDIUM_INVOICE_BOOL_INVOICE_CN.items()
    # if order.mediums_money2 < order.mediums_invoice_sum + float(form.money.data):
    #     flash(u'新建打款发票失败,发票超过媒体总金额!', 'danger')
    #     return redirect(url_for(redirect_endpoint, order_id=order_id))
    if request.method == 'POST':
        invoice = MediumInvoice.add(
            client_order=order,
            medium=Medium.get(form.medium.data),
            company=form.company.data,
            tax_id=form.tax_id.data,
            address=form.address.data,
            phone=form.phone.data,
            bank_id=form.bank_id.data,
            bank=form.bank.data,
            detail=form.detail.data,
            money=form.money.data,
            pay_money=form.money.data,
            invoice_type=form.invoice_type.data,
            invoice_status=MEDIUM_INVOICE_STATUS_NORMAL,
            creator=g.user,
            invoice_num=form.invoice_num.data,
            add_time=form.add_time.data,
            bool_invoice=form.bool_invoice.data)
        invoice.save()
        flash(u'新建打款发票(%s)成功!' % form.company.data, 'success')
        order.add_comment(
            g.user,
            u"添加打款发票申请信息:%s" %
            (u'发票内容: %s; 发票金额: %s元; 发票号: %s' %
             (invoice.detail, str(invoice.money), invoice.invoice_num)),
            msg_channel=3)
    else:
        for k in form.errors:
            flash(u"新建打款发票失败,%s" % (form.errors[k][0]), 'danger')
    return redirect(url_for(redirect_endpoint, order_id=order_id))
Beispiel #39
0
def agent_medium_rebate_create(agent_id):
    agent = Agent.get(agent_id)
    if request.method == 'POST':
        rebate = float(request.values.get('rebate', 0))
        year = request.values.get(
            'year', datetime.datetime.now().strftime('%Y'))
        now_year = datetime.datetime.strptime(year, '%Y').date()
        medium_name = request.values.get('medium_name', '')
        AgentMediumRebate.add(agent=agent,
                              medium=Medium.get(1),
                              medium_name=medium_name,
                              rebate=rebate,
                              year=now_year,
                              creator=g.user,
                              create_time=datetime.datetime.now())
        flash(u'添加成功!', 'success')
        agent.add_comment(g.user, u"新建了媒体返点信息: 所属媒体:%s 执行年:%s 返点信息:%s%%" %
                          (medium_name, year, str(rebate)), msg_channel=9)
        return redirect(url_for('client.agent_rebate', agent_id=agent_id))
    return tpl('/client/agent/rebate/medium/create.html', agent=agent, medium_groups=MediumGroup.all())
Beispiel #40
0
 def __init__(self, *args, **kwargs):
     super(NewMediumResourceForm, self).__init__(*args, **kwargs)
     self.medium.choices = [(k.id, k.name) for k in Medium.all()]
     self.type.choices = [(1, u'PC端'), (2, u'移动端'), (3, u'线下活动')]
     self.shape.choices = [(1, u'互联网')]
     self.product.choices = [(k.id, k.name) for k in list(MediumProductPC.all(
     )) + list(MediumProductApp.all()) + list(MediumProductDown.all())]
     self.resource_type.choices = [
         (1, u'硬广'), (2, u'互动'), (3, u'特殊'), (4, u'其他')]
     self.b_click.choices = [(0, u'否'), (1, u'是')]
     self.buy_unit.choices = [
         (0, u'无'), (1, u'CPM'), (2, u'千份(周)'), (3, u'期'), (4, u'千份'), (5, u'天')]
     self.b_directional.choices = [(0, u'否'), (1, u'是')]
     self.directional_type.choices = [
         (0, u'无'), (1, u'地域'), (2, u'话题'), (3, u'地域、话题'), (10, u'其他')]
     self.less_buy.choices = [(0, u'无限制'), (1, u'不低于1000CPM')]
     self.b_give.choices = [(0, u'否'), (1, u'是')]
     self.b_check_exposure.choices = [(0, u'否'), (1, u'是')]
     self.b_check_click.choices = [(0, u'否'), (1, u'是')]
     self.b_out_link.choices = [(0, u'否'), (1, u'是')]
     self.b_in_link.choices = [(0, u'否'), (1, u'是')]
Beispiel #41
0
def index(type):
    page = int(request.values.get('p', 1))
    industry = request.values.get('industry', '')
    medium = int(request.values.get('medium', 0))
    info = request.values.get('info', '')
    cases = list(Case.query.filter_by(type=type))
    if medium:
        cases = [case for case in cases if medium in case.mediums_id]
    if info:
        cases = [case for case in cases if info in case.info]
    if industry:
        cases = [case for case in cases if industry == case.industry]
    paginator = Paginator(cases, 50)
    try:
        cases = paginator.page(page)
    except:
        cases = paginator.page(paginator.num_pages)
    return tpl('/mediums/planning/index.html', title=CASE_TYPE_CN[int(type)],
               mediums=Medium.all(), medium=medium, cases=cases, type=type,
               info=info, params="&info=%s&medium=%s&industry=%s" % (
                   info, str(medium), industry), INDUSTRY=INDUSTRY,
               page=page, tags=Tag.all(), industry=industry)
Beispiel #42
0
def new_invoice(order_id, redirect_endpoint='saler_client_order_medium_invoice.index'):
    order = ClientOrder.get(order_id)
    if not order:
        abort(404)
    form = MediumInvoiceForm(request.form)
    form.client_order.choices = [(order.id, order.client.name)]
    form.medium.choices = [(order.id, order.client.name)
                           for k in order.mediums]
    form.bool_invoice.choices = MEDIUM_INVOICE_BOOL_INVOICE_CN.items()
    # if order.mediums_money2 < order.mediums_invoice_sum + float(form.money.data):
    #     flash(u'新建打款发票失败,发票超过媒体总金额!', 'danger')
    #     return redirect(url_for(redirect_endpoint, order_id=order_id))
    if request.method == 'POST':
        invoice = MediumInvoice.add(client_order=order,
                                    medium=Medium.get(form.medium.data),
                                    company=form.company.data,
                                    tax_id=form.tax_id.data,
                                    address=form.address.data,
                                    phone=form.phone.data,
                                    bank_id=form.bank_id.data,
                                    bank=form.bank.data,
                                    detail=form.detail.data,
                                    money=form.money.data,
                                    pay_money=form.money.data,
                                    invoice_type=form.invoice_type.data,
                                    invoice_status=MEDIUM_INVOICE_STATUS_NORMAL,
                                    creator=g.user,
                                    invoice_num=form.invoice_num.data,
                                    add_time=form.add_time.data,
                                    bool_invoice=form.bool_invoice.data)
        invoice.save()
        flash(u'新建打款发票(%s)成功!' % form.company.data, 'success')
        order.add_comment(g.user, u"添加打款发票申请信息:%s" % (
            u'发票内容: %s; 发票金额: %s元; 发票号: %s' % (invoice.detail, str(invoice.money), invoice.invoice_num)), msg_channel=3)
    else:
        for k in form.errors:
            flash(u"新建打款发票失败,%s" % (form.errors[k][0]), 'danger')
    return redirect(url_for(redirect_endpoint, order_id=order_id))
Beispiel #43
0
def apply():
    if not g.user.is_finance():
        abort(404)
    medium_id = int(request.args.get('medium_id', 0))
    search_info = request.args.get('searchinfo', '').strip()
    location_id = int(request.args.get('selected_location', '-1'))
    page = int(request.args.get('p', 1))

    orders = list(MediumInvoicePay.query.filter_by(pay_status=4))
    if location_id >= 0:
        orders = [
            o for o in orders if location_id in o.medium_invoice.client_order.locations]
    if search_info != '':
        orders = [
            o for o in orders if search_info.lower() in o.medium_invoice.client_order.search_invoice_info.lower()]
    if medium_id:
        orders = [o for o in orders if medium_id == o.medium_invoice.medium_id]
    select_locations = TEAM_LOCATION_CN.items()
    select_locations.insert(0, (-1, u'全部区域'))
    paginator = Paginator(orders, ORDER_PAGE_NUM)
    try:
        orders = paginator.page(page)
    except:
        orders = paginator.page(paginator.num_pages)
    for i in orders.object_list:
        client_order = i.medium_invoice.client_order
        medium_invoices = [k.id for k in MediumInvoice.query.filter_by(client_order=client_order)]
        pays = [k for k in MediumInvoicePay.all() if k.medium_invoice_id in medium_invoices]
        i.apply_num = len([k for k in pays if k.pay_status == 4])
        i.pay_num = len([k for k in pays if k.pay_status == 0])
    return tpl('/finance/client_order/medium_pay/index.html', orders=orders, title=u'申请中的媒体付款',
               locations=select_locations, location_id=location_id,
               now_date=datetime.date.today(),
               search_info=search_info, page=page,
               mediums=[(k.id, k.name) for k in Medium.all()], medium_id=medium_id,
               params='&searchinfo=%s&selected_location=%s&medium_id=%s' %
                      (search_info, location_id, str(medium_id)))
Beispiel #44
0
 def __init__(self, *args, **kwargs):
     super(MediumsForm, self).__init__(*args, **kwargs)
     self.mediums.choices = [(m.id, m.medium_group.name + '-' + m.name) for m in Medium.all()]
Beispiel #45
0
def medium_rebate(medium_id):
    medium = Medium.get(medium_id)
    rebates = MediumRebate.query.filter_by(medium=medium)
    return tpl('/client/medium/rebate/index.html', medium=medium, rebates=rebates)
Beispiel #46
0
def test_medium(session):
    medium = add_medium('testmedium')

    medium2 = Medium.get(medium.id)
    assert medium2.name == 'testmedium'
Beispiel #47
0
 def __init__(self, *args, **kwargs):
     super(NewMediumProductAppForm, self).__init__(*args, **kwargs)
     self.medium.choices = [(k.id, k.name) for k in Medium.all()]
     self.cooperation_type.choices = [(0, u'否'), (1, u'是')]
     self.policies.choices = [(k, str(k) + u'折') for k in range(1, 10)]
Beispiel #48
0
def index():
    if not (g.user.is_super_leader() or g.user.is_media_leader()):
        return abort(403)
    now_date = datetime.datetime.now()
    year = int(request.values.get('year', now_date.year))
    start_date_month = datetime.datetime.strptime(
        str(year) + '-01' + '-01', '%Y-%m-%d')
    end_date_month = datetime.datetime.strptime(
        str(year) + '-12' + '-31', '%Y-%m-%d')
    pre_monthes = get_monthes_pre_days(start_date_month, end_date_month)
    medium_id = int(request.values.get('medium_id', 0))

    ex_medium_orders = [o for o in Order.all(
    ) if o.medium_start.year == year or o.medium_end.year == year]
    obj_data = []
    for order in ex_medium_orders:
        pre_month_sale_money = pre_month_money(order.sale_money, order.medium_start, order.medium_end)
        pre_month_medium_money2 = pre_month_money(order.medium_money2, order.medium_start, order.medium_end)
        # 单笔返点
        agent_rebate = order.client_order.agent_rebate
        try:
            self_agent_rebate = order.client_order.self_agent_rebate
            self_agent_rebate = float(self_agent_rebate.split('-')[0])
            self_agent_rebate_value = float(self_agent_rebate.split('-')[1])
        except:
            self_agent_rebate = 0
            self_agent_rebate_value = 0
        for p in range(len(pre_month_sale_money)):
            d_order = {}
            d_order['medium_id'] = order.medium.id
            d_order['money'] = order.client_order.money
            d_order['contract_status'] = order.client_order.contract_status
            d_order['status'] = order.client_order.status
            d_order['sale_money'] = pre_month_sale_money[p]['money']
            d_order['medium_money2'] = pre_month_medium_money2[p]['money']
            d_order['month_day'] = pre_month_sale_money[p]['month_day']
            medium_rebate = order.medium_rebate_by_year(d_order['month_day'])
            # 媒体单笔返点
            try:
                self_medium_rebate_data = order.self_medium_rebate
                self_medium_rebate = self_medium_rebate_data.split('-')[0]
                self_medium_rebate_value = float(self_medium_rebate_data.split('-')[1])
            except:
                self_medium_rebate = 0
                self_medium_rebate_value = 0
            if int(self_medium_rebate):
                if d_order['sale_money']:
                    d_order['medium_rebate_value'] = d_order['sale_money'] / d_order['money'] * self_medium_rebate_value
                else:
                    d_order['medium_rebate_value'] == 0
            else:
                d_order['medium_rebate_value'] = d_order['medium_money2'] * medium_rebate / 100

            if self_agent_rebate:
                if d_order['money']:
                    d_order['agent_rebate_value'] = self_agent_rebate_value * d_order['sale_money'] / d_order['money']
                else:
                    d_order['agent_rebate_value'] = 0
            else:
                d_order['agent_rebate_value'] = d_order['sale_money'] * agent_rebate / 100
            obj_data.append(d_order)
    ex_medium_orders = [k for k in obj_data if k[
        'contract_status'] not in [0, 1, 3, 6, 7, 8, 81, 9] and k['status'] == 1]

    medium_data = []
    if medium_id:
        mediums = Medium.query.filter_by(id=medium_id)
    else:
        mediums = Medium.all()
    sum_sale_money = 0
    for k in mediums:
        sale_money_data = []
        medium_money2_data = []
        medium_rebate_data = []
        agent_rebate_data = []
        for i in pre_monthes:
            sale_money_data.append(sum([ex['sale_money'] for ex in ex_medium_orders if ex[
                                   'medium_id'] == k.id and ex['month_day'].date() == i['month'].date()]))
            medium_money2_data.append(sum([ex['medium_money2'] for ex in ex_medium_orders if ex[
                                      'medium_id'] == k.id and ex['month_day'].date() == i['month'].date()]))
            medium_rebate_data.append(sum([ex['medium_rebate_value'] for ex in ex_medium_orders if ex[
                                      'medium_id'] == k.id and ex['month_day'].date() == i['month'].date()]))
            agent_rebate_data.append(sum([ex['agent_rebate_value'] for ex in ex_medium_orders if ex[
                                     'medium_id'] == k.id and ex['month_day'].date() == i['month'].date()]))
        sum_sale_money += sum(sale_money_data)
        medium_data.append({'id': k.id, 'name': k.name,
                            'level': k.level or 100,
                            'sale_money_data': sale_money_data,
                            'medium_money2_data': medium_money2_data,
                            'medium_rebate_data': medium_rebate_data,
                            'agent_rebate_data': agent_rebate_data})
    print sum_sale_money
    medium_data = sorted(
        medium_data, key=operator.itemgetter('level'), reverse=False)
    if request.values.get('action', '') == 'download':
        return write_client_excel(medium_data, year)
    return tpl('/data_query/medium/index.html', medium_data=medium_data, medium_id=medium_id,
               year=year, params="?medium_id=%s&year=%s" % (
                   medium_id, str(year)),
               s_mediums=Medium.all())
Beispiel #49
0
def client_medium_upload():
    medium_id = request.values.get('medium')
    medium = Medium.get(medium_id)
    return attachment_upload(medium, FILE_TYPE_MEDIUM)
Beispiel #50
0
def money():
    now_date = datetime.datetime.now()
    year = int(request.values.get('year', now_date.year))
    start_date_month = datetime.datetime.strptime(
        str(year) + '-01' + '-01', '%Y-%m-%d')
    end_date_month = datetime.datetime.strptime(
        str(year) + '-12' + '-31', '%Y-%m-%d')
    pre_monthes = get_monthes_pre_days(start_date_month, end_date_month)
    # 获取代理返点系数
    all_agent_rebate = _all_agent_rebate()
    # 获取媒体返点系数
    all_medium_rebate = _all_medium_rebate()

    # 直签豆瓣订单开始
    douban_orders = DoubanOrderExecutiveReport.query.filter(
        DoubanOrderExecutiveReport.month_day >= start_date_month,
        DoubanOrderExecutiveReport.month_day <= end_date_month)
    douban_orders = [_douban_order_to_dict(k, all_agent_rebate)
                     for k in douban_orders if k.status == 1]
    douban_orders = [k for k in douban_orders if k[
        'contract_status'] in [2, 4, 5, 10, 19, 20] and k['status'] == 1]
    douban_money = _get_medium_moneys(
        douban_orders, pre_monthes, 0, 'zhiqian_order', year)
    # 直签豆瓣订单结束

    # 媒体订单开始
    medium_orders = MediumOrderExecutiveReport.query.filter(
        MediumOrderExecutiveReport.month_day >= start_date_month,
        MediumOrderExecutiveReport.month_day <= end_date_month)
    # 关联豆瓣订单开始
    ass_douban_order = [_ass_medium_order_to_dict(
        k, all_agent_rebate, all_medium_rebate) for k in medium_orders if k.order.associated_douban_order]
    ass_douban_order = [k for k in ass_douban_order if k[
        'contract_status'] in [2, 4, 5, 10, 19, 20] and k['status'] == 1]
    ass_douban_money = _get_medium_moneys(
        ass_douban_order, pre_monthes, 0, 'medium_order', year)
    # 关联豆瓣订单结束

    # 普通媒体订单
    medium_orders = [_client_order_to_dict(k, all_agent_rebate, all_medium_rebate)
                     for k in medium_orders if k.status == 1]
    medium_orders = [k for k in medium_orders if k[
        'contract_status'] in [2, 4, 5, 10, 19, 20] and k['status'] == 1]
    youli_money = _get_medium_moneys(
        medium_orders, pre_monthes, [3], 'medium_order', year)
    wuxian_money = _get_medium_moneys(
        medium_orders, pre_monthes, [8], 'medium_order', year)
    momo_money = _get_medium_moneys(
        medium_orders, pre_monthes, [7], 'medium_order', year)
    zhihu_money = _get_medium_moneys(
        medium_orders, pre_monthes, [5], 'medium_order', year)
    xiachufang_money = _get_medium_moneys(
        medium_orders, pre_monthes, [6], 'medium_order', year)
    xueqiu_money = _get_medium_moneys(
        medium_orders, pre_monthes, [9], 'medium_order', year)
    huxiu_money = _get_medium_moneys(
        medium_orders, pre_monthes, [14, 57], 'medium_order', year)
    kecheng_money = _get_medium_moneys(
        medium_orders, pre_monthes, [4], 'medium_order', year)
    midi_money = _get_medium_moneys(
        medium_orders, pre_monthes, [21], 'medium_order', year)
    weipiao_money = _get_medium_moneys(
        medium_orders, pre_monthes, [52], 'medium_order', year)
    one_money = _get_medium_moneys(
        medium_orders, pre_monthes, [51], 'medium_order', year)
    # ---计算大于100W的媒体
    up_money = {}
    other_money = {'sale_money': [0 for k in range(48)],
                   'money2': [0 for k in range(48)],
                   'm_ex_money': [0 for k in range(48)],
                   'a_rebate': [0 for k in range(48)],
                   'profit': [0 for k in range(48)]}
    # 用于计算合计的其他媒体售卖金额
    total_except_money = [0 for k in range(48)]
    total_a_rebate = [0 for k in range(48)]
    for k in Medium.all():
        if int(k.id) not in except_medium_ids:
            u_medium = _get_medium_moneys(
                medium_orders, pre_monthes, [int(k.id)], 'medium_order', year)
            if sum(u_medium['sale_money']) >= 1000000:
                up_money[k.name] = u_medium
            else:
                other_money['sale_money'] = numpy.array(
                    other_money['sale_money']) + numpy.array(u_medium['sale_money'])
                other_money['money2'] = numpy.array(
                    other_money['money2']) + numpy.array(u_medium['money2'])
                other_money['m_ex_money'] = numpy.array(
                    other_money['m_ex_money']) + numpy.array(u_medium['m_ex_money'])
                other_money['a_rebate'] = numpy.array(
                    other_money['a_rebate']) + numpy.array(u_medium['a_rebate'])
                other_money['profit'] = numpy.array(
                    other_money['profit']) + numpy.array(u_medium['profit'])
            total_except_money = numpy.array(
                total_except_money) + numpy.array(u_medium['sale_money'])
            total_a_rebate = numpy.array(
                total_a_rebate) + numpy.array(u_medium['a_rebate'])
    # 计算大于100W的媒体结束---

    # 媒体订单结束

    # 搜索直签订单开始
    searchAd_medium_orders = searchAdMediumOrderExecutiveReport.query.filter(
        searchAdMediumOrderExecutiveReport.month_day >= start_date_month,
        searchAdMediumOrderExecutiveReport.month_day <= end_date_month)
    searchAd_medium_orders = [_search_order_to_dict(
        k) for k in searchAd_medium_orders]
    searchAd_medium_orders = [k for k in searchAd_medium_orders if k[
        'contract_status'] in [2, 4, 5, 10, 19, 20] and k['status'] == 1]
    searchAD_money = _get_medium_moneys(
        searchAd_medium_orders, pre_monthes, 0, 's_medium_order', year)
    # 搜索直签订单结束

    # 搜索返点订单开始
    searchAd_rebate_orders = searchAdRebateOrderExecutiveReport.query.filter(
        searchAdMediumOrderExecutiveReport.month_day >= start_date_month,
        searchAdMediumOrderExecutiveReport.month_day <= end_date_month)
    searchAd_rebate_orders = [_search_rebate_order_to_dict(k)
                              for k in searchAd_rebate_orders if k.status == 1]
    searchAd_rebate_orders = [k for k in searchAd_rebate_orders if k[
        'contract_status'] in [2, 4, 5, 10, 19, 20]]
    rebate_order_money = _get_medium_moneys(
        searchAd_rebate_orders, pre_monthes, 0, '', year)
    # 搜索返点订单结束
    # 搜索业务毛利+返点收入
    searchAD_money['profit'] = numpy.array(
        searchAD_money['profit']) + numpy.array(rebate_order_money['sale_money'])
    # 豆瓣收入、服务费、返点、毛利为直签豆瓣+优力和无线总和
    douban_money['sale_money'] = numpy.array(
        douban_money['sale_money']) + numpy.array(ass_douban_money['money2'])
    if year == 2016:
        douban_money['money2'] = numpy.array(
            douban_money['money2']) + numpy.array([k * 0.18 for k in ass_douban_money['money2']])
        douban_money['a_rebate'] = [0 for k in range(48)]
        douban_money['profit'] = numpy.array(
            douban_money['money2']) - numpy.array(douban_money['a_rebate'])
    elif year == 2014:
        douban_money['money2'] = numpy.array(
            douban_money['money2']) + numpy.array([k * 0.426 for k in ass_douban_money['money2']])
        douban_money['a_rebate'] = numpy.array(
            douban_money['a_rebate']) + numpy.array(ass_douban_money['a_rebate'])
        douban_money['profit'] = numpy.array(
            douban_money['money2']) - numpy.array(douban_money['a_rebate'])
    else:
        douban_money['money2'] = numpy.array(
            douban_money['money2']) + numpy.array([k * 0.4 for k in ass_douban_money['money2']])
        douban_money['a_rebate'] = numpy.array(
            douban_money['a_rebate']) + numpy.array(ass_douban_money['a_rebate'])
        douban_money['profit'] = numpy.array(
            douban_money['money2']) - numpy.array(douban_money['a_rebate'])
    # 计算豆瓣收入、服务费、返点、毛利为直签豆瓣+优力和无线总和
    if g.user.is_aduit() and str(year) == '2014':
        total = numpy.array(momo_money['sale_money']) +\
            numpy.array(zhihu_money['sale_money']) +\
            numpy.array(xiachufang_money['sale_money']) +\
            numpy.array(xueqiu_money['sale_money']) +\
            numpy.array(huxiu_money['sale_money']) +\
            numpy.array(kecheng_money['sale_money']) +\
            numpy.array(midi_money['sale_money']) +\
            numpy.array(weipiao_money['sale_money']) +\
            numpy.array(one_money['sale_money']) +\
            numpy.array(total_except_money) +\
            numpy.array(searchAD_money['sale_money']) +\
            numpy.array(rebate_order_money['sale_money'])
    else:
        total = numpy.array(douban_money['profit']) +\
            numpy.array(momo_money['sale_money']) +\
            numpy.array(zhihu_money['sale_money']) +\
            numpy.array(xiachufang_money['sale_money']) +\
            numpy.array(xueqiu_money['sale_money']) +\
            numpy.array(huxiu_money['sale_money']) +\
            numpy.array(kecheng_money['sale_money']) +\
            numpy.array(midi_money['sale_money']) +\
            numpy.array(weipiao_money['sale_money']) +\
            numpy.array(one_money['sale_money']) +\
            numpy.array(total_except_money) +\
            numpy.array(searchAD_money['sale_money']) +\
            numpy.array(rebate_order_money['sale_money'])
    if request.values.get('action', '') == 'download':
        response = write_medium_money_excel(pre_monthes=pre_monthes, douban_money=douban_money,
                                            youli_money=youli_money, wuxian_money=wuxian_money,
                                            momo_money=momo_money, zhihu_money=zhihu_money,
                                            xiachufang_money=xiachufang_money, xueqiu_money=xueqiu_money,
                                            huxiu_money=huxiu_money, kecheng_money=kecheng_money,
                                            weipiao_money=weipiao_money, one_money=one_money,
                                            midi_money=midi_money, other_money=other_money,
                                            searchAD_money=searchAD_money, rebate_order_money=rebate_order_money,
                                            total=total, up_money=up_money, year=str(
                                                year)
                                            )
        return response
    return tpl('/data_query/super_leader/medium_money.html',
               pre_monthes=pre_monthes, douban_money=douban_money,
               youli_money=youli_money, wuxian_money=wuxian_money,
               momo_money=momo_money, zhihu_money=zhihu_money,
               xiachufang_money=xiachufang_money, xueqiu_money=xueqiu_money,
               huxiu_money=huxiu_money, kecheng_money=kecheng_money,
               weipiao_money=weipiao_money, one_money=one_money,
               midi_money=midi_money, other_money=other_money, total=total,
               searchAD_money=searchAD_money, rebate_order_money=rebate_order_money,
               year=str(year), up_money=up_money)
Beispiel #51
0
def mediums_json():
    return jsonify({'ret': True, 'data': [{'name': m.name} for m in Medium.all()]})
Beispiel #52
0
from app import app
from libs.db import db
db.create_all()

from models.user import (User, Team, TEAM_TYPE_SUPER_ADMIN, TEAM_TYPE_MEDIUM,
                         TEAM_TYPE_LEADER, TEAM_TYPE_DIRECT_SELLER)
from models.medium import Medium, MediumGroup
from models.client import Client, Agent, Group
from models.order import Order
from config import DEFAULT_PASSWORD

admin_team = Team.add(u'管理员', type=TEAM_TYPE_SUPER_ADMIN)
medium_team = Team.add(u'媒体', type=TEAM_TYPE_MEDIUM)
leader_team = Team.add('ledaer', type=TEAM_TYPE_LEADER)
sale_team = Team.add('ledaer', type=TEAM_TYPE_DIRECT_SELLER)


user = User.add(name="admin", email="*****@*****.**", password=DEFAULT_PASSWORD, team=admin_team)
leader = User.add(name="leader", email="*****@*****.**", password=DEFAULT_PASSWORD, team=leader_team)
saler = User.add(name="saler", email="*****@*****.**", password=DEFAULT_PASSWORD, team=sale_team)

medium_group = MediumGroup.add(name='测试媒体供应商', tax_num="", address="",
                               phone_num="", bank="", bank_num="", level=100)
medium = Medium.add(medium_group, u"测试媒体", owner=medium_team)

client = Client.add(u"测试客户", 0)

group = Group.add(u'测试代理集团')

agent = Agent.add(u"测试代理", group=group)
Beispiel #53
0
def update(oid):
    out = Out.get(oid)
    joiners_form = JoinersForm(request.form)
    joiners_form.joiners.data = [u.id for u in out.joiners]
    m_persions = []
    if g.user.is_out_saler:
        m_persions += [{'key': '1' + '-' +
                        str(k.id) + '-' + k.name, 'name': k.name} for k in Client.all()]
        m_persions += [{'key': '2' + '-' +
                        str(k.id) + '-' + k.name, 'name': k.name} for k in Agent.all()]
        m_persions += [{'key': '3' + '-' +
                        str(k.id) + '-' + k.name, 'name': k.name} for k in Medium.all()]
        m_persions.append({'key': 100, 'name': u'其他'})
    if request.method == 'POST':
        if g.user.is_out_saler:
            creator_type = 1
        else:
            creator_type = 2
        start_time = request.values.get('start_time', '')
        end_time = request.values.get('end_time', '')
        # m_person有两种类型,一种是其他所以填写,一种是代理+客户+媒体组合而成,例如:1-1,2-1,3-1(具体请查看m_persions)
        m_persion = request.values.get('m_persion', '')
        m_persion_type = int(request.values.get('m_persion_type', 1))
        reason = request.values.get('reason', '')
        persions = request.values.get('persions', '')
        address = request.values.get('address', '')
        joiners = User.gets(request.values.getlist('joiners'))
        out.start_time = datetime.datetime.strptime(
            start_time, '%Y-%m-%d %H:%M')
        out.end_time = datetime.datetime.strptime(end_time, '%Y-%m-%d %H:%M')
        out.reason = reason
        out.joiners = joiners
        out.persions = persions
        out.address = address
        out.m_persion = m_persion
        out.m_persion_type = m_persion_type
        out.creator_type = creator_type
        out.status = int(request.values.get('action', 0))
        out.create_time = datetime.datetime.now()
        out.save()
        # 先删除外出报表,在从新添加
        OutReport.query.filter_by(out_id=oid).delete()
        for k in list(set(joiners + [out.creator])):
            OutReport.add(
                start_time=datetime.datetime.strptime(
                    start_time, '%Y-%m-%d %H:%M'),
                end_time=datetime.datetime.strptime(
                    end_time, '%Y-%m-%d %H:%M'),
                reason=reason,
                out=out,
                meeting_s='',
                persions=persions,
                address=address,
                m_persion=m_persion,
                m_persion_type=m_persion_type,
                creator_type=creator_type,
                status=int(request.values.get('action', 0)),
                creator=k,
                create_time=datetime.datetime.now()
            )

        if int(int(request.values.get('action', 0))) == OUT_STATUS_APPLY:
            flash(u'已发送申请', 'success')
            account_out_apply_signal.send(
                current_app._get_current_object(), out=out, status=1)
        else:
            flash(u'添加成功,请及时申请外出报备', 'success')
        return redirect(url_for('account_out.index'))
    return tpl('/account/out/update.html', out=out, m_persions=m_persions, joiners_form=joiners_form)