🔍 Overview

This document describes the Celery tasks that initiate Google Search Console appeals via the external gsc-gui-tools service.

The tasks create and update GSC request models:

  • DomainAppealRequest — appeal for blocked domains (links + tracking domains)

⏱ Schedule (Celery Beat)

Configured in config/settings.py:

  • schedule_domain_appeals_task — every APPEAL_SENDER_INTERVAL seconds
  • check_backups_via_gsb_and_send_appeals_task — every 12 hours at minute 30

📝 Task Definitions

@celery.task
def schedule_domain_appeals_task():
    domains_map = Link.get_blocked_by_google_domains_map()
    tracking_domains_map = TrackingDomainPipeline.get_blocked_domains_map()
 
    for map in (domains_map, tracking_domains_map):
        for domain, owners in map.items():
            for owner in owners:
                if not DomainAppealRequest.can_send_appeal(domain, owner.id):
                    continue
                send_appeal_task.delay(domain, owner.id)
 
 
@celery.task
def check_backups_via_gsb_and_send_appeals_task():
    domain_map = Link.get_domains_map(status=LinkStatuses.BACKUP)
 
    for chunk_domains in chunked(list(domain_map.keys())):
        unsafe_domains = GoogleSafeBrowsing.check_links(chunk_domains)
        if unsafe_domains is None or len(unsafe_domains) == 0:
            continue
 
        for unsafe_domain in unsafe_domains.keys():
            unsafe_root_domain = extract_root_domain(unsafe_domain)
            links = domain_map.get(unsafe_domain, [])
            owner = links[0].owner
 
            if not DomainAppealRequest.can_send_appeal(unsafe_root_domain, owner.id):
                continue
 
            send_appeal_task.delay(unsafe_root_domain, owner.id)
            TelegramSender.send_backup_domain_unsafe_message(unsafe_domain, owner)
 
 
@celery.task
def send_appeal_task(domain: str, owner_id: int, force: bool = False):
    owner = UserModel.objects.get(id=owner_id)
    if not DomainAppealRequest.can_send_appeal(domain, owner_id) and not force:
        return
    DomainAppealRequest.init_domain_appeal(domain, owner)

⚙️ Task Behavior & Flow

  1. Appeals for blocked domains

    • Collects blocked root domains from Links and Tracking Domain Pipelines.
    • For each (domain, owner) pair, checks cooldown via DomainAppealRequest.can_send_appeal(...).
    • Enqueues send_appeal_task.
  2. Appeals for unsafe backup domains

    • Checks BACKUP link domains via Google Safe Browsing.
    • For each unsafe backup domain, sends an appeal for its root domain.
    • Sends a Telegram notification that a backup domain is unsafe (informational only).
  3. Sending an appeal

    • Creates a DomainAppealRequest and sends the request to gsc-gui-tools.
    • The request is later finalized by the callback endpoint (updates is_sent, finished_at, screenshot_url, etc.).