vmesel/PyJobs

View on GitHub
pyjobs/marketing/triggers.py

Summary

Maintainability
A
35 mins
Test Coverage
A
91%
from datetime import datetime

from django.conf import settings
from django.core.mail import send_mail
from django.db import models
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from raven.contrib.django.raven_compat.models import client
from pyjobs.core.management.commands.generate_job_slugs_and_redirects import (
    create_job_redirect,
)
from pyjobs.marketing.newsletter import subscribe_user_to_mailer
from pyjobs.marketing.models import Messages, PushMessage
from pyjobs.core.models import Job, JobApplication, Profile
from pyjobs.marketing.utils import post_telegram_channel
from pyjobs.core.email_utils import get_email_with_template

from github import Github

from webpush import send_group_notification
from django.utils.translation import gettext_lazy as _


@receiver(post_save, sender=Profile)
def add_user_to_mailchimp(sender, instance, created, **kwargs):
    if instance.on_mailing_list:
        subscribe_user_to_mailer(instance)


@receiver(post_save, sender=JobApplication)
def send_email_notifing_job_application(sender, instance, created, **kwargs):
    if not created:
        return

    person_email_context = {
        "vaga": instance.job,
        "pessoa": instance.user.profile,
        "mensagem": instance,
    }

    company_email_context = person_email_context

    template_person = "job_application_registered"
    person_email_subject = str(_("Parabéns! Você se inscreveu na vaga!"))
    person_to_send_to = [instance.user.email]

    if instance.job.is_challenging:
        template_person = "job_interest_challenge"
        person_email_subject = " ".join(
            map(str, [_("Teste Técnico da empresa: "), instance.job.company_name, "!"])
        )
        instance.email_sent = True
        instance.email_sent_at = datetime.now()
        instance.save()

    msg_email_person = get_email_with_template(
        template_person, person_email_context, person_email_subject, person_to_send_to
    )
    msg_email_person.send()

    if instance.job.receive_emails:
        msg_email_company = get_email_with_template(
            "job_applicant",
            company_email_context,
            str(_("Você possui mais um candidato para a sua vaga")),
            [instance.job.company_email],
        )
        msg_email_company.send()


def send_offer_email_template(job):
    message = Messages.objects.filter(message_type="offer").first()
    message_text = message.message_content.format(company=job.company_name)
    message_title = message.message_title.format(title=job.title)
    send_mail(
        message_title,
        message_text,
        settings.WEBSITE_OWNER_EMAIL,
        [job.company_email],
    )


def send_feedback_collection_email(job):
    message = Messages.objects.filter(message_type="feedback")[0]
    message_text = message.message_content.format(company=job.company_name)
    message_title = message.message_title.format(title=job.title)
    send_mail(
        message_title,
        message_text,
        settings.WEBSITE_OWNER_EMAIL,
        [job.company_email, settings.WEBSITE_OWNER_EMAIL],
    )


def send_job_to_github_issues(job):
    g = Github(settings.GITHUB_ACCESS_TOKEN)
    repo = g.get_repo(settings.GITHUB_DEFAULT_REPO)
    issue_draft = Messages.objects.filter(message_type="github").first()
    issue_title = issue_draft.message_title.format(
        title=job.title, company_name=job.company_name, workplace=job.workplace
    )

    issue_content = issue_draft.message_content.format(
        description=job.description,
        requirements=job.requirements,
        workplace=job.workplace,
        state=job.get_state_display(),
        labels="\n - ".join([skill.name for skill in job.skills.all()]),
        contract_form=job.get_contract_form_display(),
        job_id=job.id,
        website_url=settings.WEBSITE_HOME_URL,
    )
    issue = repo.create_issue(issue_title, issue_content)
    job.issue_number = issue.id
    job.save()


@receiver(post_save, sender=Job)
def test(sender, instance, created, **kwargs):
    if not created or not instance.receive_emails:
        return False

    message_text = " ".join(
        map(
            str,
            [
                _("Nova oportunidade!"),
                instance.title,
                " - ",
                instance.company_name,
                _("em"),
                instance.workplace,
                "\n",
                f"{settings.WEBSITE_HOME_URL}/job/{instance.unique_slug}/",
            ],
        )
    )
    post_telegram_channel(message_text)

    msg = get_email_with_template(
        "published_job",
        {"vaga": instance},
        " ".join(
            map(str, [_("Sua oportunidade está disponível no"), settings.WEBSITE_NAME])
        ),
        [instance.company_email],
    )

    payload = {
        "head": " ".join(map(str, [_("Nova Vaga!"), instance.title])),
        "body": instance.description,
        "url": f"{settings.WEBSITE_HOME_URL}/job/{instance.pk}/",
    }

    msg.send()
    if not instance.issue_number:
        try:
            send_job_to_github_issues(instance)
        except:
            pass

    try:
        send_group_notification(group_name="general", payload=payload, ttl=1000)
    except:
        pass

    try:
        send_offer_email_template(instance)
    except:
        client.captureException()

    return True


@receiver(pre_save, sender=JobApplication)
def feedback_was_created(sender, instance, **kwargs):
    if not instance.id:
        return

    original_application = JobApplication.objects.get(id=instance.id)

    if original_application.company_feedback != instance.company_feedback:
        msg = get_email_with_template(
            "job_application_feedback",
            {
                "pessoa": instance.user,
                "vaga": instance.job,
                "job_application": instance,
            },
            " ".join(
                map(
                    str,
                    [
                        _("Você recebeu um feedback da vaga"),
                        instance.job.title,
                        _("na empresa"),
                        instance.job.company_name,
                    ],
                )
            ),
            [instance.user.email],
        )
        msg.send()


@receiver(post_save, sender=PushMessage)
def send_push_message(sender, instance, **kwargs):
    if not instance.id:
        return

    payload = {
        "head": instance.head,
        "body": instance.body,
        "url": instance.url,
    }
    send_group_notification(group_name="general", payload=payload, ttl=1000)


@receiver(post_save, sender=Job)
def new_job_was_created(sender, instance, created, **kwargs):
    if not created:
        return

    create_job_redirect(instance)