Turning on
Input parameters we need to set up a broadcast delivery manually:
- campaign IDs -
campaigns - a criteria for users to be included into regular campaign deliveries (e.g. users with age less than or equal to 30) -
max_age - an interval for the regular campaign deliveries (it is often set lower than the original campaign delivery interval) -
segment_delivery_interval - an interval for the broadcast delivery (should be set to the original campaign delivery interval if not provided)
The next script should be executed on any manager service:
from django_celery_beat.models import IntervalSchedule
from apps.campaigns.models import MessageCampaign, BroadCastIntervalDelivery
from webpush.apps.segments.schema import ChannelSegment, SegmentItem
from webpush.apps.segments.constants import SegmentFunctionMethods, SegmentFunctions
from webpush.apps.users.models import CustomUser
from apps.channels.models import Segment
max_age = 30
segment_delivery_interval = 30
# campaigns = [36836, 37341, 37397, 37379, 37391, 37293, 34388, 37355]
# campaigns = [37016, 37014, 37012, 37010, 36964, 36962, 36960, 36958, 37068, 37070, 37071, 37148, 37149, 37151, 36846, 36849, 36851, 36900, 36902, 36904]
campaigns = [37356, 37358, 35847, 33837, 35905, 37363, 37364, 37365, 33836, 34746, 37294, 37295, 37264, 37272, 37360, 37361, 37362, 37437, 37438, 37439, 34405, 34406, 37265, 37278, 28637, 28638, 37265, 37278, 28637, 28638, 34388, 37686, 34839, 34390, 37628, 37629, 37630, 37447, 37448, 37449, 37509, 37511, 37512, 37419, 37444, 37446, 37507, 37483, 33947, 37470, 37508, 14179, 36835, 28806, 28806, 34138, 37484, 35831, 35831, 33945, 18826, 33981, 37485, 28807, 37469, 26438, 33987, 33944, 34156, 34315, 34159, 34317, 34470, 34162, 34427, 34473, 34165, 34157, 36712, 34556, 34471, 36717, 36720, 36723, 36722, 37397, 34153, 35915, 35916, 37385, 37445, 36721, 36100, 37379, 37384, 34553, 34537, 34538, 34428, 34163]
# owner_email = "ivashe4ca@gmail.com"
# owner_email = "alinkaser2017@gmail.com"
owner_email = "ivashe4ca@gmail.com"
campaigns_done = set([])
failed_campaign_errors = {}
for campaign_id in campaigns:
if campaign_id in campaigns_done or campaign_id in failed_campaign_errors:
print(f'Campaign {campaign_id} already processed or had errors, skipping...')
continue
try:
campaign = MessageCampaign.objects.get(id=campaign_id)
except Exception as e:
failed_campaign_errors[campaign_id] = str(e)
continue
if campaign.segment is not None:
failed_campaign_errors[campaign_id] = f"Campaign already has a segment: {campaign.segment.name}"
continue
assert campaign.segment is None
assert campaign.channel is not None
channel = campaign.channel
owner = CustomUser.objects.get(email=owner_email)
try:
segment = Segment.objects.create(payload_json=ChannelSegment(channel_ids=[channel.id], elements=[
SegmentItem.make_function(
name=SegmentFunctions.USER_AGE,
method=SegmentFunctionMethods.LESS_EQUAL,
value=str(max_age), order=0, level=1
)
]).dict(), owner=owner, name=f'{channel.id} AGE <= {max_age}')
except Exception as e:
segment = None
if segment is None:
try:
segment = Segment.objects.get(owner=owner, name=f'{channel.id} AGE <= 30')
except Segment.DoesNotExist:
failed_campaign_errors[campaign_id] = f"Segment creation failed for campaign {campaign_id}: {str(e)}"
continue
campaign.segment = segment
campaign.save()
regular_delivery = campaign.get_delivery()
if regular_delivery is None:
print(f'No regular delivery found for campaign {campaign_id}, skipping...')
continue
broadcast = BroadCastIntervalDelivery.objects.create(
campaign_id=campaign_id,
pool_id=regular_delivery.pool_id,
)
error = None
if regular_delivery.interval is None:
error = "Regular delivery interval is None"
if regular_delivery.interval.every is None:
error = "Regular delivery interval 'every' is None"
if regular_delivery.interval.period is None:
error = "Regular delivery interval 'period' is None"
if error is not None:
print(f'Error for campaign {campaign_id}: {error}')
failed_campaign_errors[campaign_id] = error
campaign.segment = None
campaign.save()
segment.delete()
broadcast.delete()
continue
assert regular_delivery.interval is not None
assert regular_delivery.interval.every is not None
assert regular_delivery.interval.period is not None
print(f'Creating broadcast for campaign {campaign_id} with interval {regular_delivery.interval.every} {regular_delivery.interval.period}')
broadcast.interval.set(every=regular_delivery.interval.every, period=regular_delivery.interval.period)
broadcast.save()
print(f'Setting segment delivery interval to {segment_delivery_interval} seconds for campaign {campaign_id}')
regular_delivery.interval.set(every=segment_delivery_interval, period=IntervalSchedule.SECONDS)
regular_delivery.save()
campaigns_done.add(campaign_id)
print('=================================')Turning off
from apps.campaigns.models import MessageCampaign, BroadCastIntervalDelivery
# campaigns = [36836, 37341, 37397, 37379, 37391, 37293, 34388, 37355]
# campaigns = [37016, 37014, 37012, 37010, 36964, 36962, 36960, 36958, 37068, 37070, 37071, 37148, 37149, 37151, 36846, 36849, 36851, 36900, 36902, 36904]
campaigns = [37356, 37358, 35847, 33837, 35905, 37363, 37364, 37365, 33836, 34746, 37294, 37295, 37264, 37272, 37360, 37361, 37362, 37437, 37438, 37439, 34405, 34406, 37265, 37278, 28637, 28638, 37265, 37278, 28637, 28638, 34388, 37686, 34839, 34390, 37628, 37629, 37630, 37447, 37448, 37449, 37509, 37511, 37512, 37419, 37444, 37446, 37507, 37483, 33947, 37470, 37508, 14179, 36835, 28806, 28806, 34138, 37484, 35831, 35831, 33945, 18826, 33981, 37485, 28807, 37469, 26438, 33987, 33944, 34156, 34315, 34159, 34317, 34470, 34162, 34427, 34473, 34165, 34157, 36712, 34556, 34471, 36717, 36720, 36723, 36722, 37397, 34153, 35915, 35916, 37385, 37445, 36721, 36100, 37379, 37384, 34553, 34537, 34538, 34428, 34163]
# owner_email = "ivashe4ca@gmail.com"
# owner_email = "alinkaser2017@gmail.com"
owner_email = "ivashe4ca@gmail.com"
campaigns_done = set([])
failed_campaign_errors = {}
for campaign_id in campaigns:
if campaign_id in campaigns_done or campaign_id in failed_campaign_errors:
print(f'Campaign {campaign_id} already processed or had errors, skipping...')
continue
try:
campaign = MessageCampaign.objects.get()
except Exception as e:
failed_campaign_errors[campaign_id] = str(e)
continue
if campaign.segment is None:
failed_campaign_errors[campaign_id] = f"Campaign does not have a segment: {campaign.segment.name}"
continue
assert campaign.segment is not None
assert campaign.channel is not None
if campaign.segment.name is not None and not campaign.segment.name.endswith('AGE <= 30'):
failed_campaign_errors[campaign_id] = f"It is not a segment we are looking for: {campaign.segment.name}"
continue
campaign.segment.delete()
for delivery in BroadCastIntervalDelivery.objects.filter(campaign_id=campaign_id):
delivery.delete()
campaigns_done.add(campaign_id)
print('=================================')