def become_customer():
	'''Deprecated: customers are registered in admin blueprint'''
	if not g.user.is_customer():
		do_or_abort(actions.users.become_customer, g.user.id)
		flash(u'Поздравляем, теперь вы рекламодатель!', 'success')
	else:
		flash(u'Вы уже являетесь рекламодателем', 'error')
	return redirect(url_for('.orders'))
def apps_info_actions(id):
	ap = do_or_abort(a.apps.get_app, id, full=True)
	page = convert.to_int(request.args.get('page'), 1)
	count = a.actions.get_actions_count(appId=ap.id)
	per_page = app.config.get('ADMIN_ACTIONS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	acts = do_or_abort(a.actions.get_actions, offset=offset, limit=limit, full=True, appId=ap.id)
	return render_template('admin/apps-info-actions.html', app=ap, actions=acts, pages=pages)
def become_developer():
	'''Deprecated: developers register with invites'''
	if not g.user.is_developer():
		do_or_abort(actions.users.become_developer, g.user.id)
		flash(u'Поздравляем, теперь вы разработчик!', 'success')
	else:
		flash(u'Вы уже являетесь разработчиком', 'error')
	return redirect(url_for('.apps'))
def performers_info_actions(id):
	performer = do_or_abort(a.performers.get_performer, id, full=True)
	page = convert.to_int(request.args.get('page'), 1)
	count = a.actions.get_actions_count(performerId=performer.id)
	per_page = app.config.get('ADMIN_ACTIONS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	acts = do_or_abort(a.actions.get_actions, 
		offset=offset, limit=limit, full=True, performerId=performer.id)
	return render_template('admin/performers-info-actions.html', performer=performer, actions=acts, pages=pages)
def users_info_apps(id):
	user = do_or_abort(a.users.get_user_by_id, id)
	if not user.is_developer(): abort(404)
	
	page = convert.to_int(request.args.get('page'), 1)
	count = a.apps.get_apps_count(user_id=user.id)
	per_page = app.config.get('ADMIN_APPS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	with_deleted = session.get(SESSION_APPS_SHOW_DELETED, False)
	aps = do_or_abort(a.apps.get_apps, with_deleted=with_deleted,
					user_id=user.id, offset=offset, limit=limit, full=True)
	return render_template('admin/users-info-apps.html', user=user, apps=aps, pages=pages)
def apps_new():
	form = forms.AppForm(request.form)
	if request.method == 'POST' and form.validate():
		do_or_abort(actions.apps.add_app,
			title=form.apptitle.data,
			user_id=g.user.id,
			callback=form.appurl.data,
			url=form.appurl.data,
			platform=form.appplatform.data)
		flash(u'Приложение успешно добавлено', 'success')
		return redirect(url_for('.apps'))
	return render_template('cabinet/apps-new.html', form=form)
def orders_info_apps(id):
	order = do_or_abort(a.orders.get_order, id, full=True)
	aps = do_or_abort(a.apps.get_apps, offset=0, limit=10000, full=True)
	form = forms.OrderAppsForm(request.form, filter=order.app_filter_type)
	if request.method == 'POST' and form.validate():
		a.orders.update_order(order.id,
			app_filter_type=form.filter.data,
			app=[int(x) for x in form.apps.data.split(',')] if form.apps.data else []
		)
		flash(u'Таргетинг успешно обновлен', 'success')
		return redirect(url_for('.orders_info_apps', id=order.id))
	return render_template('admin/orders-info-apps.html', order=order, apps=aps, form=form)
def users_info_balance(id):
	user = do_or_abort(a.users.get_user_by_id, id)
	delete_form = forms.WithdrawalDeleteForm()
	withdrawals = None
	if user.is_customer():
		account = user.customer_account
		form = forms.BalanceForm(request.form)
		if request.method == 'POST' and form.validate():
			a.users.increase_customer_balance(user.id, round(form.amount.data, 2))
			flash(u'Баланс успешно пополнен', 'success')
			return redirect(url_for('.users_info_balance', id=user.id))
	elif user.is_developer():
		account = user.developer_account
		form = forms.BalanceForm(request.form, amount=account.balance)
		if request.method == 'POST' and form.validate():
			a.users.make_user_withdrawal(user.id, round(form.amount.data, 2))
			flash(u'Выплата разработчику успешно создана', 'success')
			return redirect(url_for('.users_info_balance', id=user.id))
		
		withdrawals = a.users.get_user_withdrawals(user.id)
	else:
		flash(u'Пользователь не имеет счета', 'error')
		return redirect(url_for('.users_info', id=user.id))
	
	page = convert.to_int(request.args.get('page'), 1)
	count = a.accounts.get_account_transactions_count(account.id)
	per_page = app.config.get('ADMIN_TRANSACTIONS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	transactions = a.accounts.get_account_transactions(account_id=account.id, offset=offset, limit=limit)
	return render_template('admin/users-info-balance.html', transactions=transactions,
		withdrawals=withdrawals, pages=pages, user=user, form=form, delete_form=delete_form)
def users_info_lists_add(id):
	user = do_or_abort(a.users.get_user_by_id, id)
	if mmail.lists_add_user(user, mail_if_failed=False):
		flash(u'Пользователь добавлен в списки рассылки', 'success')
	else:
		flash(u'Ошибка при добавлении пользователя в списки рассылки', 'error')
	return redirect(url_for('.users_info', id=user.id))
def performers():
	page = convert.to_int(request.args.get('page'), 1)
	count = a.performers.get_performers_count()
	per_page = app.config.get('ADMIN_PERFORMERS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	perfs = do_or_abort(a.performers.get_performers, offset=offset, limit=limit, full=True)
	return render_template('admin/performers.html', performers=perfs, pages=pages)
def actions():
	page = convert.to_int(request.args.get('page'), 1)
	count = a.actions.get_actions_count()
	per_page = app.config.get('ADMIN_ACTIONS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	acts = do_or_abort(a.actions.get_actions, offset=offset, limit=limit, full=True)
	return render_template('admin/actions.html', actions=acts, pages=pages)
def orders_new():
	sizes = actions.bannersizes.get_banner_sizes()
	choices = [(s.id, '{0} x {1}'.format(s.width, s.height)) for s in sizes]
	cities = [dict(id=city.id, name=city.name) for city in actions.cities.get_cities()]
	settings = actions.settings.get_settings()
	
	form = forms.BannerOrderForm(request.form, c_min=settings.c_min_safe(), c_rec=settings.c_rec())
	form.orderbannersize.choices = choices
	if request.method == 'POST' and form.validate():
		id = do_or_abort(actions.orders.add_banner_order,
			user_id=g.user.id,
			title=form.ordername.data,
			url=form.orderurl.data,
			balance=round(form.orderbalance.data, 2),
			cpa=round(form.ordercpa.data, 2),
			allow_negative_balance=False,
			auto_approve=True,
			reentrant=True,
			male=form.ordermale.data,
			min_age=form.orderminage.data,
			max_age=form.ordermaxage.data,
			min_hour=form.orderminhour.data,
			max_hour=form.ordermaxhour.data,
			city_filter_type=form.ordercitiesfilter.data if form.ordercities.data else u'',
			city=[int(x) for x in form.ordercities.data.split(',')] if form.ordercities.data else [],
			banner_size=form.orderbannersize.data,
			banner_mime_type=form.orderimage.mime_type,
			image=base64.encodestring(request.files['orderimage'].stream.read()))
		order = actions.orders.get_order(id)
		mail.admin_order_created(g.user, order)
		flash(u'Заказ успешно создан. Он станет активным после проверки администрацией.', 'success')
		return redirect(url_for('.orders_info', id=id))
	return render_template('cabinet/orders-new.html', form=form, cities=cities)
def orders_info(id):
	order = do_or_abort(a.orders.get_order, id, full=True)
	form = forms.OrderBlockForm(request.form)
	if request.method == 'POST' and form.validate():
		if not order.disabled:
			a.orders.disable_order(order.id)
			order_info = OrderInfo.query.get_or_create(order_id=order.id)
			order_info.block_reason = form.reason.data
			order_info.block_date = datetime.now()
			order_info.save()
			if form.mail.data: tmail.user_order_blocked(order, form.reason.data)
			tmail.admin_order_blocked(order, g.user, form.reason.data)
			flash(u'Заказ заблокиорван', 'success')
			return redirect(url_for('.orders_info', id=order.id))
		else:
			actn = request.form.get('action', 'unblock')
			if actn == 'unblock':
				a.orders.enable_order(order.id)
				if form.mail.data: tmail.user_order_unblocked(order)
				tmail.admin_order_unblocked(order, g.user)
				flash(u'Заказ разблокиорван', 'success')
			elif actn == 'notify':
				order_info = OrderInfo.query.get_or_create(order_id=order.id)
				order_info.block_reason = form.reason.data
				order_info.block_date = datetime.now()
				order_info.save()
				if form.mail.data: tmail.user_order_moderation_failed(order, form.reason.data)
				tmail.admin_order_moderation_failed(order, g.user, form.reason.data)
				flash(u'Пользователь уведомлен', 'success')
			return redirect(url_for('.orders_info', id=order.id))
	return render_template('admin/orders-info.html', order=order, form=form)
def users_info_password_change(id):
	user = do_or_abort(a.users.get_user_by_id, id)
	form = forms.AdminPasswordChangeForm(request.form)
	if request.method == 'POST' and form.validate():
		a.users.update_user(user.id, password_hash=gen.generate_password_hash(form.password.data))
		flash(u'Пароль пользователя успешно изменен', 'success')
		return redirect(url_for('.users_info', id=user.id))
	return render_template('admin/users-info-password-change.html', user=user, form=form)
def users_developers():
	role = 'DEVELOPER'
	page = convert.to_int(request.args.get('page'), 1)
	count = a.users.get_users_count(role=role)
	per_page = app.config.get('ADMIN_USERS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	usrs = do_or_abort(a.users.get_users, role=role, offset=offset, limit=limit, full=True)
	return render_template('admin/users-developers.html', developers=usrs, pages=pages)
def confirm(id, code):
	user = do_or_abort(users.get_user_by_id, id)
	success = False
	if user.check_confirm_code(code):
		users.confirm_user(user.id)
		mmail.lists_add_user(user)
		success = True
	return render_template('site/confirm.html', success=success)
def apps():
	page = convert.to_int(request.args.get('page'), 1)
	count = actions.apps.get_apps_count(user_id=g.user.id)
	per_page = app.config.get('ADMIN_APPS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	aps = do_or_abort(actions.apps.get_apps, user_id=g.user.id,
					offset=offset, limit=limit, full=True)
	return render_template('cabinet/apps.html', apps=aps, pages=pages)
def orders_info_banners_delete(id, bid):
	order = do_or_abort(actions.orders.get_order, id, full=True)
	if order.user.id != g.user.id or not order.is_banner(): abort(404)
	if bid not in [banner.id for banner in order.banners]: abort(404)
	if len(order.banners) <= 1: abort(403)
	
	actions.orders.delete_order_banner(id, bid)
	flash(u'Баннер удален', 'success')
	return redirect(url_for('.orders_info_banners', id=order.id))
def users_info_delete_withdrawal(id, wid):
	user = do_or_abort(a.users.get_user_by_id, id)
	form = forms.WithdrawalDeleteForm(request.form)
	if form.validate():
		a.users.delete_user_withdrawal(user.id, wid, form.reason.data)
		flash(u'Выплата разработчику отменена', 'success')
	else:
		flash(u'При выплате разработчику произошла ошибка', 'error')
	return redirect(url_for('.users_info_balance', id=user.id))
def users_info_orders(id):
	user = do_or_abort(a.users.get_user_by_id, id)
	if not user.is_customer(): abort(404)
	
	page = convert.to_int(request.args.get('page'), 1)
	count = a.orders.get_orders_count(user_id=user.id)
	per_page = app.config.get('ADMIN_ORDERS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	ods = a.orders.get_orders(user_id=user.id, offset=offset, limit=limit, full=True)
	return render_template('admin/users-info-orders.html', user=user, orders=ods, pages=pages)
def apps():
	page = convert.to_int(request.args.get('page'), 1)
	form = forms.AppsShowDeletedForm(request.form, show=session.get(SESSION_APPS_SHOW_DELETED, False))
	if request.method == 'POST' and form.validate():
		session[SESSION_APPS_SHOW_DELETED] = form.show.data
		page = 1
	
	count = a.apps.get_apps_count(form.show.data)
	per_page = app.config.get('ADMIN_APPS_PER_PAGE', 20)
	offset, limit, pages = paginate(page, count, per_page)
	aps = do_or_abort(a.apps.get_apps, with_deleted=form.show.data,
					offset=offset, limit=limit, full=True)
	return render_template('admin/apps.html', apps=aps, pages=pages, form=form)
def users_register_customer():
	form = forms.CustomerRegisterForm(request.form)
	if request.method == 'POST' and form.validate():
		do_or_abort(a.users.add_user,
			email=form.email.data,
			password_hash=gen.generate_password_hash(form.password.data),
			first_name=form.first_name.data,
			last_name=form.last_name.data,
			organization=form.organization.data,
			phone=form.phone.data,
			messenger_type=form.messenger_type.data,
			messenger_uid=form.messenger_uid.data)
		user = do_or_abort(a.users.get_user_by_email, form.email.data, full=True)
		if user:
			a.users.confirm_user(user.id)
			a.users.add_user_role(user.id, roles.CUSTOMER)
			user.roles.append(roles.CUSTOMER)
			flash(u'Рекламодатель успешно зарегистрирован', 'success')
			mmail.lists_add_user(user)
			return redirect(url_for('.users_info', id=user.id))
		flash(u'Произошла ошибка при регистрации. Обратитесь к администрации.', 'error')
	
	return render_template('admin/users-register-customer.html', form=form)
def orders_info_banners(id):
	order = do_or_abort(actions.orders.get_order, id, full=True)
	if order.user.id != g.user.id or not order.is_banner(): abort(404)
	
	order_sizes = [banner.size.id for banner in order.banners]
	all_sizes = actions.bannersizes.get_banner_sizes()
	size_choices = [(s.id, '{0} x {1}'.format(s.width, s.height)) for s in all_sizes if s.id not in order_sizes]
	
	if size_choices:
		form = forms.BannerForm(request.form)
		form.size.choices = size_choices
		if request.method == 'POST' and form.validate():
			actions.orders.add_order_banner(order.id, form.size.data, form.image.mime_type,
				base64.encodestring(request.files['image'].stream.read()))
			flash(u'Баннер успешно загружен', 'success')
			return redirect(url_for('.orders_info_banners', id=order.id))
	else:
		form = None
	
	return render_template('cabinet/orders-info-banners.html', order=order, form=form)
def apps_info_edit(id):
	app = do_or_abort(a.apps.get_app, id, full=True)
	form = forms.AdminAppEditForm(request.form, apptitle=app.title, appurl=app.url, 
		appplatform=app.platform, appdeleted=app.deleted, appd=app.d, appt=app.t)
	if request.method == 'POST' and form.validate():
		kwargs = dict()
		if form.apptitle.data != app.title: kwargs.update(title=form.apptitle.data)
		if form.appurl.data != app.url: kwargs.update(url=form.appurl.data, callback=form.appurl.data)
		if form.appplatform.data != app.platform: kwargs.update(platform=form.appplatform.data)
		if float(form.appd.data) != app.d: kwargs.update(d=form.appd.data)
		if float(form.appt.data) != app.t: kwargs.update(t=form.appt.data)
		if form.appdeleted.data != app.deleted: kwargs.update(deleted=form.appdeleted.data)
		
		if kwargs.keys():
			a.apps.update_app(app.id, **kwargs)
			flash(u'Приложение успешно обновлено', u'success')
		else:
			flash(u'Вы не изменили ни одного поля', u'warning')
		return redirect(url_for('.apps_info', id=app.id))
	
	return render_template('admin/apps-info-edit.html', app=app, form=form)
def users_info(id):
	user = do_or_abort(a.users.get_user_by_id, id)
	form = forms.UserBlockForm(request.form)
	if request.method == 'POST':
		if not user.blocked and form.validate():
			a.users.block_user(user.id)
			user_info = UserInfo.query.get_or_create(user_id=user.id)
			user_info.block_reason = form.reason.data
			user_info.block_date = datetime.now()
			user_info.save()
			if form.mail.data:
				tmail.user_blocked(user, form.reason.data)
			tmail.admin_user_blocked(user, g.user, form.reason.data)
			flash(u'Учетная запись заблокирована', 'success')
			return redirect(url_for('.users_info', id=user.id))
		elif user.blocked:
			a.users.unblock_user(user.id)
			flash(u'Учетная запись разблокирована', 'success')
			return redirect(url_for('.users_info', id=user.id))
	
	return render_template('admin/users-info.html', user=user, form=form)
def orders_info_balance(id):
	order = do_or_abort(actions.orders.get_order, id, full=True)
	if order.user.id != g.user.id: abort(404)
	other_orders = [ord for ord in actions.orders.get_orders(user_id=g.user.id) if ord.id != order.id]
	order_choices = [(ord.account.id, ord.title) for ord in other_orders]
	
	form_in = forms.BalanceForm()
	form_out = forms.BalanceForm()
	form_transfer = forms.OrderBalanceTransferForm()
	form_transfer.order.choices = order_choices
	
	if request.method == 'POST':
		type = request.form.get('type', 'in')
		if type == 'in':
			form_in = forms.BalanceForm(request.form)
			if form_in.validate():
				actions.accounts.transfer(g.user.customer_account.id, order.account.id, form_in.amount.data)
				flash(u'Счет заказа успешно пополнен', 'success')
				return redirect(url_for('.orders_info', id=order.id))
		elif type == 'out':
			form_out = forms.BalanceForm(request.form)
			if form_out.validate():
				actions.accounts.transfer(order.account.id, g.user.customer_account.id, form_out.amount.data)
				flash(u'Средства успешно выведены со счета заказа', 'success')
				return redirect(url_for('.orders_info', id=order.id))
		elif type == 'transfer':
			form_transfer = forms.OrderBalanceTransferForm(request.form)
			form_transfer.order.choices = order_choices
			if form_transfer.validate():
				actions.accounts.transfer(order.account.id, form_transfer.order.data, form_transfer.amount.data)
				flash(u'Средства успешно переведены', 'success')
				return redirect(url_for('.orders_info', id=order.id))
		else:
			flash(u'Ошибка операции со счетом', 'error')
			return redirect(url_for('.orders_info', id=order.id))
	
	return render_template('cabinet/orders-info-balance.html', order=order,
			form_in=form_in, form_out=form_out, form_transfer=form_transfer)
def users_info_edit(id):
	user = do_or_abort(a.users.get_user_by_id, id)
	form_args = dict(
		first_name = user.first_name,
		last_name = user.last_name,
		phone = user.phone,
		organization = user.organization,
		messenger_type = user.messenger_type,
		messenger_uid = user.messenger_uid,
		email = user.email,
		confirmed = user.confirmed
	)
	if user.is_customer():
		form = forms.AdminCustomerEditForm(request.form, **form_args)
	else:
		form = forms.AdminDeveloperEditForm(request.form, **form_args)
	form.user = user
	
	if request.method == 'POST' and form.validate():
		upd_args = dict()
		if form.first_name.data != user.first_name: upd_args.update(first_name=form.first_name.data)
		if form.last_name.data != user.last_name: upd_args.update(last_name=form.last_name.data)
		if form.organization.data != user.organization: upd_args.update(organization=form.organization.data)
		if form.phone.data != user.phone: upd_args.update(phone=form.phone.data)
		if form.messenger_type.data != user.messenger_type or form.messenger_uid.data != user.messenger_uid:
			upd_args.update(messenger_type=form.messenger_type.data, messenger_uid=form.messenger_uid.data)
		if form.email.data != user.email: upd_args.update(email=form.email.data)
		if form.confirmed.data != user.confirmed: upd_args.update(confirmed=form.confirmed.data)
		if upd_args.keys():
			a.users.update_user(user.id, **upd_args)
			flash(u'Профиль успешно изменен', 'success')
		else:
			flash(u'Вы не изменили ни одного поля', 'warning')
		return redirect(url_for('.users_info', id=user.id))
	
	return render_template('admin/users-info-edit.html', user=user, form=form)
def orders_info(id):
	order = do_or_abort(actions.orders.get_order, id, full=True)
	if order.user.id != g.user.id: abort(404)
	return render_template('cabinet/orders-info.html', order=order)
def ajax_orders_info_pause(id):
	order = do_or_abort(actions.orders.get_order, id, full=True)
	if order.user.id != g.user.id: abort(404)
	do_or_abort(actions.orders.pause_order, order.id)
	return 'OK'
def ajax_apps_info_stats_ctr(id):
	app = do_or_abort(actions.apps.get_app, id, full=True)
	if app.user.id != g.user.id: abort(404)
	return json_get_ctr(app_id=app.id)