app split refactor, adding db models
parent
46b1f08985
commit
5152283208
@ -1,197 +1,10 @@
|
|||||||
import logging
|
|
||||||
import os
|
|
||||||
import json
|
|
||||||
from logging.config import dictConfig
|
from logging.config import dictConfig
|
||||||
from slack_sdk import WebClient
|
from app.logging import logging_config
|
||||||
from slack_sdk.signature import SignatureVerifier
|
from app.factory import create_app
|
||||||
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],
|
|
||||||
# });
|
|
||||||
# }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app = create_app()
|
||||||
|
dictConfig(logging_config)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run()
|
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)
|
Loading…
Reference in New Issue