| conversation_id = str(conversation_id) | conversation_id = str(conversation_id) | ||||
| return _get_conversation(app_id, conversation_id, 'completion') | return _get_conversation(app_id, conversation_id, 'completion') | ||||
| @setup_required | |||||
| @login_required | |||||
| @account_initialization_required | |||||
| def delete(self, app_id, conversation_id): | |||||
| app_id = str(app_id) | |||||
| conversation_id = str(conversation_id) | |||||
| app = _get_app(app_id, 'chat') | |||||
| conversation = db.session.query(Conversation) \ | |||||
| .filter(Conversation.id == conversation_id, Conversation.app_id == app.id).first() | |||||
| if not conversation: | |||||
| raise NotFound("Conversation Not Exists.") | |||||
| conversation.is_deleted = True | |||||
| db.session.commit() | |||||
| return {'result': 'success'}, 204 | |||||
| class ChatConversationApi(Resource): | class ChatConversationApi(Resource): | ||||
| conversation_id = str(conversation_id) | conversation_id = str(conversation_id) | ||||
| return _get_conversation(app_id, conversation_id, 'chat') | return _get_conversation(app_id, conversation_id, 'chat') | ||||
| @setup_required | |||||
| @login_required | |||||
| @account_initialization_required | |||||
| def delete(self, app_id, conversation_id): | |||||
| app_id = str(app_id) | |||||
| conversation_id = str(conversation_id) | |||||
| # get app info | |||||
| app = _get_app(app_id, 'chat') | |||||
| conversation = db.session.query(Conversation) \ | |||||
| .filter(Conversation.id == conversation_id, Conversation.app_id == app.id).first() | |||||
| if not conversation: | |||||
| raise NotFound("Conversation Not Exists.") | |||||
| conversation.is_deleted = True | |||||
| db.session.commit() | |||||
| return {'result': 'success'}, 204 | |||||
| except services.errors.conversation.LastConversationNotExistsError: | except services.errors.conversation.LastConversationNotExistsError: | ||||
| raise NotFound("Last Conversation Not Exists.") | raise NotFound("Last Conversation Not Exists.") | ||||
| class ConversationDetailApi(AppApiResource): | |||||
| @marshal_with(conversation_fields) | |||||
| def delete(self, app_model, end_user, c_id): | |||||
| if app_model.mode != 'chat': | |||||
| raise NotChatAppError() | |||||
| conversation_id = str(c_id) | |||||
| parser = reqparse.RequestParser() | |||||
| parser.add_argument('user', type=str, location='args') | |||||
| args = parser.parse_args() | |||||
| if end_user is None and args['user'] is not None: | |||||
| end_user = create_or_update_end_user_for_user_id(app_model, args['user']) | |||||
| try: | |||||
| ConversationService.delete(app_model, conversation_id, end_user) | |||||
| return {"result": "success"}, 204 | |||||
| except services.errors.conversation.ConversationNotExistsError: | |||||
| raise NotFound("Conversation Not Exists.") | |||||
| class ConversationRenameApi(AppApiResource): | class ConversationRenameApi(AppApiResource): | ||||
| api.add_resource(ConversationRenameApi, '/conversations/<uuid:c_id>/name', endpoint='conversation_name') | api.add_resource(ConversationRenameApi, '/conversations/<uuid:c_id>/name', endpoint='conversation_name') | ||||
| api.add_resource(ConversationApi, '/conversations') | api.add_resource(ConversationApi, '/conversations') | ||||
| api.add_resource(ConversationApi, '/conversations/<uuid:c_id>', endpoint='conversation') |
| """add is_deleted to conversations | |||||
| Revision ID: d3d503a3471c | |||||
| Revises: e32f6ccb87c6 | |||||
| Create Date: 2023-06-27 19:13:30.897981 | |||||
| """ | |||||
| from alembic import op | |||||
| import sqlalchemy as sa | |||||
| # revision identifiers, used by Alembic. | |||||
| revision = 'd3d503a3471c' | |||||
| down_revision = 'e32f6ccb87c6' | |||||
| branch_labels = None | |||||
| depends_on = None | |||||
| def upgrade(): | |||||
| # ### commands auto generated by Alembic - please adjust! ### | |||||
| with op.batch_alter_table('conversations', schema=None) as batch_op: | |||||
| batch_op.add_column(sa.Column('is_deleted', sa.Boolean(), server_default=sa.text('false'), nullable=False)) | |||||
| # ### end Alembic commands ### | |||||
| def downgrade(): | |||||
| # ### commands auto generated by Alembic - please adjust! ### | |||||
| with op.batch_alter_table('conversations', schema=None) as batch_op: | |||||
| batch_op.drop_column('is_deleted') | |||||
| # ### end Alembic commands ### |
| messages = db.relationship("Message", backref="conversation", lazy='select', passive_deletes="all") | messages = db.relationship("Message", backref="conversation", lazy='select', passive_deletes="all") | ||||
| message_annotations = db.relationship("MessageAnnotation", backref="conversation", lazy='select', passive_deletes="all") | message_annotations = db.relationship("MessageAnnotation", backref="conversation", lazy='select', passive_deletes="all") | ||||
| is_deleted = db.Column(db.Boolean, nullable=False, server_default=db.text('false')) | |||||
| @property | @property | ||||
| def model_config(self): | def model_config(self): | ||||
| model_config = {} | model_config = {} |
| return InfiniteScrollPagination(data=[], limit=limit, has_more=False) | return InfiniteScrollPagination(data=[], limit=limit, has_more=False) | ||||
| base_query = db.session.query(Conversation).filter( | base_query = db.session.query(Conversation).filter( | ||||
| Conversation.is_deleted == False, | |||||
| Conversation.app_id == app_model.id, | Conversation.app_id == app_model.id, | ||||
| Conversation.from_source == ('api' if isinstance(user, EndUser) else 'console'), | Conversation.from_source == ('api' if isinstance(user, EndUser) else 'console'), | ||||
| Conversation.from_end_user_id == (user.id if isinstance(user, EndUser) else None), | Conversation.from_end_user_id == (user.id if isinstance(user, EndUser) else None), | ||||
| Conversation.from_source == ('api' if isinstance(user, EndUser) else 'console'), | Conversation.from_source == ('api' if isinstance(user, EndUser) else 'console'), | ||||
| Conversation.from_end_user_id == (user.id if isinstance(user, EndUser) else None), | Conversation.from_end_user_id == (user.id if isinstance(user, EndUser) else None), | ||||
| Conversation.from_account_id == (user.id if isinstance(user, Account) else None), | Conversation.from_account_id == (user.id if isinstance(user, Account) else None), | ||||
| Conversation.is_deleted == False | |||||
| ).first() | ).first() | ||||
| if not conversation: | if not conversation: | ||||
| def delete(cls, app_model: App, conversation_id: str, user: Optional[Union[Account | EndUser]]): | def delete(cls, app_model: App, conversation_id: str, user: Optional[Union[Account | EndUser]]): | ||||
| conversation = cls.get_conversation(app_model, conversation_id, user) | conversation = cls.get_conversation(app_model, conversation_id, user) | ||||
| db.session.delete(conversation) | |||||
| conversation.is_deleted = True | |||||
| db.session.commit() | db.session.commit() |