Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Remove the ability to edit the startdate of a live campaign
Browse files Browse the repository at this point in the history
  • Loading branch information
dwick committed Aug 24, 2015
1 parent e3183b2 commit efb9d0b
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 13 deletions.
1 change: 1 addition & 0 deletions r2/r2/controllers/api.py
Expand Up @@ -4560,6 +4560,7 @@ def POST_request_promo(self, srnames):
skip=True)
listing = LinkListing(builder, nextprev=False).listing()
promote.add_trackers(listing.things, c.site)
promote.update_served(listing.things)
if listing.things:
w = listing.things[0]
w.num = ""
Expand Down
37 changes: 29 additions & 8 deletions r2/r2/controllers/promotecontroller.py
Expand Up @@ -992,7 +992,7 @@ def POST_rm_roadblock(self, form, jquery, start, end, sr):
@validatedForm(
VSponsor('link_id36'),
VModhash(),
start=VDate('startdate'),
start=VDate('startdate', required=False),
end=VDate('enddate'),
link=VLink('link_id36'),
bid=VFloat('bid', coerce=False),
Expand Down Expand Up @@ -1066,18 +1066,39 @@ def POST_edit_campaign(self, form, jquery, link, campaign_id36,
form.has_errors('enddate', errors.BAD_DATE)):
return

if not campaign_id36 and not start:
c.errors.add(errors.BAD_DATE, field='startdate')
form.set_error('startdate', errors.BAD_DATE)

min_start, max_start, max_end = promote.get_date_limits(
link, c.user_is_sponsor)

if campaign_id36:
promo_campaign = PromoCampaign._byID36(campaign_id36)
if (promote.is_promoted(link) and
promo_campaign.start_date.date() <= min_start and
start != promo_campaign.start_date and
promo_campaign.is_paid):
c.errors.add(errors.START_DATE_CANNOT_CHANGE, field='startdate')
form.has_errors('startdate', errors.START_DATE_CANNOT_CHANGE)
return

# Start not sent for campaigns already serving,
# use the current start
if not start:
start = promo_campaign.start_date

if promo_campaign.start_date.date() != start.date():
# Can't edit the start date of campaigns that have served
if promo_campaign.has_served:
c.errors.add(errors.START_DATE_CANNOT_CHANGE, field='startdate')
form.has_errors('startdate', errors.START_DATE_CANNOT_CHANGE)
return

# Or that are live or completed
live_campaigns = promote.live_campaigns_by_link(link)
is_pending = promote.is_pending(promo_campaign)
is_live = promo_campaign in live_campaigns
is_complete = (promo_campaign.is_paid and
not (is_live or is_pending))
if is_live or is_complete:
c.errors.add(errors.START_DATE_CANNOT_CHANGE, field='startdate')
form.has_errors('startdate', errors.START_DATE_CANNOT_CHANGE)
return

elif start.date() < min_start:
c.errors.add(errors.DATE_TOO_EARLY,
msg_params={'day': min_start.strftime("%m/%d/%Y")},
Expand Down
4 changes: 1 addition & 3 deletions r2/r2/lib/pages/pages.py
Expand Up @@ -4283,12 +4283,10 @@ def from_campaigns(cls, link, campaigns, full_details=True):
transactions = {}
live_campaigns = []

today = promote.promo_datetime_now().date()

ret = []
for camp in campaigns:
transaction = transactions.get(camp._id)
is_pending = today < to_date(camp.start_date)
is_pending = promote.is_pending(camp)
is_live = camp in live_campaigns
is_complete = (camp.is_paid and
not (is_live or is_pending))
Expand Down
15 changes: 15 additions & 0 deletions r2/r2/lib/promote.py
Expand Up @@ -167,6 +167,9 @@ def is_finished(link):
def is_live_on_sr(link, sr):
return bool(live_campaigns_by_link(link, sr=sr))

def is_pending(campaign):
today = promo_datetime_now().date()
return today < to_date(campaign.start_date)

def update_query(base_url, query_updates):
scheme, netloc, path, params, query, fragment = urlparse.urlparse(base_url)
Expand All @@ -176,6 +179,18 @@ def update_query(base_url, query_updates):
return urlparse.urlunparse((scheme, netloc, path, params, query, fragment))


def update_served(items):
for item in items:
if not item.promoted:
continue

campaign = PromoCampaign._by_fullname(item.campaign)

if not campaign.has_served:
campaign.has_served = True
campaign._commit()


def add_trackers(items, sr, adserver_click_urls=None):
"""Add tracking names and hashes to a list of wrapped promoted links."""
adserver_click_urls = adserver_click_urls or {}
Expand Down
6 changes: 5 additions & 1 deletion r2/r2/lib/validator/validator.py
Expand Up @@ -2398,11 +2398,15 @@ class VDate(Validator):
"""

def __init__(self, param, format="%m/%d/%Y"):
def __init__(self, param, format="%m/%d/%Y", required=True):
self.format = format
self.required = required
Validator.__init__(self, param)

def run(self, datestr):
if not datestr and not self.required:
return None

try:
dt = datetime.strptime(datestr, self.format)
return dt.replace(tzinfo=g.tz)
Expand Down
1 change: 1 addition & 0 deletions r2/r2/models/promo.py
Expand Up @@ -317,6 +317,7 @@ class PromoCampaign(Thing):
android_version_names=None,
frequency_cap=None,
frequency_cap_duration=None,
has_served=False,
)

# special attributes that shouldn't set Thing data attributes because they
Expand Down
7 changes: 7 additions & 0 deletions r2/r2/public/static/js/sponsored.js
Expand Up @@ -1796,6 +1796,12 @@ function edit_campaign($campaign_row) {
$input.val(val)
})

if ($campaign_row.data('has-served')) {
campaign.find('[name="startdate"]').prop('disabled', true);
} else {
campaign.find('[name="startdate"]').prop('disabled', false);
}

var platform = $campaign_row.data('platform');
campaign.find('*[name="platform"][value="' + platform + '"]').prop("checked", "checked");

Expand Down Expand Up @@ -1967,6 +1973,7 @@ function create_campaign() {
.find('select[name="region"]').hide().end()
.find('select[name="metro"]').hide().end()
.find('input[name="frequency_cap"]').val('').end()
.find('input[name="startdate"]').prop('disabled', false).end()
.find('input[name="frequency_cap_duration"]').val('').end()
.find('#frequency_capped_false').prop('checked', 'checked').end()
.find('.frequency-cap-field').hide().end()
Expand Down
3 changes: 2 additions & 1 deletion r2/r2/templates/renderablecampaign.html
Expand Up @@ -50,7 +50,8 @@
data-ios_versions="${json.dumps(thing.ios_versions) if thing.ios_versions else ''}"
data-android_devices="${json.dumps(thing.android_devices) if thing.android_devices else ''}"
data-android_versions="${json.dumps(thing.android_versions) if thing.android_versions else ''}"
data-paid="${json.dumps(thing.paid)}">
data-paid="${json.dumps(thing.paid)}"
data-has-served="${json.dumps(thing.campaign.has_served or thing.is_live or thing.is_complete)}">
<td class="campaign-start-date">
${thing.campaign.start_date.strftime("%m/%d/%Y")}
</td>
Expand Down

0 comments on commit efb9d0b

Please sign in to comment.