From c82a39796f97aa7cabc5db7b842114a68075b6c6 Mon Sep 17 00:00:00 2001 From: Muchogo Date: Mon, 13 Feb 2023 14:22:03 +0300 Subject: [PATCH] feat: decrease count on content unbookmark/unlike - exclude content interaction models from organisation middleware --- .pre-commit-config.yaml | 6 +++--- mycarehub/clients/models.py | 1 - mycarehub/common/filters/common_filters.py | 1 - .../common/filters/custom_filter_backends.py | 16 ++++++++++++++-- mycarehub/common/models/program_models.py | 1 - .../common/serializers/common_serializers.py | 1 - mycarehub/common/tests/test_utils.py | 1 - .../views/common_views/drf_common_views.py | 1 - mycarehub/content/models/media.py | 1 - mycarehub/content/models/models.py | 1 - mycarehub/content/serializers.py | 5 ----- mycarehub/content/signals.py | 16 +++++++++++++++- mycarehub/content/tests/test_wagtail_hooks.py | 2 -- mycarehub/content/views/signed_url.py | 1 - mycarehub/content/wagtail_hooks.py | 1 - mycarehub/users/admin.py | 1 - mycarehub/users/tests/factories.py | 1 - mycarehub/users/tests/test_adapters.py | 1 - mycarehub/users/views.py | 3 --- mycarehub/utils/tests/test_signed_url.py | 1 - 20 files changed, 32 insertions(+), 30 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7ee04fe..57bb8c4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,20 +4,20 @@ fail_fast: true repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: v4.4.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - repo: https://github.com/psf/black - rev: 22.12.0 + rev: 23.1.0 hooks: - id: black args: ["-l", "99"] - repo: https://github.com/timothycrosley/isort - rev: 5.11.4 + rev: 5.12.0 hooks: - id: isort args: ["--profile", "black"] diff --git a/mycarehub/clients/models.py b/mycarehub/clients/models.py index 1b5654e..f8f0398 100644 --- a/mycarehub/clients/models.py +++ b/mycarehub/clients/models.py @@ -8,7 +8,6 @@ class Client(AbstractBase): - name = CharField(_("Name of Client"), blank=True, max_length=255) gender = CharField(choices=GenderChoices.choices, max_length=16, null=True, blank=True) date_of_birth = DateField(null=True, blank=True) diff --git a/mycarehub/common/filters/common_filters.py b/mycarehub/common/filters/common_filters.py index 4968d63..c36b3d0 100644 --- a/mycarehub/common/filters/common_filters.py +++ b/mycarehub/common/filters/common_filters.py @@ -17,7 +17,6 @@ class Meta: class UserFacilityAllotmentFilter(CommonFieldsFilterset): - search = filters.SearchFilter() class Meta: diff --git a/mycarehub/common/filters/custom_filter_backends.py b/mycarehub/common/filters/custom_filter_backends.py index f3cb39b..197ca93 100644 --- a/mycarehub/common/filters/custom_filter_backends.py +++ b/mycarehub/common/filters/custom_filter_backends.py @@ -1,6 +1,12 @@ from rest_framework import filters -from mycarehub.content.models import ContentItemCategory +from mycarehub.content.models import ( + ContentBookmark, + ContentItemCategory, + ContentLike, + ContentShare, + ContentView, +) class OrganisationFilterBackend(filters.BaseFilterBackend): @@ -8,6 +14,12 @@ class OrganisationFilterBackend(filters.BaseFilterBackend): def filter_queryset(self, request, queryset, view): """Filter all records that have an organisation field by user org.""" - if queryset.model in [ContentItemCategory]: + if queryset.model in [ + ContentItemCategory, + ContentBookmark, + ContentLike, + ContentShare, + ContentView, + ]: return queryset return queryset.filter(organisation=request.user.organisation) diff --git a/mycarehub/common/models/program_models.py b/mycarehub/common/models/program_models.py index c1f05f4..0ad96c4 100644 --- a/mycarehub/common/models/program_models.py +++ b/mycarehub/common/models/program_models.py @@ -5,7 +5,6 @@ class Program(AbstractBase): - name = models.TextField(max_length=100, unique=True) facilities = models.ManyToManyField(Facility, blank=True, related_name="programs") diff --git a/mycarehub/common/serializers/common_serializers.py b/mycarehub/common/serializers/common_serializers.py index be1b271..7e9ca26 100644 --- a/mycarehub/common/serializers/common_serializers.py +++ b/mycarehub/common/serializers/common_serializers.py @@ -37,7 +37,6 @@ class Meta(BaseSerializer.Meta): class UserFacilityAllotmentSerializer(BaseSerializer): - user_data = SimpleUserSerializer(source="user", read_only=True) user_name = serializers.ReadOnlyField(source="user.__str__") allotment_type_name = serializers.ReadOnlyField(source="get_allotment_type_display") diff --git a/mycarehub/common/tests/test_utils.py b/mycarehub/common/tests/test_utils.py index ceadb38..1ab7b53 100644 --- a/mycarehub/common/tests/test_utils.py +++ b/mycarehub/common/tests/test_utils.py @@ -32,7 +32,6 @@ def mock_baker(values): ) class _Baker(baker.Baker): - fields = values def _get_field_names(self): diff --git a/mycarehub/common/views/common_views/drf_common_views.py b/mycarehub/common/views/common_views/drf_common_views.py index 4366946..8838820 100644 --- a/mycarehub/common/views/common_views/drf_common_views.py +++ b/mycarehub/common/views/common_views/drf_common_views.py @@ -72,7 +72,6 @@ def post(self, request, format=None): class ProgramAPIView(APIView): - queryset = Program.objects.all() serializer_class = ProgramRegistrationSerializer diff --git a/mycarehub/content/models/media.py b/mycarehub/content/models/media.py index ecf2cc3..2d94093 100644 --- a/mycarehub/content/models/media.py +++ b/mycarehub/content/models/media.py @@ -6,7 +6,6 @@ class CustomMedia(AbstractMedia): - organisation = models.ForeignKey( Organisation, on_delete=models.PROTECT, diff --git a/mycarehub/content/models/models.py b/mycarehub/content/models/models.py index 4cabcfb..7e52533 100644 --- a/mycarehub/content/models/models.py +++ b/mycarehub/content/models/models.py @@ -95,7 +95,6 @@ class ContentItemTagIndexPage(Page): ] def get_context(self, request): - # Filter by tag tag = request.GET.get("tag") content_items = ContentItem.objects.filter(tags__name=tag) diff --git a/mycarehub/content/serializers.py b/mycarehub/content/serializers.py index ab53227..f4d128a 100644 --- a/mycarehub/content/serializers.py +++ b/mycarehub/content/serializers.py @@ -15,7 +15,6 @@ class ContentItemCategorySerializer(BaseSerializer): - icon_url = serializers.SerializerMethodField() def get_icon_url(self, category): @@ -30,7 +29,6 @@ class Meta(BaseSerializer.Meta): class ContentViewSerializer(BaseSerializer): def create(self, validated_data): - with transaction.atomic(): content_view = ContentView.objects.create(**validated_data) @@ -46,7 +44,6 @@ class Meta(BaseSerializer.Meta): class ContentShareSerializer(BaseSerializer): def create(self, validated_data): - with transaction.atomic(): content_share = ContentShare.objects.create(**validated_data) @@ -62,7 +59,6 @@ class Meta(BaseSerializer.Meta): class ContentLikeSerializer(BaseSerializer): def create(self, validated_data): - with transaction.atomic(): content_like = ContentLike.objects.create(**validated_data) @@ -78,7 +74,6 @@ class Meta(BaseSerializer.Meta): class ContentBookmarkSerializer(BaseSerializer): def create(self, validated_data): - with transaction.atomic(): content_bookmark = ContentBookmark.objects.create(**validated_data) diff --git a/mycarehub/content/signals.py b/mycarehub/content/signals.py index 44fdb13..518f3d1 100644 --- a/mycarehub/content/signals.py +++ b/mycarehub/content/signals.py @@ -1,11 +1,13 @@ from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist -from django.db.models.signals import post_save +from django.db.models import F +from django.db.models.signals import post_delete, post_save from django.dispatch import receiver from wagtail.models import Page, Site from mycarehub.common.models import Program +from mycarehub.content.models import ContentBookmark, ContentItem, ContentLike from mycarehub.home.models import HomePage from .models import ContentItemIndexPage @@ -58,3 +60,15 @@ def create_program_content_index_page(sender, instance, created, **kwargs): content_item_index.program = instance content_item_index.save() + + +@receiver(post_delete, sender=ContentLike) +def reduce_like_count(sender, instance, *args, **kwargs): + ContentItem.objects.filter(id=instance.content_item.id).update(like_count=F("like_count") - 1) + + +@receiver(post_delete, sender=ContentBookmark) +def reduce_bookmark_count(sender, instance, *args, **kwargs): + ContentItem.objects.filter(id=instance.content_item.id).update( + bookmark_count=F("bookmark_count") - 1 + ) diff --git a/mycarehub/content/tests/test_wagtail_hooks.py b/mycarehub/content/tests/test_wagtail_hooks.py index d4645f7..0d0a865 100644 --- a/mycarehub/content/tests/test_wagtail_hooks.py +++ b/mycarehub/content/tests/test_wagtail_hooks.py @@ -107,7 +107,6 @@ def test_set_content_item_program_after_page_create( request_with_user, content_item_index, ): - # get a hero image hero = baker.make("content.CustomImage", _create_files=True) # set up a content item @@ -219,7 +218,6 @@ def test_show_organisation_media_only(request_with_user): def test_hide_explorer_menu_item_from_non_superuser(request_with_user, admin_user): - hide_explorer_menu_item_from_non_superuser( request=request_with_user, menu_items=[MenuItem("settings", "sample/")] ) diff --git a/mycarehub/content/views/signed_url.py b/mycarehub/content/views/signed_url.py index be0a810..4062af3 100644 --- a/mycarehub/content/views/signed_url.py +++ b/mycarehub/content/views/signed_url.py @@ -10,7 +10,6 @@ class SignedURLView(generic.View): def post(self, request, *args, **kwargs): - # Checks the storage class being used # Storage class should be Google Cloud Storage for signed url generation to proceed if get_storage_class().__name__ != "MediaRootGoogleCloudStorage": diff --git a/mycarehub/content/wagtail_hooks.py b/mycarehub/content/wagtail_hooks.py index 3afeb84..3e35510 100644 --- a/mycarehub/content/wagtail_hooks.py +++ b/mycarehub/content/wagtail_hooks.py @@ -42,7 +42,6 @@ def before_publish_page(request, page): """ if page.specific_class == ContentItem: - if page.item_type == "AUDIO_VIDEO" and page.featured_media.count() == 0: msg = ( "an AUDIO_VIDEO content item must have at least one video " diff --git a/mycarehub/users/admin.py b/mycarehub/users/admin.py index 67305de..b1e1e7e 100644 --- a/mycarehub/users/admin.py +++ b/mycarehub/users/admin.py @@ -13,7 +13,6 @@ @admin.register(User) class UserAdmin(auth_admin.UserAdmin): - form = UserChangeForm add_form = UserCreationForm fieldsets = ( diff --git a/mycarehub/users/tests/factories.py b/mycarehub/users/tests/factories.py index edd306c..c414495 100644 --- a/mycarehub/users/tests/factories.py +++ b/mycarehub/users/tests/factories.py @@ -6,7 +6,6 @@ class UserFactory(DjangoModelFactory): - username = Faker("user_name") email = Faker("email") name = Faker("name") diff --git a/mycarehub/users/tests/test_adapters.py b/mycarehub/users/tests/test_adapters.py index 9037843..0e52a36 100644 --- a/mycarehub/users/tests/test_adapters.py +++ b/mycarehub/users/tests/test_adapters.py @@ -5,7 +5,6 @@ class TestAdapters: def test_is_open_for_signup(self): - req = MagicMock() social_login = MagicMock() diff --git a/mycarehub/users/views.py b/mycarehub/users/views.py index ba66846..959fa2d 100644 --- a/mycarehub/users/views.py +++ b/mycarehub/users/views.py @@ -11,7 +11,6 @@ class UserDetailView(LoginRequiredMixin, DetailView): - model = User slug_field = "username" slug_url_kwarg = "username" @@ -21,7 +20,6 @@ class UserDetailView(LoginRequiredMixin, DetailView): class UserUpdateView(LoginRequiredMixin, ApprovedMixin, SuccessMessageMixin, UpdateView): - model = User fields = ["name"] success_message = _("Information successfully updated") @@ -37,7 +35,6 @@ def get_object(self): class UserRedirectView(LoginRequiredMixin, ApprovedMixin, RedirectView): - permanent = False permission_required = "users.can_view_dashboard" diff --git a/mycarehub/utils/tests/test_signed_url.py b/mycarehub/utils/tests/test_signed_url.py index 4ac5adb..e073436 100644 --- a/mycarehub/utils/tests/test_signed_url.py +++ b/mycarehub/utils/tests/test_signed_url.py @@ -4,7 +4,6 @@ def test_generate_signed_upload_url(): - name = generate_media_name(file_name="Test File.mp4") link = generate_signed_upload_url( bucket_name=settings.GS_BUCKET_NAME,