diff --git a/app/__init__.py b/app/__init__.py index e3e28c8..346af72 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,6 +3,7 @@ # import ConfigParser from flask import g from flask import Flask +from flask import session from flask import request from flask import render_template from flask_babel import Babel @@ -10,6 +11,7 @@ from flaskext.markdown import Markdown from app.cloud.views import viewHomepage from app.cloud.views.documents import viewDocuments +from app.cloud.views.settings import viewSettings from app.cloud.views.kb import viewKB from app.cloud.views.support import viewSupport from app.cloud.views.account import viewAccount @@ -47,29 +49,30 @@ app.register_blueprint(viewAccount) app.register_blueprint(viewPayments) # /api app.register_blueprint(viewServerAPI) +app.register_blueprint(viewSettings) # /administrator app.register_blueprint(viewAdministrator) @app.errorhandler(404) def page_not_found(e): - return render_template('errors/404.html'), 404 + return render_template('default/errors/404.html'), 404 @app.errorhandler(403) def page_not_found(e): - return render_template('errors/403.html'), 403 + return render_template('default/errors/403.html'), 403 @app.errorhandler(410) def page_not_found(e): - return render_template('errors/410.html'), 410 + return render_template('default/errors/410.html'), 410 @app.errorhandler(500) def page_not_found(e): print e - return render_template('errors/500.html'), 500 + return render_template('default/errors/500.en.html'), 500 @app.before_request @@ -85,7 +88,7 @@ def before_request(): print e print request.path # g.endpoint = request.endpoint.replace('.', '/') - return render_template('errors/500.html'), 500 + return render_template('default/errors/500.en.html'), 500 # извлекаем настройки и определяем их в глобальную переменную for setting in models.Settings.select(models.Settings.key, models.Settings.val).execute(): diff --git a/app/cdn/__init__.py b/app/cdn/__init__.py new file mode 100644 index 0000000..089ed36 --- /dev/null +++ b/app/cdn/__init__.py @@ -0,0 +1 @@ +__author__ = 'vanzhiganov' diff --git a/app/cloud/views/account/__init__.py b/app/cloud/views/account/__init__.py index 773f006..7f5e008 100644 --- a/app/cloud/views/account/__init__.py +++ b/app/cloud/views/account/__init__.py @@ -4,6 +4,7 @@ from sshpubkeys import SSHKey from flask import render_template, session, redirect, url_for, request from flask import g from flask import Blueprint +# from flask.ext.babel import gettext from app import models from app.cloud.controllers.common import special_match from app.cloud.controllers.common import ControllerMessagesEmail @@ -17,116 +18,6 @@ from app.cloud.controllers.billing import ControllerBilling viewAccount = Blueprint('account', __name__, url_prefix='/account') -@viewAccount.route('/', methods=['GET', 'POST']) -def index(): - # check session - if not ControllerUsers().check_session(): - return redirect(url_for("account.logout")) - # auth user - if not ControllerUsers().auth(session['email'], session['password']): - return redirect(url_for("account.logout")) - - cud = ControllerUsersDetails(session['user_id']) - user = cud.details_get() - - # проверяем, есть ли запись в таблице usersdetails, чтобы небыло ошибок - if not cud.details_exists(): - # если нет, то делаем запись в таблицу, чтобы небыло ошибок - cud.details_create() - - # извлекаем из базы детали пользователя - user_details = cud.details_get() - - return render_template( - 'default/id/index.html', - user=user, - user_details=user_details - ) - - -@viewAccount.route('/edit', methods=['GET', 'POST']) -def edit(): - # check session - if not ControllerUsers().check_session(): - return redirect(url_for("account.logout")) - # auth user - if not ControllerUsers().auth(session['email'], session['password']): - return redirect(url_for("account.logout")) - - cud = ControllerUsersDetails(session['user_id']) - user = cud.details_get() - - if not cud.details_exists(): - cud.details_create() - - if request.method == "POST": - if not request.form['zipcode'].isdigit(): - g.errors['items'].append(u'Индекс должен содержать только цифры') - g.errors['total'] += 1 - - if g.errors['total'] == 0: - cud.details_update( - fname=request.form['fname'], - lname=request.form['lname'], - address=request.form['address'], - city=request.form['city'], - country=request.form['country'], - state=request.form['state'], - zipcode=request.form['zipcode'] - ) - return redirect(url_for('account.edit')) - # get user details - user_details = cud.details_get() - - return render_template('default/id/edit.html', user=user, user_details=user_details) - - -@viewAccount.route('/settings', methods=['GET', 'POST']) -def settings(): - # check session - if not ControllerUsers().check_session(): - return redirect(url_for("account.logout")) - # auth user - if not ControllerUsers().auth(session['email'], session['password']): - return redirect(url_for("account.logout")) - # get user data - user = ControllerUsers(session['user_id']).get() - - return render_template('default/id/index.html', user_details=user) - - -@viewAccount.route('/billing', methods=['GET', 'POST']) -def billing(): - # check session - if not ControllerUsers().check_session(): - return redirect(url_for("account.logout")) - # auth user - if not ControllerUsers().auth(session['email'], session['password']): - return redirect(url_for("account.logout")) - - user_id = session['user_id'] - - if models.UsersBalance.select().where(models.UsersBalance.user == user_id).count() == 0: - models.UsersBalance.create(user=user_id, balance=10) - user_balance = models.UsersBalance.select().where(models.UsersBalance.user == user_id).limit(1)[0].balance - - user_details = models.Users.select().where(models.Users.id == session['user_id']).limit(1)[0] - - # выгрузка истории платежей - history = dict() - history['total'] = models.UsersBalanceTransactions.select().\ - where(models.UsersBalanceTransactions.user == user_id).count() - history['items'] = models.UsersBalanceTransactions.select().\ - where(models.UsersBalanceTransactions.user == user_id) - - return render_template( - 'default/id/balance.html', - user_details=user_details, - user_balance=user_balance, - history=history - ) - - @viewAccount.route('/registration', methods=['GET', 'POST']) def registration(): # check session @@ -158,21 +49,15 @@ def registration(): # ControllerU # send mail message with recovery code message = u""" - Е-почта: %s - Пароль: %s + Email: %s + Password: %s """ % (request.form['email'], request.form['password']) - subject = u'GoCloud.ru: Успешная регистрация' - lead = u""" - Поздравляем с успешной зарегистрацией. - """ - callout = u""" - Для входа в личный кабинет воспользуйтесь - страницей авторизации. - """ + subject = u'Puluttar.ru: Successful registration' + lead = u'Congratulations upon successful registration.' + callout = u'Use the login page to enter your account.' email = ControllerMessagesEmail() email.send(title=subject, to=request.form['email'], lead=lead, message=message, callout=callout) - # redirect to login page return redirect(url_for('account.login')) else: @@ -232,13 +117,13 @@ def password_reset(): ControllerUsersRecoveryCodes().create(user_id, recovery_code) # send mail message with recovery code - subject = u'GoCloud.ru: Код восстановления доступа' - message = u'Код восстановления: %s' % recovery_code + subject = u'Puluttar.com: Access recovery code' + message = u'Recovery code: %s' % recovery_code lead = u""" - Данный код необходимо ввести на странице подтверждения - сброса пароля. + This verification code is required to confirm the + password reset. """ - callout = u'Если вы не хотите сбрасывать пароль, то просто проигнорируйте (или удалите) данное письмо.' + callout = u'If you do not want to reset your password, just ignore (or remove) the letter.' # controllers.Mail().send(request.form['email'], subject, message) email = ControllerMessagesEmail() @@ -247,7 +132,7 @@ def password_reset(): # redirect to step 2 return redirect(url_for('account.password_reset_step2')) else: - g.errors['items'].append(u'Произошла ошибка. Введите корректный адрес е.почты.') + g.errors['items'].append(u'An error has occurred. Please enter a valid email address.') g.errors['total'] += 1 return render_template('default/id/password_reset_step1.html') @@ -273,25 +158,25 @@ def password_reset_step2(): ControllerUsers().update(user_id, password=new_password) # send mail message with new password - message = u"""Новый пароль: %s""" % new_password - subject = u"""GoCloud.ru: Новый пароль""" + message = u"""New password: %s""" % new_password + subject = u"""Puluttar.com: New password""" lead = u""" - Пароль для доступа в a< href="https://gocloud.ru/account/login">личный кабинет был сброшен. + Old password for your < href="http://puluttar.com/account/login">account was reset. """ - callout = u"""Запомните новый пароль и удалите данное сообщение.""" + callout = u"""Remember the new password and delete this message.""" # controllers.Mail().send(request.form['email'], subject, message) email = ControllerMessagesEmail() - email.send(title=subject, to=session['email'], lead=lead, message=message, callout=callout) + email.send(title=subject, to=request.form['email'], lead=lead, message=message, callout=callout) # redirect to login page return redirect(url_for('account.login')) # redirect to step 2 - g.errors['items'].append(u'Ошибочный код') + g.errors['items'].append(u'Wrong recovery code.') g.errors['total'] += 1 return redirect(url_for('account.password_reset_step2')) else: - g.errors['items'].append(u'Произошла ошибка. Введите корректный адрес е.почты.') + g.errors['items'].append(u'An error has occurred. Please enter a valid email address.') g.errors['total'] += 1 return render_template('default/id/password_reset_step2.html') @@ -319,12 +204,11 @@ def password_update(): # send mail message with recovery code lead = u""" - Пароль для достуна в личный кабинет был успешно изменён. + Password to access your account has been successfully changed. """ message = u"""Пароль: %s""" % request.form['new_password'] - callout = u""" - """ - subject = u'GoCloud.ru: Смена пароля' + callout = u'' + subject = u'Puluttar.com: Change Password' email = ControllerMessagesEmail() email.send( @@ -354,7 +238,7 @@ def sshkey(): try: ssh = SSHKey(request.form['sshkey']) except Exception as e: - g.errors['items'].append(u"Не корректный ssh-ключ.") + g.errors['items'].append(u"Incorrect ssh-key.") g.errors['total'] += 1 else: print(ssh.bits) diff --git a/app/cloud/views/api/__init__.py b/app/cloud/views/api/__init__.py index 931c45d..b783993 100644 --- a/app/cloud/views/api/__init__.py +++ b/app/cloud/views/api/__init__.py @@ -15,10 +15,11 @@ from flask import Blueprint from app import models from app.settings import settings from app.cloud.controllers.users import ControllerUsers +from app.cloud.controllers.users import ControllerSSHKey +from app.cloud.controllers.billing import ControllerBilling from app.cloud.controllers.users import ControllerAPI from app.cloud.controllers.datacenters import ControllerDataCenters from app.cloud.controllers.containers import ControllerContainers -from cloudnsru import CloudnsClient viewAPI = Blueprint('api', __name__, url_prefix='/api') diff --git a/app/cloud/views/containers/__init__.py b/app/cloud/views/containers/__init__.py index 32150fd..aa227e5 100644 --- a/app/cloud/views/containers/__init__.py +++ b/app/cloud/views/containers/__init__.py @@ -61,14 +61,11 @@ def create(): if g.errors['total'] == 0: # select server from selected region with available ip-addresses - + # TODO: make function... this part use in API method # select IP select_ip = models.Ips.select().where( models.Ips.datacenter == request.form['datacenter'] and models.Ips.status == 0 )[0] - - print 'select ip: %s' % select_ip.id - # mark ip as busy (taken) up = models.Ips.update(status=1).where(models.Ips.id == select_ip.id) up.execute() @@ -139,12 +136,9 @@ def create(): message_parts.append(u"SSH ключ: добавлен") message = '
\n'.join(message_parts) - subject = u'GoCloud.ru: Новый контейнер' - lead = u"""Поздравляем с новым контейнером.""" - callout = u""" - Для входа в личный кабинет воспользуйтесь - страницей авторизации. - """ + subject = u'Puluttar.com: New continer' + lead = u"""Congratulations on the new container.""" + callout = u"""Account.""" user_data = ControllerUsers(session['user_id']).get() diff --git a/app/cloud/views/payments/__init__.py b/app/cloud/views/payments/__init__.py index bc6e123..29f45dc 100644 --- a/app/cloud/views/payments/__init__.py +++ b/app/cloud/views/payments/__init__.py @@ -11,6 +11,7 @@ from flask import Blueprint from app import models from app.cloud.controllers.users import ControllerUsers from app.cloud.controllers.payments import ControllerPaymentsRobokassa +from app.cloud.controllers.payments import twocheckout viewPayments = Blueprint('payments', __name__, url_prefix='/payments') @@ -113,3 +114,38 @@ def robokassa(action): return redirect(url_for('payments.robokassa', action='fail')) return render_template('default/payment/robokassa/fail.html') + + +@viewPayments.route('/twocheckout/order', methods=['POST']) +def twocheckout_order(): + # Setup credentials and environment + twocheckout.Api.auth_credentials({ + 'private_key': 'sandbox-private-key', + 'seller_id': 'sandbox-seller_id', + 'mode': 'sandbox' + }) + + # Setup arguments for authorization request + args = { + 'merchantOrderId': '123', + 'token': request.form["token"], + 'currency': 'USD', + 'total': '1.00', + 'billingAddr': { + 'name': 'Testing Tester', + 'addrLine1': '123 Test St', + 'city': 'Columbus', + 'state': 'OH', + 'zipCode': '43123', + 'country': 'USA', + 'email': 'example@2co.com', + 'phoneNumber': '555-555-5555' + } + } + + # Make authorization request + try: + result = twocheckout.Charge.authorize(args) + return result.responseMsg + except twocheckout.TwocheckoutError as error: + return error.msg \ No newline at end of file diff --git a/app/cloud/views/settings/__init__.py b/app/cloud/views/settings/__init__.py new file mode 100644 index 0000000..bd85084 --- /dev/null +++ b/app/cloud/views/settings/__init__.py @@ -0,0 +1,136 @@ +# coding: utf-8 + +from sshpubkeys import SSHKey +from flask import render_template, session, redirect, url_for, request +from flask import g +from flask import Blueprint +from app import models +from app.cloud.controllers.common import special_match +from app.cloud.controllers.common import ControllerMessagesEmail +from app.cloud.controllers.users import ControllerUsers +from app.cloud.controllers.users import ControllerAPI +from app.cloud.controllers.users import ControllerSSHKey +from app.cloud.controllers.users import ControllerUsersDetails +from app.cloud.controllers.users import ControllerUsersRecoveryCodes +from app.cloud.controllers.billing import ControllerBilling + +viewSettings = Blueprint('settings', __name__, url_prefix='/settings') + + +@viewSettings.route('/', methods=['GET', 'POST']) +def index(): + return redirect(url_for('settings.billing')) + + +@viewSettings.route('/billing') +def billing(): + # check session + if not ControllerUsers().check_session(): + return redirect(url_for("account.logout")) + # auth user + if not ControllerUsers().auth(session['email'], session['password']): + return redirect(url_for("account.logout")) + + user_id = session['user_id'] + + if models.UsersBalance.select().where(models.UsersBalance.user == user_id).count() == 0: + models.UsersBalance.create(user=user_id, balance=10) + user_balance = models.UsersBalance.select().where(models.UsersBalance.user == user_id).limit(1)[0].balance + + user_details = models.Users.select().where(models.Users.id == session['user_id']).limit(1)[0] + + # выгрузка истории платежей + history = dict() + history['total'] = models.UsersBalanceTransactions.select().\ + where(models.UsersBalanceTransactions.user == user_id).count() + history['items'] = models.UsersBalanceTransactions.select().\ + where(models.UsersBalanceTransactions.user == user_id).order_by(models.UsersBalanceTransactions.id.desc()) + + return render_template( + 'default/settings/billing/index.html', + user_details=user_details, + user_balance=user_balance, + history=history + ) + + +@viewSettings.route('/profile') +def profile(): + # check session + if not ControllerUsers().check_session(): + return redirect(url_for("account.logout")) + # auth user + if not ControllerUsers().auth(session['email'], session['password']): + return redirect(url_for("account.logout")) + + cud = ControllerUsersDetails(session['user_id']) + user = cud.details_get() + + # проверяем, есть ли запись в таблице usersdetails, чтобы небыло ошибок + if not cud.details_exists(): + # если нет, то делаем запись в таблицу, чтобы небыло ошибок + cud.details_create() + + # извлекаем из базы детали пользователя + user_details = cud.details_get() + + return render_template( + 'default/settings/profile/index.html', + user=user, + user_details=user_details + ) + + +@viewSettings.route('/profile_edit') +def profile_edit(): + # check session + if not ControllerUsers().check_session(): + return redirect(url_for("account.logout")) + # auth user + if not ControllerUsers().auth(session['email'], session['password']): + return redirect(url_for("account.logout")) + + cud = ControllerUsersDetails(session['user_id']) + user = cud.details_get() + + if not cud.details_exists(): + cud.details_create() + + if request.method == "POST": + if not request.form['zipcode'].isdigit(): + g.errors['items'].append(u'ZIP code must contain only digits.') + g.errors['total'] += 1 + + if g.errors['total'] == 0: + cud.details_update( + fname=request.form['fname'], + lname=request.form['lname'], + address=request.form['address'], + city=request.form['city'], + country=request.form['country'], + state=request.form['state'], + zipcode=request.form['zipcode'] + ) + return redirect(url_for('account.edit')) + # get user details + user_details = cud.details_get() + return render_template( + 'default/settings/profile/edit.html', + user=user, + user_details=user_details + ) + + +@viewSettings.route('/security') +def security(): + return render_template('default/settings/security/index.html') + + +@viewSettings.route('/notifications') +def notifications(): + return render_template('default/settings/security/index.html') + + +@viewSettings.route('/team') +def team(): + return render_template('default/settings/team/index.html') diff --git a/app/cloud/views/support/__init__.py b/app/cloud/views/support/__init__.py index 93b208a..0ec5032 100644 --- a/app/cloud/views/support/__init__.py +++ b/app/cloud/views/support/__init__.py @@ -40,7 +40,7 @@ def index(): # send mail message with recovery code subject = ticket_title message = ticket_message - lead = u'Отправитель: %s' % ticket_email + lead = u'Sender: %s' % ticket_email callout = u'' email = ControllerMessagesEmail() diff --git a/app/dns/__init__.py b/app/dns/__init__.py new file mode 100644 index 0000000..089ed36 --- /dev/null +++ b/app/dns/__init__.py @@ -0,0 +1 @@ +__author__ = 'vanzhiganov' diff --git a/app/static/css/gocloud.css b/app/static/css/app.css similarity index 79% rename from app/static/css/gocloud.css rename to app/static/css/app.css index 24bd5ce..d7b2955 100644 --- a/app/static/css/gocloud.css +++ b/app/static/css/app.css @@ -12,7 +12,8 @@ header { padding: 4em 0em 5em; background: #202020 none repeat scroll 0% 0% / cover; background-position: - color: rgba(255, 255, 255, 0.8) + color: rgba(255, 255, 255, 0.8); + background: transparent url(/static/images/promo/bg2.png) repeat-x scroll 0% 0%; } #banner p { @@ -68,3 +69,12 @@ ul#paymentlist li img { margin-top: 15px; margin-bottom: 15px; } + +ul#features-list { + /* list-style: none; */ + font-size: 1.5em; +} +ul#features-list li { + font-family: 'Clear sans'; + margin-left: 15px; +} \ No newline at end of file diff --git a/app/static/css/hp.css b/app/static/css/hp.css deleted file mode 100644 index 44a0078..0000000 --- a/app/static/css/hp.css +++ /dev/null @@ -1,29 +0,0 @@ -#logo { - margin-top: 15px; - margin-bottom: 15px; -} - -footer { - margin-top: 30px; -} - -.top-bar { - background: none repeat scroll 0% 0% #371A5B; -} - -.top-bar-section ul li { - /*background: none repeat scroll 0% 0% #371A5B;*/ -} - -.top-bar-section li:not(.has-form) a:not(.button) { - background: none repeat scroll 0% 0% #371A5B; -} - -.top-bar-section li:hover(.has-form) a:hover(.button) { - /*background: none repeat scroll 0% 0% #371A5B;*/ -} - - -.top-bar-section ul li { - background: none repeat scroll 0% 0% #371A5B; -} diff --git a/app/static/css/normalize.css b/app/static/css/normalize.css deleted file mode 100644 index 458eea1..0000000 --- a/app/static/css/normalize.css +++ /dev/null @@ -1,427 +0,0 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ - -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} diff --git a/app/static/css/style.css b/app/static/css/style.css deleted file mode 100644 index 44a0078..0000000 --- a/app/static/css/style.css +++ /dev/null @@ -1,29 +0,0 @@ -#logo { - margin-top: 15px; - margin-bottom: 15px; -} - -footer { - margin-top: 30px; -} - -.top-bar { - background: none repeat scroll 0% 0% #371A5B; -} - -.top-bar-section ul li { - /*background: none repeat scroll 0% 0% #371A5B;*/ -} - -.top-bar-section li:not(.has-form) a:not(.button) { - background: none repeat scroll 0% 0% #371A5B; -} - -.top-bar-section li:hover(.has-form) a:hover(.button) { - /*background: none repeat scroll 0% 0% #371A5B;*/ -} - - -.top-bar-section ul li { - background: none repeat scroll 0% 0% #371A5B; -} diff --git a/app/templates/default/_footer.html b/app/templates/default/_footer.html index 73ae6b5..fd2b8c5 100644 --- a/app/templates/default/_footer.html +++ b/app/templates/default/_footer.html @@ -2,21 +2,15 @@

- GoCloud © Все права защищены. + {{ _("Puluttar © All rights reserved.") }}

-
-

Документы

- -
-
-

Поддержка

-
diff --git a/app/templates/default/_header.html b/app/templates/default/_header.html index c6b4326..84addc7 100644 --- a/app/templates/default/_header.html +++ b/app/templates/default/_header.html @@ -5,28 +5,26 @@