Skip to content
Snippets Groups Projects
Select Git revision
  • d7a5c6c892dd3bdf63007e2e3c61f2e99ae9bc71
  • master default protected
  • check/update-pyproject-toml
  • check/delete-eslint-rc-js
  • check/update-merge-request-template
  • check/update-builddeps-package-json
  • check/update-eslint-rc-js
  • check/update-prettier-ignore
  • check/update-tox-ini
  • check/update-gitignore
  • 22-add-api-endpoint-for-own-mail-addresses
  • tmp-ticdesk
  • rollback
  • 14-check-if-user-has-person-when-creating-mail-address
  • 13-drop-sites-framework
  • testing
  • 6-add-sympa-endpoints-for-include_remote_file
  • i10n-ru-ua
  • add-trademark
  • update/translations-20210608
  • 3.0.dev4
  • 3.0.dev3
  • 3.0.dev2
  • 3.0.dev0
24 results

schema.py

Blame
  • schema.py 5.20 KiB
    from django.conf import settings
    from django.core.exceptions import PermissionDenied
    from django.utils.translation import gettext_lazy as _
    
    import graphene
    from graphene_django import DjangoObjectType
    from graphene_django_cud.mutations import DjangoBatchPatchMutation, DjangoCreateMutation
    from guardian.shortcuts import get_objects_for_user
    
    from aleksis.core.models import Activity
    from aleksis.core.schema.base import (
        DeleteMutation,
        DjangoFilterMixin,
        FilterOrderList,
        PermissionBatchPatchMixin,
        PermissionsTypeMixin,
    )
    from aleksis.core.util.core_helpers import get_site_preferences, has_person
    from aleksis.core.util.email import send_email
    
    from .models import MailAddress, MailDomain
    
    
    class MailAddressType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
        class Meta:
            model = MailAddress
            filter_fields = {"domain": ["in"]}
    
    
    class MailDomainType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
        class Meta:
            model = MailDomain
            filter_fields = ("is_public",)
    
    
    class MailAddressCreateMutation(DjangoCreateMutation):
        class Meta:
            model = MailAddress
            permissions = ("postbuero.create_mailaddress",)
            exclude_fields = ("managed_by_app_label",)
    
        @classmethod
        def before_save(cls, root, info, input, obj):  # noqa
            obj.person = info.context.user.person
            return obj
    
        @classmethod
        def check_permissions(cls, root, info, input):  # noqa
            domain = MailDomain.objects.get(id=input.domain)
            if info.context.user.has_perm("postbuero.can_use_domain_rule", domain):
                return
            raise PermissionDenied()
    
        @classmethod
        def validate_local_part(cls, root, info, value, input, **kwargs):  # noqa
            if value in get_site_preferences()["postbuero__disallowed_local_parts"].split(","):
                raise ValueError(_("Local part name is disallowed"))
    
        @classmethod
        def after_mutate(cls, root, info, input, obj, return_data):  # noqa
            recipient_list = [return_data["mail_address"], info.context.user.person.email]
            mail_context = {}
            mail_context["person"] = info.context.user.person
    
            if get_site_preferences()["postbuero__confirmation_mail"]:
                mail_context["address"] = return_data["mail_address"]
                if get_site_preferences()["postbuero__admin_mail"]:
                    for admin in settings.ADMINS:
                        recipient_list.append(admin[1])
                # Send mail to user and admins
                send_email(
                    template_name="mail_added",
                    recipient_list=recipient_list,
                    context=mail_context,
                )
    
            # Create activity
            act = Activity(
                title=_("You have added an email address"),
                description=_(
                    f"You have added the email address {return_data['mail_address']} to your profile."
                ),
                app="Postbuero",
                user=mail_context["person"],
            )
            act.save()
    
    
    class MailDomainCreateMutation(DjangoCreateMutation):
        class Meta:
            model = MailDomain
            permissions = ("postbuero.create_maildomain",)
            exclude_fields = ("managed_by_app_label",)
    
    
    class MailDomainDeleteMutation(DeleteMutation):
        klass = MailDomain
        permission_required = "postbuero.delete_maildomain"
    
    
    class MailDomainBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
        class Meta:
            model = MailDomain
            permissions = ("postbuero.change_maildomain",)
    
    
    class Query(graphene.ObjectType):
        mail_addresses_for_user = FilterOrderList(MailAddressType)
    
        mail_domains_for_user = graphene.List(MailDomainType)
        editable_mail_domains_for_user = FilterOrderList(MailDomainType)
        public_mail_domains = graphene.List(MailDomainType)
    
        disallowed_local_parts = graphene.List(graphene.String)
    
        @staticmethod
        def resolve_mail_addresses_for_user(root, info, **kwargs):
            if has_person(info.context):
                mail_addresses = info.context.user.person.local_mail_addresses.all()
                return mail_addresses
            return []
    
        @staticmethod
        def resolve_mail_domains_for_user(root, info, **kwargs):
            mail_domains = get_objects_for_user(
                info.context.user, "postbuero.can_use_domain", MailDomain.objects.all()
            ).union(MailDomain.objects.filter(is_public=True))
            return mail_domains
    
        @staticmethod
        def resolve_editable_mail_domains_for_user(root, info, **kwargs):
            mail_domains = get_objects_for_user(
                info.context.user, "postbuero.change_maildomain", MailDomain.objects.all()
            )
            return mail_domains
    
        @staticmethod
        def resolve_public_mail_domains(root, info, **kwargs):
            mail_domains = MailDomain.objects.filter(is_public=True)
            return mail_domains
    
        @staticmethod
        def resolve_disallowed_local_parts(root, info, **kwargs):
            return get_site_preferences()["postbuero__disallowed_local_parts"].split(",")
    
    
    class Mutation(graphene.ObjectType):
        create_mail_address = MailAddressCreateMutation.Field()
    
        create_mail_domain = MailDomainCreateMutation.Field()
        delete_mail_domain = MailDomainDeleteMutation.Field()
        batch_patch_mail_domain = MailDomainBatchPatchMutation.Field()