From ec3b775cd8e718dc283d50eeca8a6e63bb18ebbf Mon Sep 17 00:00:00 2001 From: deflax Date: Sun, 25 Jun 2017 17:11:52 +0300 Subject: [PATCH] template fixes --- app/admin/routes.py | 7 ++-- app/auth/routes.py | 30 ++++++++--------- app/models.py | 5 ++- app/settings/forms.py | 34 +++++++++----------- app/settings/routes.py | 6 +--- app/static/css/style.css | 2 +- app/static/images/datapoint-simple-logo.png | Bin 0 -> 4117 bytes app/templates/admin/list_items.html | 14 +++++--- app/templates/admin/list_users.html | 2 +- app/templates/base.html | 2 +- app/templates/footer_colored.html | 8 ----- app/templates/main/footer_colored.html | 8 +++++ app/templates/{ => main}/footer_index.html | 0 app/templates/{ => main}/footer_simple.html | 0 app/templates/main/index.html | 6 ++-- app/templates/nav.html | 2 +- app/templates/settings/acc_avatar.html | 9 +++--- app/templates/settings/profile.html | 9 ------ app/templates/uinvoice/transactions.html | 22 +++++++++++-- app/uinvoice/routes.py | 4 +-- 20 files changed, 86 insertions(+), 84 deletions(-) create mode 100644 app/static/images/datapoint-simple-logo.png delete mode 100644 app/templates/footer_colored.html create mode 100644 app/templates/main/footer_colored.html rename app/templates/{ => main}/footer_index.html (100%) rename app/templates/{ => main}/footer_simple.html (100%) diff --git a/app/admin/routes.py b/app/admin/routes.py index 88c41f5..2d2e7ad 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -38,8 +38,8 @@ def index(): @login_required @admin_required def list_items(): - alldeployments = Deployment.query.order_by(Deployment.user_id.desc()).all() - alldomains = Domain.query.order_by(Domain.user_id.desc()).all() + alldeployments = Deployment.query.order_by(Deployment.date_last_charge.asc()).all() + alldomains = Domain.query.order_by(Domain.date_expire.asc()).all() allservices = Service.query.order_by(Service.date_last_charge.asc()).all() alladdresses = Address.query.order_by(Address.user_id.asc()).all() return render_template('admin/list_items.html', deployments=alldeployments, domains=alldomains, services=allservices, addresses=alladdresses) @@ -124,7 +124,6 @@ def dashboard(user_pid=0): flash('Deploy #{} unreachable. Support is notified'.format(str(cubeid))) send_email(current_app.config['MAIL_USERNAME'], 'Cube {} is unreachable'.format(cubeid), 'vmanager/email/adm_unreachable', user=cuser, cubeid=cubeid ) - current_app.logger.info('[{}] deployments: {}, services: {}, domains: {}, services: {}'.format(cuser.email, inv_deploynames, inv_services, inv_domains, inv_addresses )) return render_template('vmanager/dashboard.html', rrd=rrd, status=statuses, inv_deployments=deployments, inv_services=services, inv_domains=domains, inv_addresses=addresses) @@ -155,5 +154,5 @@ def transaction(user_pid=0): translist.insert(0, 0) #current_app.logger.info('[{}] transactions: {} {} '.format(cuser.email, translist, labelslist)) - return render_template('uinvoice/transactions.html', transactions=transactions, translist=translist, labelslist=labelslist) + return render_template('uinvoice/transactions.html', transactions=transactions, translist=translist, labelslist=labelslist, cuser=cuser) diff --git a/app/auth/routes.py b/app/auth/routes.py index e28d5a5..54742ef 100644 --- a/app/auth/routes.py +++ b/app/auth/routes.py @@ -10,6 +10,20 @@ from .forms import LoginForm, TwoFAForm, RegistrationForm, ChangePasswordForm,Pa from io import BytesIO import pyqrcode +def get_google_auth(state=None, token=None): + if token: + return OAuth2Session(current_app.config['CLIENT_ID'], token=token) + if state: + return OAuth2Session( + current_app.config['CLIENT_ID'], + state=state, + redirect_uri=current_app.config['REDIRECT_URI']) + oauth = OAuth2Session( + current_app.config['CLIENT_ID'], + redirect_uri=current_app.config['REDIRECT_URI'], + scope=current_app.config['SCOPE']) + return oauth + @auth.before_app_request def before_request(): #print('session: %s' % str(session)) @@ -27,7 +41,6 @@ def unconfirmed(): return redirect(url_for('main.index')) return render_template('auth/unconfirmed.html') - @auth.route('/login', methods=['GET', 'POST']) def login(): page = { 'title': 'Login' } @@ -71,10 +84,8 @@ def twofactor(): abort(404) if 'memberberry' not in session: abort(404) - page = { 'title': '2-Factor Login' } form = TwoFAForm() - if form.validate_on_submit(): user = User.query.filter_by(email=session['email']).first() del session['email'] @@ -97,8 +108,6 @@ def twofactor(): flash('Invalid token.') return render_template('auth/2fa.html', page=page, form=form) - - @auth.route('/qrcode') @login_required def qrcode(): @@ -121,7 +130,6 @@ def qrcode(): 'Pragma': 'no-cache', 'Expires': '0'} - @auth.route("/logout", methods=['GET']) @login_required def logout(): @@ -129,7 +137,6 @@ def logout(): flash('You have logged out') return redirect(url_for('main.index')) - @auth.route('/register', methods=['GET', 'POST']) def register(): #print(current_app.secret_key) @@ -139,14 +146,11 @@ def register(): user = User(email=form.email.data, password=form.password.data, wallet=current_app.config['REGISTER_BONUS']) db.session.add(user) db.session.commit() - transaction = Transaction(user_id=int(user.pid), description='Registered account bonus', value=current_app.config['REGISTER_BONUS']) db.session.add(transaction) db.session.commit() - token = user.generate_confirmation_token() send_email(user.email, 'Потвърдете_вашият_акаунт', 'auth/email/confirm', user=user, token=token) - #notify admin newip = request.remote_addr if request.headers.getlist("X-Forwarded-For"): @@ -158,7 +162,6 @@ def register(): return redirect(url_for('auth.login')) return render_template('auth/register.html', page=page, form=form) - @auth.route('/confirm/') @login_required def confirm(token): @@ -170,7 +173,6 @@ def confirm(token): flash('Времето за потвърждение на вашият код изтече.') return redirect(url_for('main.index')) - @auth.route('/confirm') @login_required def resend_confirmation(): @@ -180,7 +182,6 @@ def resend_confirmation(): flash('Изпратен е нов код за потвърждение..') return redirect(url_for('main.index')) - @auth.route('/change-password', methods=['GET', 'POST']) @login_required def change_password(): @@ -196,7 +197,6 @@ def change_password(): flash('Грешна парола.') return render_template("auth/change_password.html", form=form) - @auth.route('/reset', methods=['GET', 'POST']) def password_reset_request(): if not current_user.is_anonymous: @@ -215,7 +215,6 @@ def password_reset_request(): return redirect(url_for('auth.login')) return render_template('auth/reset_password.html', form=form) - @auth.route('/reset/', methods=['GET', 'POST']) def password_reset(token): if not current_user.is_anonymous: @@ -232,4 +231,3 @@ def password_reset(token): return redirect(url_for('main.index')) return render_template('auth/reset_password.html', form=form) - diff --git a/app/models.py b/app/models.py index dda0c25..dcdd6d1 100644 --- a/app/models.py +++ b/app/models.py @@ -55,6 +55,7 @@ class User(db.Model, UserMixin): email = db.Column(db.String(64), unique=True, index=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.pid')) #FK password_hash = db.Column(db.String(128)) + tokens = db.Column(db.Text) confirmed = db.Column(db.Boolean, default=False) active = db.Column(db.Boolean, default=True) @@ -75,8 +76,6 @@ class User(db.Model, UserMixin): org_companyname = db.Column(db.Unicode(64)) org_regaddress = db.Column(db.Unicode(128)) org_responsible = db.Column(db.Unicode(128)) - org_bulstat = db.Column(db.String(16)) - org_vat = db.Column(db.Boolean, default=False) org_vatnum = db.Column(db.String(16)) group = db.Column(db.String(24), default='User') @@ -245,7 +244,7 @@ class Deployment(db.Model): user_id = db.Column(db.Integer, db.ForeignKey('users.pid')) #FK date_created = db.Column(db.DateTime, index=True, default=datetime.utcnow) date_last_charge = db.Column(db.DateTime) - enabled = db.Column(db.Boolean) + enabled = db.Column(db.Boolean, default=False) machine_id = db.Column(db.BigInteger) #cubeid machine_alias = db.Column(db.String) #dns name diff --git a/app/settings/forms.py b/app/settings/forms.py index 602030a..22f9ab3 100644 --- a/app/settings/forms.py +++ b/app/settings/forms.py @@ -9,25 +9,23 @@ from wtforms import validators, ValidationError from wtforms.fields.html5 import EmailField class EditProfileForm(FlaskForm): - name = StringField('Лице за контакт:', [validators.DataRequired(), validators.Length(3, 60)]) - address = StringField('Адрес:', [validators.DataRequired(), validators.Length(2, 50)]) - city = StringField('Град:', [validators.DataRequired(), validators.Length(2,40)]) + name = StringField('Name:', [validators.DataRequired(), validators.Length(3, 60)]) + address = StringField('Address:', [validators.DataRequired(), validators.Length(2, 50)]) + city = StringField('City:', [validators.DataRequired(), validators.Length(2,40)]) - postcode = StringField('Пощенски Код:') + postcode = StringField('Postcode:') clist = [] for c in countries: clist.append((c.alpha2, c.name)) - country = SelectField('Държава:', choices=clist, default='BG') + country = SelectField('Country:', choices=clist, default='BG') - phone = StringField('Телефон:') - org_account = BooleanField('Юридическо лице') - org_companyname = StringField('Име на фирма:') - org_regaddress = StringField('Адресна регистрация:') - org_responsible = StringField('Отговорно Лице:') - org_bulstat = StringField('БУЛСТАТ:') - org_vat = BooleanField('Регистрация по ДДС') - org_vatnum = StringField('ДДС Номер:') + phone = StringField('Phone:') + org_account = BooleanField('This is a business account.') + org_companyname = StringField('Company Name:') + org_regaddress = StringField('Company Address:') + org_responsible = StringField('Accountable Person (optional):') + org_vatnum = StringField('VAT Number:') twofactor = BooleanField('2-factor authentication') submit = SubmitField('Обнови') @@ -48,12 +46,10 @@ class EditProfileAdminForm(FlaskForm): country = SelectField('Държава:', choices=clist) phone = DecimalField('Телефон:', [validators.DataRequired()]) - org_account = BooleanField('Юридическо лице') - org_companyname = StringField('Име на фирма:') - org_regaddress = StringField('Адресна регистрация:') - org_responsible = StringField('Отговорно Лице:') - org_bulstat = StringField('БУЛСТАТ:') - org_vat = BooleanField('Регистрация по ДДС') + org_account = BooleanField('This is a business account') + org_companyname = StringField('Company Name:') + org_regaddress = StringField('Company Address:') + org_responsible = StringField('Primary Contact:') org_vatnum = StringField('ДДС Номер:') twofactor = BooleanField('2-factor authentication') submit = SubmitField('Обнови') diff --git a/app/settings/routes.py b/app/settings/routes.py index 42f3ab8..aa710e7 100644 --- a/app/settings/routes.py +++ b/app/settings/routes.py @@ -27,8 +27,6 @@ def profile(): current_user.org_companyname = form.org_companyname.data current_user.org_regaddress = form.org_regaddress.data current_user.org_responsible = form.org_responsible.data - current_user.org_bulstat = form.org_bulstat.data - current_user.org_vat = form.org_vat.data current_user.org_vatnum = form.org_vatnum.data current_user.twofactor = form.twofactor.data db.session.add(current_user) @@ -45,13 +43,11 @@ def profile(): form.org_companyname.data = current_user.org_companyname form.org_regaddress.data = current_user.org_regaddress form.org_responsible.data = current_user.org_responsible - form.org_bulstat.data = current_user.org_bulstat - form.org_vat.data = current_user.org_vat form.org_vatnum.data = current_user.org_vatnum form.twofactor.data = current_user.twofactor wallet = "%.2f" % round(current_user.wallet, 3) #current_app.logger.info('[{}] wallet: {}'.format(current_user.email, wallet)) - return render_template('settings/profile.html', page=page, form=form, wallet=wallet) + return render_template('settings/profile.html', page=page, form=form, wallet=wallet, cuser=current_user) diff --git a/app/static/css/style.css b/app/static/css/style.css index e933c57..080d6bc 100644 --- a/app/static/css/style.css +++ b/app/static/css/style.css @@ -5,7 +5,7 @@ body { -moz-background-size: cover; -o-background-size: cover; padding-top: 0px; - background-color: #cccccc; + background-color: #edf0f5; background-repeat: no-repeat; background-attachment: fixed; top:0; diff --git a/app/static/images/datapoint-simple-logo.png b/app/static/images/datapoint-simple-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd8303c8fda47100065b9a9e05617679ae71130 GIT binary patch literal 4117 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 Mem HDD + Price per month Owner + Last Charged @@ -29,10 +31,12 @@ {% if deploy.enabled == True %}{% else %}{% endif %}{{ deploy.machine_id }} {{ deploy.machine_alias }} - {{ deploy.machine_cpu }} Cores + {{ deploy.machine_cpu }} c. {{ deploy.machine_mem }} MB {{ deploy.machine_hdd }} GB + {{ deploy.price }} {{ deploy.owner.email }} + {{ moment(deploy.date_last_charge).format('lll') }} ({{ moment(deploy.date_last_charge).fromNow() }}) {% endfor %} @@ -49,10 +53,10 @@ Category Description + Months Price - Period (Months) - Last Charged Owner + Last Charged @@ -60,10 +64,10 @@ {{ service.category }} {{ service.description }} - {{ service.price }} {{ service.period }} - {{ moment(service.date_last_charge).format('lll') }} + {{ service.price }} {{ service.owner.email }} + {{ moment(service.date_last_charge).format('ll') }} ({{ moment(service.date_last_charge).fromNow() }}) {% endfor %} diff --git a/app/templates/admin/list_users.html b/app/templates/admin/list_users.html index 5e12b5d..4475218 100644 --- a/app/templates/admin/list_users.html +++ b/app/templates/admin/list_users.html @@ -25,7 +25,7 @@ {{ usr.pid }} {{ usr.email }} {{ moment(usr.last_seen).format('lll') }} - {{ usr.last_ip }} + {{ usr.last_ip }} {{ usr.wallet }} diff --git a/app/templates/base.html b/app/templates/base.html index afb72c5..0d177b9 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -44,7 +44,7 @@ {% block footer %} -{% include "footer_simple.html" %} +{% include "main/footer_simple.html" %} {% endblock %} {% endblock %} diff --git a/app/templates/footer_colored.html b/app/templates/footer_colored.html deleted file mode 100644 index e7daed7..0000000 --- a/app/templates/footer_colored.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/app/templates/main/footer_colored.html b/app/templates/main/footer_colored.html new file mode 100644 index 0000000..223b8eb --- /dev/null +++ b/app/templates/main/footer_colored.html @@ -0,0 +1,8 @@ + diff --git a/app/templates/footer_index.html b/app/templates/main/footer_index.html similarity index 100% rename from app/templates/footer_index.html rename to app/templates/main/footer_index.html diff --git a/app/templates/footer_simple.html b/app/templates/main/footer_simple.html similarity index 100% rename from app/templates/footer_simple.html rename to app/templates/main/footer_simple.html diff --git a/app/templates/main/index.html b/app/templates/main/index.html index b42fd26..a689176 100644 --- a/app/templates/main/index.html +++ b/app/templates/main/index.html @@ -93,7 +93,7 @@

Мисия

-

Основната ни цел е безкомпромисно качество на услугите ни. Предлагаме цялостна поддръжка на вашите машини, включително тези които използвате във Вашият офис.

+

Основната ни цел е безкомпромисно качество на услугите. Предлагаме цялостна поддръжка на вашите машини, включително тези които използвате във Вашият офис.

@@ -111,6 +111,6 @@ {% endblock %} {% block footer %} -{% include "footer_index.html" %} -{% include "footer_colored.html" %} +{% include "main/footer_index.html" %} +{% include "main/footer_colored.html" %} {% endblock %} diff --git a/app/templates/nav.html b/app/templates/nav.html index d6f7fe0..8b3124f 100644 --- a/app/templates/nav.html +++ b/app/templates/nav.html @@ -44,7 +44,7 @@
  • Login
  • {% else %} {% if current_user.is_administrator() %} -
  • Admin Panel
  • +
  • Admin Panel
  • {% endif %}