feat: Add webhook profile picture support

- Added `webhookBotProfilePicture` field to
  `TeamDiscordIntegrationSchema`.
- Updated `DiscordIntegrationForm.vue` to include profile picture input.
- Created migration to add `webhook_bot_profile_picture` column.
- Updated `Team` model to handle new profile picture field.
- Modified `TeamDiscordIntegration` and `TeamDiscordIntegrationSchema`
  to include the new profile picture attribute.
master
John Montagu, the 4th Earl of Sandvich 2024-11-29 00:04:46 -08:00
parent ebbd969afd
commit 3d5d9574e3
Signed by: sandvich
GPG Key ID: 9A39BE37E602B22D
5 changed files with 46 additions and 1 deletions

View File

@ -4,6 +4,7 @@
/* eslint-disable */ /* eslint-disable */
export type TeamDiscordIntegrationSchema = { export type TeamDiscordIntegrationSchema = {
webhookBotName: string; webhookBotName: string;
webhookBotProfilePicture: (string | null);
webhookUrl: string; webhookUrl: string;
}; };

View File

@ -16,6 +16,7 @@ function enableIntegration() {
model.value = { model.value = {
webhookUrl: "", webhookUrl: "",
webhookBotName: "", webhookBotName: "",
webhookBotProfilePicture: null,
}; };
saveIntegration(); saveIntegration();
} }
@ -38,6 +39,10 @@ function disableIntegration() {
<h3>Webhook Bot Name</h3> <h3>Webhook Bot Name</h3>
<input v-model="model.webhookBotName"> <input v-model="model.webhookBotName">
</div> </div>
<div class="form-group margin">
<h3>Webhook Bot Profile Picture URL (optional)</h3>
<input v-model="model.webhookBotProfilePicture">
</div>
<div class="form-group margin"> <div class="form-group margin">
<div class="action-buttons"> <div class="action-buttons">
<button class="destructive-on-hover" @click="disableIntegration"> <button class="destructive-on-hover" @click="disableIntegration">

View File

@ -0,0 +1,32 @@
"""Add webhook profile picture
Revision ID: c242e3f99c64
Revises: 286ee26b9e5d
Create Date: 2024-11-27 10:40:39.027786
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c242e3f99c64'
down_revision = '286ee26b9e5d'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('team_discord_integrations', schema=None) as batch_op:
batch_op.add_column(sa.Column('webhook_bot_profile_picture', sa.String(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('team_discord_integrations', schema=None) as batch_op:
batch_op.drop_column('webhook_bot_profile_picture')
# ### end Alembic commands ###

View File

@ -36,7 +36,6 @@ class Team(app_db.BaseModel):
def update_integrations(self, integrations: "TeamIntegrationSchema"): def update_integrations(self, integrations: "TeamIntegrationSchema"):
if integrations.discord_integration: if integrations.discord_integration:
print("DISCORD!!!")
discord_integration = self.discord_integration \ discord_integration = self.discord_integration \
or TeamDiscordIntegration() or TeamDiscordIntegration()
discord_integration.webhook_url = integrations \ discord_integration.webhook_url = integrations \
@ -44,6 +43,10 @@ class Team(app_db.BaseModel):
discord_integration.webhook_bot_name = integrations \ discord_integration.webhook_bot_name = integrations \
.discord_integration.webhook_bot_name .discord_integration.webhook_bot_name
if integrations.discord_integration.webhook_bot_profile_picture:
discord_integration.webhook_bot_profile_picture = integrations \
.discord_integration.webhook_bot_profile_picture
if discord_integration.team_id is None: if discord_integration.team_id is None:
discord_integration.team_id = self.id discord_integration.team_id = self.id
app_db.db.session.add(discord_integration) app_db.db.session.add(discord_integration)

View File

@ -1,3 +1,4 @@
from typing import Optional
from sqlalchemy.orm import mapped_column, relationship from sqlalchemy.orm import mapped_column, relationship
from sqlalchemy.orm.attributes import Mapped from sqlalchemy.orm.attributes import Mapped
from sqlalchemy.orm.properties import ForeignKey from sqlalchemy.orm.properties import ForeignKey
@ -12,18 +13,21 @@ class TeamDiscordIntegration(app_db.BaseModel):
team_id: Mapped[int] = mapped_column(ForeignKey("teams.id"), primary_key=True) team_id: Mapped[int] = mapped_column(ForeignKey("teams.id"), primary_key=True)
webhook_url: Mapped[str] = mapped_column(String) webhook_url: Mapped[str] = mapped_column(String)
webhook_bot_name: Mapped[str] = mapped_column(String) webhook_bot_name: Mapped[str] = mapped_column(String)
webhook_bot_profile_picture: Mapped[str] = mapped_column(String(255), nullable=True)
team: Mapped["Team"] = relationship("Team", back_populates="discord_integration") team: Mapped["Team"] = relationship("Team", back_populates="discord_integration")
class TeamDiscordIntegrationSchema(spec.BaseModel): class TeamDiscordIntegrationSchema(spec.BaseModel):
webhook_url: str webhook_url: str
webhook_bot_name: str webhook_bot_name: str
webhook_bot_profile_picture: Optional[str]
@classmethod @classmethod
def from_model(cls, model: TeamDiscordIntegration) -> "TeamDiscordIntegrationSchema": def from_model(cls, model: TeamDiscordIntegration) -> "TeamDiscordIntegrationSchema":
return cls( return cls(
webhook_url=model.webhook_url, webhook_url=model.webhook_url,
webhook_bot_name=model.webhook_bot_name, webhook_bot_name=model.webhook_bot_name,
webhook_bot_profile_picture=model.webhook_bot_profile_picture,
) )
class TeamLogsTfIntegration(app_db.BaseModel): class TeamLogsTfIntegration(app_db.BaseModel):