Exemplo n.º 1
0
def get(campaign_obj_id):
    """
    Gets a campaign with the given id

    :param campaign_obj_id:
    :return:
    """
    collection = Campaign.collection()
    if campaign_obj_id is None:
        return None
    dic = collection.find_one({"_id": coerce_bson_id(campaign_obj_id)})
    return Campaign.unserialize(dic) if dic is not None else None
Exemplo n.º 2
0
def gen_campaigns(campaign_type=CampaignType.ALL, total_campaigns=100):
    """
    Generate mock campaigns

    :param campaign_type:
    :param total_campaigns:
    :param with_comments:
    :return:
    """
    if campaign_type == CampaignType.ALL:
        campaign_type = [getattr(CampaignType, attr) for attr in dir(CampaignType()) if
                         not callable(attr) and not attr.startswith("__")]
        campaign_type.remove(CampaignType.ALL)
    else: campaign_type = [campaign_type]

    #build campaigns
    now = datetime.datetime.now()
    generated_campaigns = []
    for _ in range(total_campaigns):
        c = Campaign()
        c.publish_datetime = __gen_random_datetime(MOCK_DATE_RANGE_DAYS)
        c.title = "Mock Title"
        c.description = "Mock Description"
        c.type = choice(campaign_type)
        c.picture_url = "http://lorempixel.com/400/400"

        if c.type == CampaignType.EVENT:
            c.happening_datetime = __gen_random_datetime(MOCK_DATE_RANGE_DAYS)

        generated_campaigns += [c]

    return generated_campaigns
Exemplo n.º 3
0
    def test_put_campaign_data(self):
        user_id = "xaa8LzkwtCCgb6BeP"
        brand_id = "516bb6f3c64ed2c1ad73842a"
        platforms = ["campaign", "facebook"]
        title = "test_title"
        description = "test_description"
        type = "promotional"
        is_published = True
        is_draft = False
        item_list = []

        kvp = {}
        if PLATFORM_CAMPAIGN in platforms:
            c = Campaign()
            c.uid = user_id
            c.title = title
            c.description = description
            c.type = type
            c._id = save(c)
            c.item_id_lis = item_list

            kvp["campaign_list"] = c._id

        if PLATFORM_FACEBOOK in platforms:
            fb_post = put_fb_post(get_brand_mapping(user_id, brand_id).facebook, title)
            kvp["facebook_list"] = fb_post._id

        publish_datetime = datetime.datetime.now() if is_published is True else None
        put_mapping(user_id, kvp, publish_datetime, is_published, is_draft)
Exemplo n.º 4
0
def update_campaign_data():
    """
    (PUT: /campaign/date/update)
    """
    from campaigns.campaign.model import Campaign
    from unifide_backend.action.mapping.action import get_brand_mapping, get_mapping
    from unifide_backend.action.social.facebook.model import FBEvent
    from unifide_backend.action.social.facebook.action import update_fb_event

    user_id = request.form.get("user_id")
    brand_name = request.form.get("brand_name")
    campaign_id = request.form.get('campaign_id')
    title = request.form.get('title')
    description = request.form.get('description')
    event_datetime_start = float(request.form.get("datetime_start")) if request.form.get("datetime_start") is not None else None
    event_datetime_end = float(request.form.get("datetime_end")) if request.form.get("datetime_end") is not None else None
    place = request.form.get("place")
    item_list = request.form.get("item_list")
    print title, description
    print campaign_id
    brand_obj = get_brand_mapping(user_id, brand_name)
    mapping_obj = get_mapping(campaign_id)
    print brand_obj
    print mapping_obj

    set_dic = {
        "title": title,
        "description": description,
        "happening_datetime_start": event_datetime_start,
        "happening_datetime_end": event_datetime_end,
    }
    if item_list is not None and len(item_list) > 0:
        set_dic["item_id_lis"] = item_list

    if mapping_obj.campaign is not None:
        Campaign.collection().update({"_id": mapping_obj.campaign},
                                     {"$set" : set_dic})
    if mapping_obj.blog is not None:
        Campaign.collection().update({"_id": mapping_obj.blog},
                                     {"$set" : set_dic})
    if mapping_obj.facebook is not None and mapping_obj.type == "event":
        event = FBEvent.collection().find_one({"_id": coerce_bson_id(mapping_obj.facebook)})
        update_fb_event(event["event_id"], brand_obj.facebook, mapping_obj.state, title, description, event_datetime_start, event_datetime_end)

    return jsonify({"status": "ok"})
Exemplo n.º 5
0
    def _test_put_campaign_data2(self):
        user_id = "xaa8LzkwtCCgb6BeP"
        title = "test_title"
        description = "test_description"
        type = "promotional"

        c = Campaign()
        c.uid = user_id
        c.title = title
        c.description = description
        c.type = type
        c._id = save(c)

        kvp = {}
        kvp["campaign_list"] = c._id

        mapping_obj = put_mapping(user_id, kvp, datetime.datetime.now())

        assert mapping_obj is not None
Exemplo n.º 6
0
def put_campaign_data():
    """
    (PUT: campaign/data)
    """
    from campaigns.campaign.model import Campaign, CampaignType
    from campaigns.campaign.action import save
    from unifide_backend.action.mapping.model import CampaignState
    from unifide_backend.action.mapping.action import put_mapping, get_brand_mapping
    from unifide_backend.action.social.facebook.action import put_fb_post, get_fb_user, put_fb_event
    from unifide_backend.action.social.twitter.action import put_tweet, get_tw_user
    from unifide_backend.action.social.foursquare.action import put_fsq_update
    from base.media.action import _store_locally, url_for, save_media
    from base.media.model import Media
    from base.items.action import save as save_item
    from base import items
    from base.items.model import Item
    from unifide_backend.action.util import url_generator
    from cfg import DOMAIN_PATH

    print "starting"
    user_id = request.form.get("user_id")
    brand_name = request.form.get("brand_name")
    platforms = request.form.getlist("platforms")
    type = request.form.get("type")
    title = request.form.get("title")
    description = request.form.get("description")
    event_datetime_start = float(request.form.get("datetime_start")) if request.form.get("datetime_start") is not None else None
    event_datetime_end = float(request.form.get("datetime_end")) if request.form.get("datetime_end") is not None else None
    item_file_id = request.form.get("media_file_url", None)
    state = request.form.get("state")
    scheduled_datetime = float(request.form.get("scheduled_datetime")) if state == CampaignState.SCHEDULED else None
    redirect_url = request.form.get("redirect_to", None)

    brand_obj = get_brand_mapping(user_id, brand_name)

    parsed_title = title
    parsed_description = description
    image_io = None
    file_path = None
    media_obj = None

    # load media object from item ID
    if item_file_id:
        dic = Item.collection().find_one({"_id": coerce_bson_id(item_file_id)})
        item_obj = Item.unserialize(dic) if dic is not None else None
        if item_obj:
            media_obj = Media.unserialize(Media.collection().find_one({"_id": item_obj.media_id}))

    # load user uploaded image
    files = ["media_file"]
    for f in files:
        media_file = request.files.get(f)
        if media_file.filename != "":
            if request.files.get("media_file").mimetype in ["image/png", "image/gif", "image/jpeg", "image/jpg"]:
                file_path = _store_locally(media_file.filename, media_file)
                media_obj = save_media(media_file)

    # open file stream to user uploaded image
    if file_path:
        image = Image.open(file_path)
        image_io = StringIO()
        image.save(image_io, 'jpeg', quality=95)
        image_io.seek(0)

    # open file stream to item image
    if media_obj:
        if media_obj.storage == MediaStorage.LOCAL:
            img_file_path = os.path.join(UPLOAD_FOLDER, media_obj.file_name)
            image = Image.open(img_file_path)
        else:
            req = requests.open(url_for(media_obj))
            image = Image.open(StringIO(req.content))
        image_io = StringIO()
        image.save(image_io, 'jpeg', quality=95)
        image_io.seek(0)

    kvp = {}

    if PLATFORM_CAMPAIGN in platforms:
        c = Campaign()
        c.uid = user_id
        c.title = title
        c.description = description
        c.type = type
        if item_file_id is not None:
            c.item_id_lis.append(item_file_id)
        #event component
        c.happening_datetime_start = event_datetime_start if event_datetime_start is not None else None
        c.happening_datetime_end = event_datetime_end if event_datetime_end is not None else None
        c._id = save(c)
        kvp["campaign"] = c._id
        print "done campaign"

    if PLATFORM_BLOG in platforms:
        blog = Item()
        blog.name = title
        blog.description = description
        blog.media_id = media_obj._id if media_obj is not None else None

        blog_path_list = ["Pages", "Blog"]
        blog_container = items.container_from_path(blog_path_list)
        blog.container_id = blog_container._id

        blog._id = save_item(blog)
        kvp["blog"] = blog._id
        print "done blog"

    # add a link to web/blog campaign for social network campaigns
    if PLATFORM_CAMPAIGN in platforms or PLATFORM_BLOG in platforms:
        parsed_title += "\n" + url_generator(DOMAIN_PATH, title)
        parsed_description += "\n\n" + url_generator(DOMAIN_PATH, title)

    if PLATFORM_FACEBOOK in platforms:
        fb_user = get_fb_user(user_id, brand_name)
        if type == CampaignType.PROMOTION:
            post = put_fb_post(brand_obj.facebook, fb_user.fb_id, state, parsed_title, image_io)
            kvp[PLATFORM_FACEBOOK] = post._id
        elif type == CampaignType.EVENT:
            event = put_fb_event(brand_obj.facebook, fb_user.fb_id, state, title, parsed_description, event_datetime_start, event_datetime_end, image_io)
            kvp[PLATFORM_FACEBOOK] = event._id
        print "done facebook"

    if PLATFORM_TWITTER in platforms:
        tw_user = get_tw_user(user_id, brand_name)[0]
        tweet = put_tweet(parsed_title, tw_user.tw_id, brand_obj.twitter["access_token"]["key"], brand_obj.twitter["access_token"]["secret"], state, url_for(media_obj) if media_obj is not None else file_path)
        kvp[PLATFORM_TWITTER] = tweet._id
        print "done twitter"

    if PLATFORM_FOURSQUARE in platforms:
        page_update = put_fsq_update(parsed_title, brand_obj.foursquare["venues"][0], brand_obj.foursquare["access_token"], state)
        kvp[PLATFORM_FOURSQUARE] = page_update._id
        print "done foursquare"

    if PLATFORM_PUSH in platforms:
        kvp[PLATFORM_PUSH] = 1
        #todo : waiting for push implementation
        pass

    publish_datetime = datetime.datetime.now() if state == CampaignState.PUBLISHED else datetime.datetime.fromtimestamp(scheduled_datetime)
    put_mapping(user_id, brand_name, kvp, publish_datetime, type, state)

    if redirect_url is not None:
        return render_template("redirect.html", **{
            "redirect_url": redirect_url
        })

    return jsonify({"status": "ok"})
Exemplo n.º 7
0
                print id

        # delete foursquare page update
        if mapping_obj.foursquare is not None:
            id = mapping_obj.foursquare
            page_update = FSQPageUpdate.collection().find_one({"_id": coerce_bson_id(id)})
            try:
                del_fsq_update(page_update["update_id"] if page_update["update_id"] is not None else None, id, brand_obj.foursquare["access_token"])
            except Exception, err:
                print traceback.format_exc()
                print id

        # delete campaign
        if mapping_obj.campaign is not None:
            id = mapping_obj.campaign
            Campaign.collection().remove({"_id": coerce_bson_id(id)})

        # delete blog
        if mapping_obj.blog is not None:
            id = mapping_obj.blog
            Campaign.collection().remove({"_id": coerce_bson_id(id)})

        #delete mapping
        del_mapping(c)

    return jsonify({"status": "ok"})


def _register_api(app):
    """
    interface method so the app can register the API (routing) calls.
Exemplo n.º 8
0
def save(campaign_obj):
    col = Campaign.collection()
    id = col.insert(campaign_obj.serialize())
    return id