diff --git a/alembic/versions/2017_09_02_15_24.py b/alembic/versions/2017_09_02_15_24.py new file mode 100644 index 0000000..461f844 --- /dev/null +++ b/alembic/versions/2017_09_02_15_24.py @@ -0,0 +1,36 @@ +"""New table UserWotTokes + +Revision ID: 6c29ab667741 +Revises: b3222bf2cedb +Create Date: 2017-09-02 15:24:41.692342 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6c29ab667741' +down_revision = 'b3222bf2cedb' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'user_wot_tokens', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=False), + sa.Column('expires_at', sa.Integer), + sa.Column('access_token', sa.String(256)), + + sa.PrimaryKeyConstraint('id'), + sa.ForeignKeyConstraint(['user'], ['user.id']), + sa.UniqueConstraint('user') + ) + pass + + +def downgrade(): + op.drop_table('user_wot_tokens') + pass diff --git a/alembic/versions/2017_09_03_17_37.py b/alembic/versions/2017_09_03_17_37.py new file mode 100644 index 0000000..db48337 --- /dev/null +++ b/alembic/versions/2017_09_03_17_37.py @@ -0,0 +1,34 @@ +"""empty message + +Revision ID: 34b1309f878a +Revises: 6c29ab667741 +Create Date: 2017-09-03 17:37:21.158601 + +""" +from sqlalchemy.dialects.postgresql import ARRAY, HSTORE +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '34b1309f878a' +down_revision = '6c29ab667741' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'user_wot_data', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user', sa.Integer(), nullable=True), + sa.Column('created_at', sa.Integer(), nullable=True), + sa.Column('data', HSTORE, default='{}'), + + sa.PrimaryKeyConstraint('id'), + sa.ForeignKeyConstraint(['user'], ['user.id']), + ) + + +def downgrade(): + op.drop_table('user_wot_data') diff --git a/config_file.ini b/config_file.ini new file mode 100644 index 0000000..9374b24 --- /dev/null +++ b/config_file.ini @@ -0,0 +1,27 @@ +from datetime import timedelta +from celery.schedules import crontab + +DEBUG=True + +SECRET_KEY="super-secret" + +SQLALCHEMY_DATABASE_URI="postgres://wot:wot@192.168.1.47/wot" + +OPENID_FS_STORE_PATH="tmp" + +WG_REDIRECT_URL="http://wot.anzhiganov.com/token" +WG_APPLICATION_ID="502910c1c785c3c7ca2e83c9e89bde02" +# WG_OPENID_URL=https://eu.wargaming.net/id/openid/ +WG_OPENID_URL="https://wargaming.net/id/openid/" +WG_TOKEN_URL="https://api.worldoftanks.ru/wot/auth/login/" + +# Celery configuration +CELERY_BROKER_URL = 'redis://192.168.1.47:6379/4' +CELERY_RESULT_BACKEND = 'redis://192.168.1.47:6379/4' +#CELERYBEAT_SCHEDULE = { +# 'wotstats.tasks.hello': { +# 'task': 'wotstats.tasks.hello', +# # 'schedule': timedelta(seconds=3) +# 'schedule': crontab(minute="*") +# }, +#} diff --git a/run_app.py b/run_app.py new file mode 100644 index 0000000..eb5fc6b --- /dev/null +++ b/run_app.py @@ -0,0 +1,5 @@ + +from wots import app + +if __name__ == '__main__': + app.run(host='0.0.0.0', debug=True) diff --git a/run_celery.py b/run_celery.py new file mode 100644 index 0000000..b4f0cc1 --- /dev/null +++ b/run_celery.py @@ -0,0 +1,2 @@ + +from wots import celery diff --git a/wots.py b/wots.py new file mode 100644 index 0000000..3c36c7a --- /dev/null +++ b/wots.py @@ -0,0 +1,3 @@ +from wotstats.init import init_app + +app, celery = init_app() diff --git a/wotstats/log.py b/wotstats/log.py new file mode 100644 index 0000000..96d8620 --- /dev/null +++ b/wotstats/log.py @@ -0,0 +1,4 @@ +import logging + +log = logging.getLogger(__name__) +# log.setLevel(logging.DEBUG) diff --git a/wotstats/models/userwotdata.py b/wotstats/models/userwotdata.py new file mode 100644 index 0000000..571da74 --- /dev/null +++ b/wotstats/models/userwotdata.py @@ -0,0 +1,17 @@ + +from sqlalchemy.dialects.postgresql import ARRAY, HSTORE +from wotstats.database import db + + +class UserWotData(db.Model): + id = db.Column(db.Integer, primary_key=True) + user = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True) + created_at = db.Column(db.DateTime, nullable=False) + # WG + data = db.Column(HSTORE, nullable=False, default={}) + + # def __init__(self): + # pass + + def __repr__(self): + return ''.format(self.id, self.user, self.created_at) diff --git a/wotstats/models/userwotdetails.py b/wotstats/models/userwotdetails.py new file mode 100644 index 0000000..f470324 --- /dev/null +++ b/wotstats/models/userwotdetails.py @@ -0,0 +1,27 @@ + +from sqlalchemy.dialects.postgresql import ARRAY, HSTORE +from wotstats.database import db + + +class UserWotDetails(db.Model): + id = db.Column(db.Integer, primary_key=True) + user = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + # next columns is WG data + nickname = db.Column(db.String(32), unique=True) + client_language = db.Column(db.String(3)) + last_battle_time = db.Column(db.Integer) + account_id = db.Column(db.Integer) + created_at = db.Column(db.Integer) + updated_at = db.Column(db.Integer) + logout_at = db.Column(db.Integer) + private = db.Column(db.String(32)) + global_rating = db.Column(db.String(32)) + clan_id = db.Column(db.Integer) + # + # ForeignKeyConstraint(['user'], ['user.id']) + + # def __init__(self): + # pass + + def __repr__(self): + return ''.format(self.id, self.user, self.nickname) diff --git a/wotstats/models/userwotstats.py b/wotstats/models/userwotstats.py new file mode 100644 index 0000000..234cd49 --- /dev/null +++ b/wotstats/models/userwotstats.py @@ -0,0 +1,26 @@ + +from sqlalchemy.dialects.postgresql import ARRAY, HSTORE +from wotstats.database import db + + +class UserWotStats(db.Model): + id = db.Column(db.Integer, primary_key=True) + user = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + created_at = db.Column(db.DateTime, nullable=False) + # WG + clan = db.Column(HSTORE, nullable=False, default={}) + stronghold_skirmish = db.Column(HSTORE, nullable=False, default={}) + regular_team = db.Column(HSTORE, nullable=False, default={}) + trees_cut = db.Column(HSTORE, nullable=False, default={}) + company = db.Column(HSTORE, nullable=False, default={}) + all = db.Column(HSTORE, nullable=False, default={}) + stronghold_defense = db.Column(HSTORE, nullable=False, default={}) + historical = db.Column(HSTORE, nullable=False, default={}) + team = db.Column(HSTORE, nullable=False, default={}) + flags = db.Column(HSTORE, nullable=False, default={}) + + # def __init__(self): + # pass + + def __repr__(self): + return ''.format(self.id, self.user, self.created_at) diff --git a/wotstats/models/userwottokens.py b/wotstats/models/userwottokens.py new file mode 100644 index 0000000..e2fd0d2 --- /dev/null +++ b/wotstats/models/userwottokens.py @@ -0,0 +1,27 @@ + +from sqlalchemy.dialects.postgresql import ARRAY, HSTORE +from wotstats.database import db +# from wotstats.models.user import User + + +class UserWotTokens(db.Model): + """ + ([ + ('status', u'ok'), + ('access_token', u'5c2e54189009738a001060f04c2e00f43d22f71b'), + ('nickname', u'CrazyPants1999'), + ('account_id', u'69552613'), + ('expires_at', u'1505570179') + ]) + """ + id = db.Column(db.Integer, primary_key=True) + user = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + # next columns is WG data + expires_at = db.Column(db.Integer) + access_token = db.Column(db.String(256), nullable=True) + + # def __init__(self): + # pass + + def __repr__(self): + return ''.format(self.id, self.user, self.access_token, self.expires_at) diff --git a/wotstats/pending_tasks.py b/wotstats/pending_tasks.py new file mode 100644 index 0000000..e51a92d --- /dev/null +++ b/wotstats/pending_tasks.py @@ -0,0 +1,4 @@ + +from celery import Celery + +celery = Celery() diff --git a/wotstats/tasks/__init__.py b/wotstats/tasks/__init__.py new file mode 100644 index 0000000..21cb55c --- /dev/null +++ b/wotstats/tasks/__init__.py @@ -0,0 +1,38 @@ +import time +from datetime import timedelta +from flask import current_app +from wotstats.pending_tasks import celery + + +@celery.task(name='wotstats.tasks.hello') +def hello(): + time.sleep(3) + # current_app.log.error('wdwqd') + # with current_app.test_request_context() as request: + # print('Hello {0!r}'.format(request)) + print 111 + + +@celery.task +def mail_welcome(): + time.sleep(3) + # current_app.log.error('wdwqd') + # with current_app.test_request_context() as request: + # print('Hello {0!r}'.format(request)) + print 111 + + + +@celery.on_after_configure.connect +def setup_periodic_tasks(sender, **kwargs): + # Calls test('hello') every 10 seconds. + sender.add_periodic_task(10.0, hello.s(), name='add every 10') + + # Calls test('world') every 30 seconds + # sender.add_periodic_task(30.0, test.s('world'), expires=10) + + # Executes every Monday morning at 7:30 a.m. + # sender.add_periodic_task( + # crontab(hour=7, minute=30, day_of_week=1), + # test.s('Happy Mondays!'), + # )