From 233a9e1bd7bac962870e48e194294c28c01ac288 Mon Sep 17 00:00:00 2001 From: Rula Abu Hasna Date: Fri, 8 Sep 2023 11:34:28 +0200 Subject: [PATCH 01/11] Migrate the db tables will be used to replace the existing notificatons table --- ...onfig_notificationconfigstatus_and_more.py | 107 ++++++++++++++++++ core/models.py | 54 +++++++++ 2 files changed, 161 insertions(+) create mode 100644 core/migrations/0006_notificationconfig_notificationconfigstatus_and_more.py diff --git a/core/migrations/0006_notificationconfig_notificationconfigstatus_and_more.py b/core/migrations/0006_notificationconfig_notificationconfigstatus_and_more.py new file mode 100644 index 0000000..3436151 --- /dev/null +++ b/core/migrations/0006_notificationconfig_notificationconfigstatus_and_more.py @@ -0,0 +1,107 @@ +# Generated by Django 4.2.3 on 2023-09-08 09:33 + +import django.contrib.postgres.fields +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ( + "core", + "0005_rename_message_ts_notificationstatus_message_timestamp", + ), + ] + + operations = [ + migrations.CreateModel( + name="NotificationConfig", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("repo", models.TextField(null=True)), + ("owner", models.TextField(null=True)), + ("channel", models.TextField(null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "filters", + django.contrib.postgres.fields.ArrayField( + base_field=models.JSONField(null=True), + blank=True, + null=True, + size=None, + ), + ), + ( + "installation", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="notification_config", + to="core.slackinstallation", + ), + ), + ], + ), + migrations.CreateModel( + name="NotificationConfigStatus", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "status", + models.CharField( + choices=[("success", "Success"), ("error", "Error")], + default="success", + max_length=7, + ), + ), + ("pullid", models.TextField(null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ("message_timestamp", models.TextField(null=True)), + ( + "notification_config", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="notification_config_statuses", + to="core.notificationconfig", + ), + ), + ], + options={ + "indexes": [ + models.Index( + fields=["notification_config", "status", "pullid"], + name="core_notifi_notific_b85a75_idx", + ) + ], + }, + ), + migrations.AddIndex( + model_name="notificationconfig", + index=models.Index( + fields=["installation", "repo", "owner", "channel"], + name="core_notifi_install_8ea80a_idx", + ), + ), + migrations.AlterUniqueTogether( + name="notificationconfig", + unique_together={("installation", "repo", "owner", "channel")}, + ), + ] diff --git a/core/models.py b/core/models.py index c2c6133..8748071 100644 --- a/core/models.py +++ b/core/models.py @@ -2,6 +2,12 @@ from django.db import models +class NotificationFilters(models.TextChoices): + author = "author" + branch = "branch" + reviewer = "reviewer" + + # Create your models here. class SlackBot(models.Model): client_id = models.CharField(null=False, max_length=32) @@ -151,3 +157,51 @@ class Meta: fields=["notification", "status", "pullid", "channel"] ) ] + + +class NotificationConfig(models.Model): + installation = models.ForeignKey( + SlackInstallation, + on_delete=models.CASCADE, + related_name="notification_config", + ) + repo = models.TextField(null=True) + owner = models.TextField(null=True) + channel = models.TextField(null=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + filters = ArrayField( + models.JSONField(null=True), + blank=True, + null=True, + ) + + class Meta: + unique_together = (("installation", "repo", "owner", "channel"),) + indexes = [ + models.Index(fields=["installation", "repo", "owner", "channel"]) + ] + + +class NotificationConfigStatus(models.Model): + notification_config = models.ForeignKey( + NotificationConfig, + on_delete=models.CASCADE, + related_name="notification_config_statuses", + ) + status = models.CharField( + max_length=7, + choices=StatusOptions.choices, + default=StatusOptions.SUCCESS, + ) + pullid = models.TextField(null=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + message_timestamp = models.TextField( + null=True + ) # unique identifier for the message in slack https://api.slack.com/methods/chat.update#arg_ts + + class Meta: + indexes = [ + models.Index(fields=["notification_config", "status", "pullid"]) + ] From 2d1247a3cfe9e11553724362f38af0b82bbff6fb Mon Sep 17 00:00:00 2001 From: Rula Abu Hasna Date: Tue, 12 Sep 2023 17:53:19 +0200 Subject: [PATCH 02/11] Add Apache License to repo --- LICENSE | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5b472cf --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2023 Functional Software, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. From 5b1c619f2d13ac3aca4a30d3213c962cb9d42ff9 Mon Sep 17 00:00:00 2001 From: Rula Abu Hasna Date: Thu, 14 Sep 2023 14:40:28 +0200 Subject: [PATCH 03/11] Make all caps + use date time w/o tz --- ...py => 0006_notificationconfig_and_more.py} | 27 ++++++++++++++----- core/models.py | 15 ++++++----- 2 files changed, 30 insertions(+), 12 deletions(-) rename core/migrations/{0006_notificationconfig_notificationconfigstatus_and_more.py => 0006_notificationconfig_and_more.py} (82%) diff --git a/core/migrations/0006_notificationconfig_notificationconfigstatus_and_more.py b/core/migrations/0006_notificationconfig_and_more.py similarity index 82% rename from core/migrations/0006_notificationconfig_notificationconfigstatus_and_more.py rename to core/migrations/0006_notificationconfig_and_more.py index 3436151..d72a5f0 100644 --- a/core/migrations/0006_notificationconfig_notificationconfigstatus_and_more.py +++ b/core/migrations/0006_notificationconfig_and_more.py @@ -1,17 +1,15 @@ -# Generated by Django 4.2.3 on 2023-09-08 09:33 +# Generated by Django 4.2.3 on 2023-09-14 12:39 +import core.models import django.contrib.postgres.fields -import django.db.models.deletion from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ( - "core", - "0005_rename_message_ts_notificationstatus_message_timestamp", - ), + ("core", "0005_rename_message_ts_notificationstatus_message_timestamp"), ] operations = [ @@ -51,6 +49,23 @@ class Migration(migrations.Migration): ), ], ), + migrations.AlterField( + model_name="notificationstatus", + name="created_at", + field=core.models.DateTimeWithoutTZField(auto_now_add=True), + ), + migrations.AlterField( + model_name="notificationstatus", + name="status", + field=models.CharField( + choices=[("success", "Success"), ("error", "Error")], max_length=7 + ), + ), + migrations.AlterField( + model_name="notificationstatus", + name="updated_at", + field=core.models.DateTimeWithoutTZField(auto_now=True), + ), migrations.CreateModel( name="NotificationConfigStatus", fields=[ diff --git a/core/models.py b/core/models.py index 8748071..a6b98a5 100644 --- a/core/models.py +++ b/core/models.py @@ -1,11 +1,15 @@ from django.contrib.postgres.fields import ArrayField from django.db import models +from django.utils import timezone +class DateTimeWithoutTZField(models.DateTimeField): + def db_type(self, connection): + return "timestamp" class NotificationFilters(models.TextChoices): - author = "author" - branch = "branch" - reviewer = "reviewer" + AUTHOR = "author" + BRANCH = "branch" + REVIEWER = "reviewer" # Create your models here. @@ -141,11 +145,10 @@ class NotificationStatus(models.Model): status = models.CharField( max_length=7, choices=StatusOptions.choices, - default=StatusOptions.SUCCESS, ) pullid = models.TextField(null=True) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) + created_at = DateTimeWithoutTZField(auto_now_add=True) + updated_at = DateTimeWithoutTZField(auto_now=True) message_timestamp = models.TextField( null=True ) # message timestamp https://api.slack.com/methods/chat.update#arg_ts From 36b331904cb7e6e38d6d8733e24d707b9b9989c3 Mon Sep 17 00:00:00 2001 From: Rula Abuhasna <91732700+RulaKhaled@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:14:49 +0200 Subject: [PATCH 04/11] Update LICENSE --- LICENSE | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 200 insertions(+), 10 deletions(-) diff --git a/LICENSE b/LICENSE index 5b472cf..d97d939 100644 --- a/LICENSE +++ b/LICENSE @@ -1,13 +1,203 @@ -Copyright 2023 Functional Software, Inc. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - http://www.apache.org/licenses/LICENSE-2.0 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 Functional Software, Inc. dba Sentry (https://sentry.io) + and individual contributors. All rights reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From cac00e7a34cf022d8f3a65bbc08878ddab7b284c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Oct 2023 03:41:50 +0000 Subject: [PATCH 05/11] Bump urllib3 from 1.26.16 to 1.26.17 Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.16 to 1.26.17. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.16...1.26.17) --- updated-dependencies: - dependency-name: urllib3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9d5e99e..fa31a31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -75,7 +75,7 @@ sqlparse==0.4.4 # via # -r requirements.in # django -urllib3==1.26.16 +urllib3==1.26.17 # via # requests # sentry-sdk From ddcf84405004ed716707f6e11c3da2c79218367a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Nov 2023 21:48:05 +0000 Subject: [PATCH 06/11] Bump django from 4.2.3 to 4.2.7 Bumps [django](https://github.com/django/django) from 4.2.3 to 4.2.7. - [Commits](https://github.com/django/django/compare/4.2.3...4.2.7) --- updated-dependencies: - dependency-name: django dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fa31a31..3b4c9da 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,7 @@ certifi==2023.7.22 # sentry-sdk charset-normalizer==3.1.0 # via requests -django==4.2.3 +django==4.2.7 # via # -r requirements.in # django-csp @@ -27,6 +27,10 @@ django-csp==3.7 # via -r requirements.in djangorestframework==3.14.0 # via -r requirements.in +exceptiongroup==1.1.3 + # via + # anyio + # pytest gunicorn==20.1.0 # via -r requirements.in h11==0.14.0 @@ -75,6 +79,10 @@ sqlparse==0.4.4 # via # -r requirements.in # django +tomli==2.0.1 + # via pytest +typing-extensions==4.8.0 + # via asgiref urllib3==1.26.17 # via # requests From f1e6a8c2cab456f33d190342014e50cb3a09a0ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:01:04 +0000 Subject: [PATCH 07/11] Bump urllib3 from 1.26.17 to 1.26.18 Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.17 to 1.26.18. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.17...1.26.18) --- updated-dependencies: - dependency-name: urllib3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3b4c9da..fa9b3a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -83,7 +83,7 @@ tomli==2.0.1 # via pytest typing-extensions==4.8.0 # via asgiref -urllib3==1.26.17 +urllib3==1.26.18 # via # requests # sentry-sdk From db769188b55bb6bf65be2c2a16a5f79a175f4a9a Mon Sep 17 00:00:00 2001 From: Tom Hu Date: Tue, 23 Jan 2024 12:07:37 -0800 Subject: [PATCH 08/11] chore(ci): add fossa workflow --- .github/workflows/enforce-license-compliance.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/enforce-license-compliance.yml diff --git a/.github/workflows/enforce-license-compliance.yml b/.github/workflows/enforce-license-compliance.yml new file mode 100644 index 0000000..86be741 --- /dev/null +++ b/.github/workflows/enforce-license-compliance.yml @@ -0,0 +1,14 @@ +name: Enforce License Compliance + +on: + pull_request: + branches: [main, master] + +jobs: + enforce-license-compliance: + runs-on: ubuntu-latest + steps: + - name: 'Enforce License Compliance' + uses: getsentry/action-enforce-license-compliance@57ba820387a1a9315a46115ee276b2968da51f3d # main + with: + fossa_api_key: ${{ secrets.FOSSA_API_KEY }} From 8132ac6d762b96bbf9ec9978c23b91478ee53036 Mon Sep 17 00:00:00 2001 From: Rula Abu Hasna Date: Wed, 7 Feb 2024 16:12:15 +0100 Subject: [PATCH 09/11] fix the repeated notifications bug --- core/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/core/views.py b/core/views.py index a5d01e0..764a15d 100644 --- a/core/views.py +++ b/core/views.py @@ -93,6 +93,7 @@ def post(self, request, format=None): unfurl_links=False, ) notification_status.message_timestamp = response["ts"] + notification_status.status = "success" notification_status.save() logger.info( From 85bcb7bb71544dfd1ba152882f845d594ace24db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 18:20:52 +0000 Subject: [PATCH 10/11] Bump django from 4.2.7 to 4.2.10 Bumps [django](https://github.com/django/django) from 4.2.7 to 4.2.10. - [Commits](https://github.com/django/django/compare/4.2.7...4.2.10) --- updated-dependencies: - dependency-name: django dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fa9b3a9..7f1d9ea 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,7 @@ certifi==2023.7.22 # sentry-sdk charset-normalizer==3.1.0 # via requests -django==4.2.7 +django==4.2.10 # via # -r requirements.in # django-csp From c17458cf650c80c46caa78193be356b540ecf11c Mon Sep 17 00:00:00 2001 From: Rula Abu Hasna Date: Tue, 27 Feb 2024 16:18:05 +0100 Subject: [PATCH 11/11] Update to fetch current installation --- core/slack_datastores.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/core/slack_datastores.py b/core/slack_datastores.py index bb1fd11..337a18e 100644 --- a/core/slack_datastores.py +++ b/core/slack_datastores.py @@ -51,13 +51,11 @@ def save(self, installation: Installation): if is_naive(user_token_expires_at): user_token_expires_at = make_aware(user_token_expires_at) + # can have one installation per team id slack_installation = SlackInstallation.objects.filter( - client_id=self.client_id, - enterprise_id=installation.enterprise_id, team_id=installation.team_id, - installed_at=installed_at, ).first() - + if slack_installation is None: slack_installation = SlackInstallation() @@ -96,9 +94,14 @@ def save(self, installation: Installation): ) slack_installation.token_type = installation.token_type slack_installation.installed_at = installed_at + + try: + slack_installation.save() + self.save_bot(installation.to_bot()) + + except Exception as e: + self._logger.error(f"Error saving installation: {e}") - slack_installation.save() - self.save_bot(installation.to_bot()) def save_bot(self, bot: Bot): installed_at = bot.installed_at