diff --git a/FreeSans.ttf b/FreeSans.ttf
new file mode 100644
index 0000000..9db9585
Binary files /dev/null and b/FreeSans.ttf differ
diff --git a/FreeSansBold.ttf b/FreeSansBold.ttf
new file mode 100644
index 0000000..63644e7
Binary files /dev/null and b/FreeSansBold.ttf differ
diff --git a/FreeSansBoldOblique.ttf b/FreeSansBoldOblique.ttf
new file mode 100644
index 0000000..dde7f32
Binary files /dev/null and b/FreeSansBoldOblique.ttf differ
diff --git a/FreeSansOblique.ttf b/FreeSansOblique.ttf
new file mode 100644
index 0000000..7452885
Binary files /dev/null and b/FreeSansOblique.ttf differ
diff --git a/SWSCloudCore/models.py b/SWSCloudCore/models.py
index a326ee6..31608a0 100644
--- a/SWSCloudCore/models.py
+++ b/SWSCloudCore/models.py
@@ -119,6 +119,10 @@ class Users(PgSQLModel):
def hash_password(password):
return md5(password).hexdigest()
+ @staticmethod
+ def get_by_id(user_id):
+ return Users.select().where(Users.id == user_id).get()
+
class UsersRecoveryCodes(PgSQLModel):
user = ForeignKeyField(Users)
@@ -155,6 +159,11 @@ class UsersBalance(PgSQLModel):
user = ForeignKeyField(Users)
balance = FloatField(default=0, null=False)
+ @staticmethod
+ def get_by_account(user_id):
+ x = UsersBalance.select(UsersBalance.balance).where(UsersBalance.user == user_id).get()
+ return x.balance
+
class UsersBalanceTransactions(PgSQLModel):
"""
@@ -164,10 +173,11 @@ class UsersBalanceTransactions(PgSQLModel):
amount = FloatField(default=0, null=False)
created = DateTimeField(default=datetime.datetime.now)
notified = IntegerField(null=False, default=0)
- # success
- # process
- # fail
+ # success, process, fail
status = TextField(null=False)
+ # robokassa, webmoney, yandex_money, rbk_money, alfaclick, sberbank_online, paypal, invoice
+ method = CharField(null=False, default=0)
+ details = JSONField(default='{}')
class SSHKeys(PgSQLModel):
@@ -258,6 +268,11 @@ class Vms(PgSQLModel):
x.execute()
return True
+ @staticmethod
+ def get_state(vm_id):
+ c = Vms.select(Vms.status).where(Vms.id == vm_id).first()
+ return c.status
+
class Tasks(PgSQLModel):
id = UUIDField(primary_key=True, unique=True)
@@ -270,6 +285,12 @@ class Tasks(PgSQLModel):
status = IntegerField(null=False, default=0)
plain = TextField()
+ @staticmethod
+ def exists_active_tasks(user_id):
+ if Tasks.select().where(Tasks.user == user_id, Tasks.status != 2).count() == 0:
+ return False
+ return True
+
# @staticmethod
# def set_task(datacenter_id, server_id, task, status, **args):
# task_id = uuid.uuid4()
diff --git a/SWSCloudWeb/application.py b/SWSCloudWeb/application.py
index 29cb9ba..e912cae 100644
--- a/SWSCloudWeb/application.py
+++ b/SWSCloudWeb/application.py
@@ -11,6 +11,7 @@ from SWSCloudCore.models import database
from SWSCloudServerAPI.ServerAPI import viewServerAPI
from SWSCloudWeb.views import viewHomepage
from SWSCloudWeb.views.account import viewAccount
+from SWSCloudWeb.views.bills import viewBills
from SWSCloudWeb.views.compute.containers import viewContainers
from SWSCloudWeb.views.compute.vms import viewVMs
from SWSCloudWeb.views.payments import viewPayments
@@ -34,11 +35,13 @@ app.register_blueprint(viewKB)
app.register_blueprint(viewDocuments)
# /tasks
app.register_blueprint(viewTasks)
-# /containers
+# /compute
app.register_blueprint(viewContainers)
app.register_blueprint(viewVMs)
# /id
app.register_blueprint(viewAccount)
+# /billing
+app.register_blueprint(viewBills)
# /payments
app.register_blueprint(viewPayments)
# /api
diff --git a/SWSCloudWeb/static/assets/css/app.css b/SWSCloudWeb/static/assets/css/app.css
new file mode 100644
index 0000000..4b27959
--- /dev/null
+++ b/SWSCloudWeb/static/assets/css/app.css
@@ -0,0 +1,4142 @@
+@charset "UTF-8";
+/**
+ * Foundation for Sites by ZURB
+ * Version 6.2.3
+ * foundation.zurb.com
+ * Licensed under MIT Open Source
+ */
+@import 'https://fonts.googleapis.com/css?family=Merriweather';
+*, h1, h2, h3, h4 {
+ font-family: 'Merriweather', serif; }
+
+#home-jumbotron {
+ margin-top: 0;
+ margin-bottom: 1em;
+ padding-top: 2em;
+ padding-bottom: 5em;
+ padding-left: 1em;
+ padding-right: 1em;
+ background: transparent url(/assets/img/jumbotron1.png) repeat-x scroll 0% 0%;
+ background-position: center;
+ height: 366px; }
+ #home-jumbotron div {
+ margin-top: 1em; }
+ #home-jumbotron h1, #home-jumbotron h2, #home-jumbotron h3 {
+ margin: 0;
+ pagging: 0 0 1em 0;
+ color: #fefefe; }
+ #home-jumbotron h1 {
+ font-weight: bold; }
+ #home-jumbotron .button {
+ margin-top: 1em;
+ font-size: .8em; }
+
+footer {
+ margin-top: 3em;
+ margin-bottom: 3em; }
+ footer .row div .copyright {
+ margin: 0;
+ text-align: center; }
+ footer .row ul {
+ margin: 0;
+ padding: 0;
+ list-style: none; }
+
+.testimonial-wrap h2 {
+ margin-top: 40px;
+ font-weight: 200;
+ color: #333; }
+
+.testimonial-wrap .centered-text {
+ text-align: center; }
+
+.testimonial-wrap .quote {
+ background: #ebf3f5;
+ padding: 15px 20px 5px 15px;
+ border-radius: 5px;
+ margin-bottom: 30px; }
+ .testimonial-wrap .quote:after {
+ content: '';
+ width: 0px;
+ height: 0px;
+ border-style: solid;
+ border-width: 20px 18px 0 18px;
+ border-color: #ebf3f5 transparent transparent transparent;
+ position: relative;
+ top: 37px;
+ left: 20px; }
+
+.testimonial-wrap .student {
+ margin-left: 25px;
+ margin-bottom: 80px; }
+ .testimonial-wrap .student .photo {
+ background-color: #ccc;
+ border-radius: 100px;
+ width: 60px;
+ height: 60px;
+ float: left;
+ margin-right: 10px; }
+ .testimonial-wrap .student p {
+ position: relative;
+ top: 5px;
+ text-transform: uppercase; }
+ .testimonial-wrap .student p:nth-child(2) {
+ font-size: 16px;
+ font-weight: 600;
+ margin-bottom: 0; }
+ .testimonial-wrap .student p:nth-child(3) {
+ font-size: 14px;
+ color: #777; }
+
+.pricing .row .pricing-table {
+ background-color: aliceblue;
+ padding: 1em; }
+
+.pricing .title {
+ text-align: center;
+ font-weight: 900;
+ font-size: 2em; }
+
+.pricing .price {
+ text-align: center;
+ font-size: 150%;
+ color: #E11F34; }
+ .pricing .price small {
+ margin: 0;
+ padding: 0;
+ font-size: 70%; }
+
+.pricing .bullet-item {
+ text-align: center; }
+ .pricing .bullet-item span {
+ font-weight: bold; }
+
+.pricing .cta-button {
+ text-align: center;
+ margin-top: .5em; }
+
+.pricing ul {
+ margin: 0;
+ list-style: none; }
+
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS and IE text size adjust after device 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/10/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 of focused elements when they are also in an
+ * active/hover state.
+ */
+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 {
+ 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"],
+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: not-allowed; }
+
+/**
+ * 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.
+ */
+input[type="search"] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ box-sizing: content-box;
+ /* 2 */ }
+
+/**
+ * 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.
+ * [NOTE] We don't enable this ruleset in Foundation, because we want the