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"})
def put_item(): """ (PUT: item) """ #attributes obj_id = request.form.get("id", request.args.get("id", None)) path_lis_json = request.form.get("path_lis", request.args.get("path_lis", None)) path_lis = json.loads(path_lis_json) if path_lis_json is not None and path_lis_json != "" else None container_obj = container_from_path(container_path(path_lis)) name = request.form.get("name", request.args.get("name", None)) description = request.form.get("description", request.args.get("description", None)) price = request.form.get("price", request.args.get("price", None)) quantity = request.form.get("quantity", request.args.get("quantity", None)) status = request.form.get("status", request.args.get("status", ItemStatus.VISIBLE)) group_id = request.form.get("group-id", request.args.get("group-id", None)) #extras custom_attr_json = request.form.get("custom_attr_lis", request.args.get("custom_attr_lis", None)) custom_attr = json.loads(custom_attr_json) if custom_attr_json is not None and custom_attr_json != "" else [] tags_json = request.form.get("tags", request.args.get("tags", "[]")) try: custom_tags = json.loads(tags_json) if tags_json is not None else [] except ValueError: custom_tags = [] custom_media_json = request.form.get("custom_media_lis", request.args.get("custom_media_lis", None)) custom_media = json.loads(custom_media_json) if custom_media_json is not None else [] #handle files file_media_map = {} files = ["media_file"] + custom_media for f_name in files: base64_encoded = request.form.get(f_name, request.args.get(f_name)) if base64_encoded is None: continue f = tempfile.NamedTemporaryFile(delete=False) f.write(base64_encoded.decode("base64")) f.close() img_file, media_obj = None, None try: img_file = open(f.name) _ = Image.open(f.name) media_obj = save_image(img_file, UPLOAD_METHOD) img_file.close() except IOError: img_file = open(f.name) media_obj = save_media(img_file, UPLOAD_METHOD) img_file.close() file_media_map[f_name] = media_obj main_media_obj = file_media_map["media_file"] if "media_file" in file_media_map else None; if obj_id is None or obj_id == "": new_item(container_obj, custom_attr, custom_media, custom_tags, description, file_media_map, main_media_obj, name, price, quantity, status, group_id) else: update_item(custom_attr, custom_media, custom_tags, description, file_media_map, name, obj_id, price, quantity) return jsonify({ "status": "ok", })