def find(filename, width=None, height=None): coll = Media.collection() find_params_lis = [ {"file_name": filename}, ] if width is not None and height is not None: find_params_lis += [ {"width": width}, {"height": height}, ] dic = coll.find_one({"$and": find_params_lis}) return Media.unserialize(dic) if dic is not None else None
def get_item_url(): """ (GET: /campaign/item/url) """ from base.media.action import url_for from base.media.model import Media from base.items.model import Item obj_id = request.args.get("obj_id") item_obj = Item.unserialize(Item.collection().find_one({"_id": coerce_bson_id(obj_id)})) media_obj = Media.unserialize(Media.collection().find_one({"_id": item_obj.media_id})) if media_obj is None: return jsonify({"status": "error", "error": "No item found"}) item_url = url_for(media_obj) return jsonify({"status": "ok", "url": item_url})
def _new_img_obj(filename, height, storage, width): img_obj = Media() img_obj.file_name = filename img_obj.storage = storage img_obj.width = width img_obj.height = height img_obj.file_type = MediaType.IMAGE img_obj._id = save(img_obj) return img_obj
def save_media(media_stream, storage=None): if storage is None: storage = MediaStorage.LOCAL #store locally first filename = _gen_uuid() file_path = _store_locally(filename, media_stream) #save document record (as local first) media_obj = Media() media_obj.file_name = filename media_obj.storage = MediaStorage.LOCAL media_obj.file_type = MediaType.OTHERS media_obj._id = save(media_obj) #upload to s3, deferred/threaded if storage == MediaStorage.S3: t = multiprocessing.Process(target=_defer_store_s3, args=(file_path, filename, media_obj)) t.daemon = False t.start() return media_obj
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 get(id): coll = Media.collection() dic = coll.find_one({"_id": coerce_bson_id(id)}) return Media.unserialize(dic) if dic is not None else None
def save(media_obj): col = Media.collection() id = col.save(media_obj.serialize()) return id