app split refactor, adding db models

main
lza_menace 3 years ago
parent 46b1f08985
commit 5152283208

@ -1,197 +1,10 @@
import logging
import os
import json
from logging.config import dictConfig
from slack_sdk import WebClient
from slack_sdk.signature import SignatureVerifier
from slack_sdk.errors import SlackApiError
from slugify import slugify
from flask import Flask, request, make_response
from app.ux import SlackInterface
from app.gdrive import *
app = Flask(__name__)
client = WebClient(token=os.getenv('SLACK_API_TOKEN'))
signature_verifier = SignatureVerifier(os.getenv('SLACK_SIGNING_SECRET'))
# client.api_test()
dictConfig({
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
},
'access': {
'format': '%(message)s',
}
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'default',
'stream': 'ext://sys.stdout',
}
},
'loggers': {
'gunicorn.error': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
'gunicorn.access': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
}
},
'root': {
'level': 'DEBUG',
'handlers': ['console'],
}
})
def verify_slack(req: request):
signature_verifier = SignatureVerifier(os.getenv('SLACK_SIGNING_SECRET'))
if not signature_verifier.is_valid_request(req.get_data(), req.headers):
return make_response('invalid request', 403)
@app.route('/slack/command', methods=['POST'])
def slack_command():
verify_slack(request)
logging.info(request.form)
client.views_open(
trigger_id=request.form.get('trigger_id'),
view=SlackInterface().select_action_modal()
)
return make_response('', 200)
@app.route('/slack/events', methods=['POST'])
def slack_events():
verify_slack(request)
if 'payload' in request.form:
payload = json.loads(request.form.get('payload'))
print('debug: %s \n' % payload)
if 'actions' in payload:
action_id = payload['actions'][0]['action_id']
trigger_id = payload['trigger_id']
if action_id == 'create_new_channel_modal':
client.views_push(
trigger_id=trigger_id,
view=SlackInterface().new_channel_modal(payload['user']['id'])
)
elif action_id == 'generate_documents_modal':
client.views_push(
trigger_id=trigger_id,
view=SlackInterface().generate_docs_modal()
)
elif action_id == 'debug_modal':
print(get_drives())
return make_response('', 200)
elif 'view' in payload:
callback_id = payload['view']['callback_id']
if callback_id == 'submit_new_channel':
users_to_add = list()
values = payload['view']['state']['values']
cx_name = values['customer_name']['customer_name']['value']
cx_slug = slugify(cx_name)
selected_users = values['users_to_add']['users_to_add']['selected_users']
for i in selected_users:
username = client.users_info(user=i)
users_to_add.append(username['user']['name'])
# Create channel
try:
res = client.conversations_create(name=cx_slug)
# Notify da peeps
client.chat_postMessage(
channel=res['channel']['id'],
text=f'sup bros! {" ".join(["@" + i for i in users_to_add])}'
)
return make_response('', 200)
except SlackApiError as e:
logging.error("Error creating conversation: {}".format(e))
return make_response('', 403)
elif callback_id == 'generate_documents':
pass
else:
return make_response('', 404)
#
# // Handle actions based upon user selection and inputs
# if ( body.view.callback_id == 'submit_new_channel' ) {
# console.log('[+] Creating new channel for @' + body.user.username);
#
# // Gather vars and setup slug from customer name
# let cx_name = body.view.state.values.customer_name.customer_name.value;
# let cx_char = cx_name.charAt(0);
# let cx_slug = slugify(cx_name, {
# strict: true,
# lower: true
# });
#
# // Check if first character is a number so it can go into numeric group
# if ( !isNaN(cx_char) ) {
# var gdrive_prefix = '0-9';
# } else {
# var gdrive_prefix = cx_char.toUpperCase();
# }
#
# // Create users array to add to channel
# const users = body.view.state.values.users_to_add.users_to_add.selected_users.map(async function(item) {
# var result = await api.callSlackAPI('users.info', {
# user: item
# });
# let slack_username = '@' + result.user.name;
# return slack_username
# });
#
# await Promise.all(users).then(async function(result) {
# // Post to Zapier to run Zap to create new channel
# await api.postZapierWebhook(process.env.ZAPIER_WEBHOOK_submit_new_channel, {
# 'customer_name': cx_name,
# 'gdrive_prefix': gdrive_prefix,
# 'slack_channel': cx_slug,
# 'users': result
# });
# })
# } else if ( body.view.callback_id == 'generate_documents' ) {
# console.log('[+] Generating documents for @' + body.user.username);
#
# // Gather vars and setup slug from customer name
# let cx_name = body.view.state.values.customer_name.customer_name.value;
# let opp_name = body.view.state.values.opportunity_name.opportunity_name.value;
# let cx_char = cx_name.charAt(0);
#
# // Check if first character is a number so it can go into numeric group
# if ( !isNaN(cx_char) ) {
# var gdrive_prefix = '0-9';
# } else {
# var gdrive_prefix = cx_char.toUpperCase();
# }
#
# // Post to Zapier to run Zap to generate new docs in the channel
# await api.postZapierWebhook(process.env.ZAPIER_WEBHOOK_generate_documents, {
# 'customer_name': cx_name,
# 'gdrive_prefix': gdrive_prefix,
# 'gdrive_item': cx_name + ' - ' + opp_name,
# 'slack_channel': body.view.state.values.channel_to_post_to.channel_to_post_to.selected_channels[0],
# });
# }
from app.logging import logging_config
from app.factory import create_app
app = create_app()
dictConfig(logging_config)
if __name__ == '__main__':
app.run()

@ -0,0 +1,12 @@
import click
from flask import Blueprint
from app.factory import db
cli_bp = Blueprint('cli', 'cli', cli_group=None)
@cli_bp.cli.command('init')
def init():
import app.models
db.create_all()

@ -0,0 +1,31 @@
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from os import getenv
db = SQLAlchemy()
def setup_db(app: Flask):
uri = 'postgresql+psycopg2://{user}:{pw}@{host}:{port}/{db}'.format(
user=getenv('DB_USER'),
pw=getenv('DB_PASS'),
host=getenv('DB_HOST'),
port=getenv('DB_PORT'),
db=getenv('DB_NAME')
)
app.config['SQLALCHEMY_DATABASE_URI'] = uri
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
return db
def create_app():
app = Flask(__name__)
setup_db(app)
with app.app_context():
from app.routes import api_bp
from app.cli import cli_bp
app.register_blueprint(api_bp)
app.register_blueprint(cli_bp)
return app

@ -0,0 +1,13 @@
from os import getenv
from flask import make_response, request
from slack_sdk import WebClient
from slack_sdk.signature import SignatureVerifier
from slack_sdk.errors import SlackApiError
client = WebClient(token=getenv('SLACK_API_TOKEN'))
def verify_slack(req: request):
signature_verifier = SignatureVerifier(getenv('SLACK_SIGNING_SECRET'))
if not signature_verifier.is_valid_request(req.get_data(), req.headers):
return make_response('invalid request', 403)

@ -0,0 +1,36 @@
logging_config = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
},
'access': {
'format': '%(message)s',
}
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'default',
'stream': 'ext://sys.stdout',
}
},
'loggers': {
'gunicorn.error': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
'gunicorn.access': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
}
},
'root': {
'level': 'DEBUG',
'handlers': ['console'],
}
}

@ -0,0 +1,19 @@
from datetime import datetime
from sqlalchemy import func
from app.factory import db
from app import config
class WorkEvent(db.Model):
__tablename__ = 'work_events'
id = db.Column(db.String(80), primary_key=True)
create_date = db.Column(db.DateTime, server_default=func.now())
slack_channel = db.Column(db.String(50))
work_type = db.Column(db.String(50))
account_idx = db.Column(db.Integer)
start_date = db.Column(db.DateTime)
end_date = db.Column(db.DateTime)
def __repr__(self):
return self.id

@ -0,0 +1,83 @@
import logging
import json
from slugify import slugify
from flask import Flask, request, make_response, Blueprint
from flask_sqlalchemy import SQLAlchemy
from app.library.ux import SlackInterface
from app.library.gdrive import *
from app.library.slack import verify_slack, client
from app.logging import logging_config
from app.factory import create_app, db
api_bp = Blueprint('api', 'api')
@api_bp.route('/slack/command', methods=['POST'])
def slack_command():
verify_slack(request)
logging.info(request.form)
client.views_open(
trigger_id=request.form.get('trigger_id'),
view=SlackInterface().select_action_modal()
)
return make_response('', 200)
@api_bp.route('/slack/events', methods=['POST'])
def slack_events():
verify_slack(request)
if 'payload' in request.form:
payload = json.loads(request.form.get('payload'))
print('debug: %s \n' % payload)
if 'actions' in payload:
action_id = payload['actions'][0]['action_id']
trigger_id = payload['trigger_id']
if action_id == 'create_new_channel_modal':
client.views_push(
trigger_id=trigger_id,
view=SlackInterface().new_channel_modal(payload['user']['id'])
)
elif action_id == 'generate_documents_modal':
client.views_push(
trigger_id=trigger_id,
view=SlackInterface().generate_docs_modal()
)
elif action_id == 'debug_modal':
print(get_drives())
return make_response('', 200)
elif 'view' in payload:
callback_id = payload['view']['callback_id']
if callback_id == 'submit_new_channel':
users_to_add = list()
values = payload['view']['state']['values']
cx_name = values['customer_name']['customer_name']['value']
cx_slug = slugify(cx_name)
selected_users = values['users_to_add']['users_to_add']['selected_users']
for i in selected_users:
username = client.users_info(user=i)
users_to_add.append(username['user']['name'])
# Create channel
try:
res = client.conversations_create(name=cx_slug)
# Notify da peeps
client.chat_postMessage(
channel=res['channel']['id'],
text=f'sup bros! {" ".join(["@" + i for i in users_to_add])}'
)
return make_response('', 200)
except SlackApiError as e:
logging.error("Error creating conversation: {}".format(e))
return make_response('', 403)
elif callback_id == 'generate_documents':
pass
else:
return make_response('', 404)

@ -11,8 +11,3 @@ services:
POSTGRES_DB: ${DB_NAME:-salesbot}
volumes:
- ${DATA_DIR:-./data/postgresql}:/var/lib/postgresql/data
cache:
image: redis:latest
container_name: salesbot_cache
ports:
- 127.0.0.1:6379:6379

@ -1,4 +1,8 @@
Flask
flask_sqlalchemy
sqlalchemy
arrow
psycopg2-binary
gunicorn
slack_sdk
python-slugify

Loading…
Cancel
Save