From 0ae9faee065c6fa7c685fb4abed59523b7ae012c Mon Sep 17 00:00:00 2001 From: Moustapha Cheikh Date: Tue, 24 Sep 2024 10:45:50 +0200 Subject: [PATCH 1/2] Fix metaclass conflict in NotifyMixin and refactor related models --- core/models/access.py | 4 ++-- core/models/dataset.py | 4 ++-- core/models/document.py | 4 ++-- core/models/project.py | 4 ++-- core/models/utils.py | 6 ------ notification/__init__.py | 12 ++++-------- 6 files changed, 12 insertions(+), 22 deletions(-) diff --git a/core/models/access.py b/core/models/access.py index 25c13a7a..6ca25c36 100644 --- a/core/models/access.py +++ b/core/models/access.py @@ -13,7 +13,7 @@ from enumchoicefield import EnumChoiceField, ChoiceEnum -from .utils import CoreModel, CoreNotifyMeta +from .utils import CoreModel from notification import NotifyMixin from notification.models import NotificationVerb, Notification from core.utils import DaisyLogger @@ -35,7 +35,7 @@ class StatusChoices(ChoiceEnum): terminated = "Terminated" -class Access(CoreModel, NotifyMixin, metaclass=CoreNotifyMeta): +class Access(CoreModel, NotifyMixin): """ Represents the access given to an internal (LCSB) entity over data storage locations. """ diff --git a/core/models/dataset.py b/core/models/dataset.py index 938ea2a2..b52d4860 100644 --- a/core/models/dataset.py +++ b/core/models/dataset.py @@ -18,7 +18,7 @@ from core.permissions.mapping import PERMISSION_MAPPING from notification import NotifyMixin from notification.models import Notification, NotificationVerb -from .utils import CoreTrackedModel, TextFieldWithInputWidget, CoreNotifyMeta +from .utils import CoreTrackedModel, TextFieldWithInputWidget from .partner import HomeOrganisation if typing.TYPE_CHECKING: @@ -28,7 +28,7 @@ logger = DaisyLogger(__name__) -class Dataset(CoreTrackedModel, NotifyMixin, metaclass=CoreNotifyMeta): +class Dataset(CoreTrackedModel, NotifyMixin): class Meta: app_label = "core" get_latest_by = "added" diff --git a/core/models/document.py b/core/models/document.py index c1a791c3..7f1626a4 100644 --- a/core/models/document.py +++ b/core/models/document.py @@ -17,7 +17,7 @@ from django.core.files.storage import default_storage from django.urls import reverse -from .utils import CoreModel, CoreNotifyMeta +from .utils import CoreModel from core.utils import DaisyLogger from notification.models import Notification, NotificationVerb from notification import NotifyMixin @@ -39,7 +39,7 @@ def get_file_name(instance, filename): ) -class Document(CoreModel, NotifyMixin, metaclass=CoreNotifyMeta): +class Document(CoreModel, NotifyMixin): """ Represents a document """ diff --git a/core/models/project.py b/core/models/project.py index 8baa7c87..8f55f5ab 100644 --- a/core/models/project.py +++ b/core/models/project.py @@ -19,7 +19,7 @@ from notification.models import NotificationVerb, Notification from core.utils import DaisyLogger -from .utils import CoreTrackedModel, COMPANY, CoreNotifyMeta +from .utils import CoreTrackedModel, COMPANY from .partner import HomeOrganisation @@ -30,7 +30,7 @@ logger = DaisyLogger(__name__) -class Project(CoreTrackedModel, NotifyMixin, metaclass=CoreNotifyMeta): +class Project(CoreTrackedModel, NotifyMixin): class Meta: app_label = "core" get_latest_by = "added" diff --git a/core/models/utils.py b/core/models/utils.py index fbdb4515..6f2bd02c 100644 --- a/core/models/utils.py +++ b/core/models/utils.py @@ -10,8 +10,6 @@ from django.utils.module_loading import import_string from django.contrib.auth.hashers import make_password -from notification import NotifyMixin - COMPANY = getattr(settings, "COMPANY", "Company") @@ -48,10 +46,6 @@ class Meta: abstract = True -class CoreNotifyMeta(type(CoreModel), type(NotifyMixin)): - pass - - class CoreTrackedModel(CoreModel): elu_accession = models.CharField( unique=True, diff --git a/notification/__init__.py b/notification/__init__.py index 7d95d411..c87378d9 100644 --- a/notification/__init__.py +++ b/notification/__init__.py @@ -1,4 +1,3 @@ -from abc import ABC, abstractmethod import typing from typing import List, Optional from datetime import timedelta @@ -11,15 +10,14 @@ User = settings.AUTH_USER_MODEL -class NotifyMixin(ABC): +class NotifyMixin: @staticmethod - @abstractmethod def get_notification_recipients() -> List["User"]: """ Should query the users based on their notification settings and the entity. """ - pass + raise NotImplementedError("Subclasses must implement this method") @classmethod def make_notifications(cls, exec_date: "date"): @@ -41,7 +39,6 @@ def make_notifications(cls, exec_date: "date"): cls.make_notifications_for_user(day_offset, exec_date, user) @classmethod - @abstractmethod def make_notifications_for_user( cls, day_offset: "timedelta", exec_date: "date", user: "User" ): @@ -53,15 +50,14 @@ def make_notifications_for_user( exec_date: The date of execution of the task. user: The user to create the notification for. """ - pass + raise NotImplementedError("Subclasses must implement this method") @staticmethod - @abstractmethod def notify(user: "User", obj: object, verb: "NotificationVerb"): """ Notify the user about the entity. """ - pass + raise NotImplementedError("Subclasses must implement this method") @staticmethod def get_notification_setting(user: "User"): From 9425dd56d45baa15e8024b4e9969896e6f1c69e5 Mon Sep 17 00:00:00 2001 From: Moustapha Cheikh Date: Thu, 26 Sep 2024 09:24:12 +0200 Subject: [PATCH 2/2] Update main.yml --- .github/workflows/main.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3dbb49f8..fcdfd6b6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,17 +25,17 @@ jobs: run: cp elixir_daisy/settings_compose_ci.py elixir_daisy/settings_compose.py - name: Build and start containers - run: docker-compose up -d --build + run: docker compose up -d --build - name: Check code formatting with Black - run: docker-compose exec -T web black --check --verbose . + run: docker compose exec -T web black --check --verbose . - name: Install test dependencies - run: docker-compose exec -T web pip install ".[test]" + run: docker compose exec -T web pip install ".[test]" - name: Execute the tests - run: docker-compose exec -T web pytest + run: docker compose exec -T web pytest - name: Stop containers if: always() - run: docker-compose down + run: docker compose down