diff --git a/examples/django/slackapp/migrations/0001_initial.py b/examples/django/slackapp/migrations/0001_initial.py index 84665c287..5d256685d 100644 --- a/examples/django/slackapp/migrations/0001_initial.py +++ b/examples/django/slackapp/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1.1 on 2020-09-26 13:49 +# Generated by Django 3.1.4 on 2020-12-04 13:07 from django.db import migrations, models @@ -7,95 +7,69 @@ class Migration(migrations.Migration): initial = True - dependencies = [] + dependencies = [ + ] operations = [ migrations.CreateModel( - name="SlackBot", + name='SlackBot', fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("client_id", models.TextField()), - ("app_id", models.TextField()), - ("enterprise_id", models.TextField(null=True)), - ("team_id", models.TextField(null=True)), - ("bot_token", models.TextField(null=True)), - ("bot_id", models.TextField(null=True)), - ("bot_user_id", models.TextField(null=True)), - ("bot_scopes", models.TextField(null=True)), - ("installed_at", models.DateTimeField()), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('client_id', models.TextField()), + ('app_id', models.TextField()), + ('enterprise_id', models.TextField(null=True)), + ('enterprise_name', models.TextField(null=True)), + ('team_id', models.TextField(null=True)), + ('team_name', models.TextField(null=True)), + ('bot_token', models.TextField(null=True)), + ('bot_id', models.TextField(null=True)), + ('bot_user_id', models.TextField(null=True)), + ('bot_scopes', models.TextField(null=True)), + ('is_enterprise_install', models.BooleanField(null=True)), + ('installed_at', models.DateTimeField()), ], ), migrations.CreateModel( - name="SlackInstallation", + name='SlackInstallation', fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("client_id", models.TextField()), - ("app_id", models.TextField()), - ("enterprise_id", models.TextField(null=True)), - ("team_id", models.TextField(null=True)), - ("bot_token", models.TextField(null=True)), - ("bot_id", models.TextField(null=True)), - ("bot_user_id", models.TextField(null=True)), - ("bot_scopes", models.TextField(null=True)), - ("user_id", models.TextField()), - ("user_token", models.TextField(null=True)), - ("user_scopes", models.TextField(null=True)), - ("incoming_webhook_url", models.TextField(null=True)), - ("incoming_webhook_channel_id", models.TextField(null=True)), - ("incoming_webhook_configuration_url", models.TextField(null=True)), - ("installed_at", models.DateTimeField()), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('client_id', models.TextField()), + ('app_id', models.TextField()), + ('enterprise_id', models.TextField(null=True)), + ('enterprise_name', models.TextField(null=True)), + ('enterprise_url', models.TextField(null=True)), + ('team_id', models.TextField(null=True)), + ('team_name', models.TextField(null=True)), + ('bot_token', models.TextField(null=True)), + ('bot_id', models.TextField(null=True)), + ('bot_user_id', models.TextField(null=True)), + ('bot_scopes', models.TextField(null=True)), + ('user_id', models.TextField()), + ('user_token', models.TextField(null=True)), + ('user_scopes', models.TextField(null=True)), + ('incoming_webhook_url', models.TextField(null=True)), + ('incoming_webhook_channel', models.TextField(null=True)), + ('incoming_webhook_channel_id', models.TextField(null=True)), + ('incoming_webhook_configuration_url', models.TextField(null=True)), + ('is_enterprise_install', models.BooleanField(null=True)), + ('token_type', models.TextField(null=True)), + ('installed_at', models.DateTimeField()), ], ), migrations.CreateModel( - name="SlackOAuthState", + name='SlackOAuthState', fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("state", models.TextField()), - ("expire_at", models.DateTimeField()), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('state', models.TextField()), + ('expire_at', models.DateTimeField()), ], ), migrations.AddIndex( - model_name="slackinstallation", - index=models.Index( - fields=[ - "client_id", - "enterprise_id", - "team_id", - "user_id", - "installed_at", - ], - name="slackapp_sl_client__9b0d3f_idx", - ), + model_name='slackinstallation', + index=models.Index(fields=['client_id', 'enterprise_id', 'team_id', 'user_id', 'installed_at'], name='bolt_slacki_client__62c411_idx'), ), migrations.AddIndex( - model_name="slackbot", - index=models.Index( - fields=["client_id", "enterprise_id", "team_id", "installed_at"], - name="slackapp_sl_client__d220d6_idx", - ), + model_name='slackbot', + index=models.Index(fields=['client_id', 'enterprise_id', 'team_id', 'installed_at'], name='bolt_slackb_client__be066b_idx'), ), ] diff --git a/examples/django/slackapp/models.py b/examples/django/slackapp/models.py index 8b84beaac..6069ce345 100644 --- a/examples/django/slackapp/models.py +++ b/examples/django/slackapp/models.py @@ -8,11 +8,14 @@ class SlackBot(models.Model): client_id = models.TextField(null=False) app_id = models.TextField(null=False) enterprise_id = models.TextField(null=True) + enterprise_name = models.TextField(null=True) team_id = models.TextField(null=True) + team_name = models.TextField(null=True) bot_token = models.TextField(null=True) bot_id = models.TextField(null=True) bot_user_id = models.TextField(null=True) bot_scopes = models.TextField(null=True) + is_enterprise_install = models.BooleanField(null=True) installed_at = models.DateTimeField(null=False) class Meta: @@ -27,7 +30,10 @@ class SlackInstallation(models.Model): client_id = models.TextField(null=False) app_id = models.TextField(null=False) enterprise_id = models.TextField(null=True) + enterprise_name = models.TextField(null=True) + enterprise_url = models.TextField(null=True) team_id = models.TextField(null=True) + team_name = models.TextField(null=True) bot_token = models.TextField(null=True) bot_id = models.TextField(null=True) bot_user_id = models.TextField(null=True) @@ -36,8 +42,11 @@ class SlackInstallation(models.Model): user_token = models.TextField(null=True) user_scopes = models.TextField(null=True) incoming_webhook_url = models.TextField(null=True) + incoming_webhook_channel = models.TextField(null=True) incoming_webhook_channel_id = models.TextField(null=True) incoming_webhook_configuration_url = models.TextField(null=True) + is_enterprise_install = models.BooleanField(null=True) + token_type = models.TextField(null=True) installed_at = models.DateTimeField(null=False) class Meta: @@ -95,11 +104,16 @@ def save(self, installation: Installation): SlackBot(**b).save() def find_bot( - self, *, enterprise_id: Optional[str], team_id: Optional[str] + self, *, enterprise_id: Optional[str], team_id: Optional[str], + is_enterprise_install: Optional[bool] = False ) -> Optional[Bot]: + e_id = enterprise_id or None + t_id = team_id or None + if is_enterprise_install: + t_id = None rows = ( - SlackBot.objects.filter(enterprise_id=enterprise_id) - .filter(team_id=team_id) + SlackBot.objects.filter(enterprise_id=e_id) + .filter(team_id=t_id) .order_by(F("installed_at").desc())[:1] ) if len(rows) > 0: @@ -116,6 +130,47 @@ def find_bot( ) return None + def find_installation( + self, + *, + enterprise_id: Optional[str], + team_id: Optional[str], + user_id: Optional[str] = None, + is_enterprise_install: Optional[bool] = False, + ) -> Optional[Installation]: + e_id = enterprise_id or None + t_id = team_id or None + if is_enterprise_install: + t_id = None + if user_id is None: + rows = (SlackInstallation.objects.filter( + enterprise_id=e_id).filter(team_id=t_id).order_by( + F("installed_at").desc())[:1]) + else: + rows = (SlackInstallation.objects.filter( + enterprise_id=e_id).filter(team_id=t_id).filter( + user_id=user_id).order_by(F("installed_at").desc())[:1]) + + if len(rows) > 0: + i = rows[0] + return Installation( + app_id=i.app_id, + enterprise_id=i.enterprise_id, + team_id=i.team_id, + bot_token=i.bot_token, + bot_id=i.bot_id, + bot_user_id=i.bot_user_id, + bot_scopes=i.bot_scopes, + user_id=i.user_id, + user_token=i.user_token, + user_scopes=i.user_scopes, + incoming_webhook_url=i.incoming_webhook_url, + incoming_webhook_channel_id=i.incoming_webhook_channel_id, + incoming_webhook_configuration_url=i.incoming_webhook_configuration_url, + installed_at=i.installed_at.timestamp(), + ) + return None + class DjangoOAuthStateStore(OAuthStateStore): expiration_seconds: int