def add_to_story_branch(branch_num): item_id = request.data try: branch_num = int(branch_num) except ValueError: raise BadRequest("branch number must be an integer") set_item_in_branch(item_id, branch_num - 1, True) return humanify(current_user.get_mjs())
def remove_item_from_branch(item_id, branch_num=None): try: branch_num = int(branch_num) except ValueError: raise BadRequest("branch number must be an integer") set_item_in_branch(item_id, branch_num - 1, False) return humanify(current_user.get_mjs())
def manage_jewish_story(): '''Logged in user may GET or POST their jewish story links. the links are stored as an array of items where each item has a special field: `branch` with a boolean array indicating which branches this item is part of. POST requests should be sent with a string in form of "collection_name.id". ''' if request.method == 'GET': return humanify(current_user.get_mjs()) elif request.method == 'POST': try: data = request.data # Enforce mjs structure: if not isinstance(data, str): abort(400, 'Expecting a string') except ValueError: e_message = 'Could not decode JSON from data' current_app.logger.debug(e_message) abort(400, e_message) add_to_my_story(data) return humanify(current_user.get_mjs())
def save_user_content(): import magic if not request.files: abort(400, 'No files present!') must_have_key_list = ['title', 'description', 'creator_name'] form = request.form keys = form.keys() # Check that we have a full language specific set of fields must_have_keys = { '_en': {'missing': None, 'error': None}, '_he': {'missing': None, 'error': None} } for lang in must_have_keys: must_have_list = [k+lang for k in must_have_key_list] must_have_set = set(must_have_list) must_have_keys[lang]['missing'] = list(must_have_set.difference(set(keys))) if must_have_keys[lang]['missing']: missing_keys = must_have_keys[lang]['missing'] must_have_keys[lang]['error'] = gen_missing_keys_error(missing_keys) if must_have_keys['_en']['missing'] and must_have_keys['_he']['missing']: em_base = 'You must provide a full list of keys in English or Hebrew. ' em = em_base + must_have_keys['_en']['error'] + ' ' + must_have_keys['_he']['error'] abort(400, em) # Set metadata language(s) to the one(s) without missing fields md_languages = [] for lang in must_have_keys: if not must_have_keys[lang]['missing']: md_languages.append(lang) user_oid = current_user.id file_obj = request.files['file'] filename = secure_filename(file_obj.filename) metadata = dict(form) metadata['user_id'] = str(user_oid) metadata['original_filename'] = filename metadata['Content-Type'] = mimetypes.guess_type(filename)[0] # Pick the first item for all the list fields in the metadata clean_md = {} for key in metadata: if type(metadata[key]) == list: clean_md[key] = metadata[key][0] else: clean_md[key] = metadata[key] # Make sure there are no empty keys for at least one of the md_languages empty_keys = {'_en': [], '_he': []} for lang in md_languages: for key in clean_md: if key.endswith(lang): if not clean_md[key]: empty_keys[lang].append(key) # Check for empty keys of the single language with the full list of fields if len(md_languages) == 1 and empty_keys[md_languages[0]]: abort(400, "'{}' field couldn't be empty".format(empty_keys[md_languages[0]][0])) # Check for existence of empty keys in ALL the languages elif len(md_languages) > 1: if (empty_keys['_en'] and empty_keys['_he']): abort(400, "'{}' field couldn't be empty".format(empty_keys[md_languages[0]][0])) # Create a version of clean_md with the full fields only full_md = {} for key in clean_md: if clean_md[key]: full_md[key] = clean_md[key] # Get the magic file info file_info_str = magic.from_buffer(file_obj.stream.read()) if not _validate_filetype(file_info_str): abort(415, "File type '{}' is not supported".format(file_info_str)) # Rewind the file object file_obj.stream.seek(0) # Convert user specified metadata to BHP6 format bhp6_md = _convert_meta_to_bhp6(clean_md, file_info_str) bhp6_md['owner'] = str(user_oid) # Create a thumbnail and add it to bhp metadata try: binary_thumbnail = binarize_image(file_obj) bhp6_md['thumbnail'] = {} bhp6_md['thumbnail']['data'] = urllib.quote(binary_thumbnail.encode('base64')) except IOError as e: current_app.logger.debug('Thumbnail creation failed for {} with error: {}'.format( file_obj.filename, e.message)) # Add ugc flag to the metadata bhp6_md['ugc'] = True # Insert the metadata to the ugc collection new_ugc = Ugc(bhp6_md) new_ugc.save() file_oid = new_ugc.id bucket = ugc_bucket saved_uri = upload_file(file_obj, bucket, file_oid, full_md, make_public=True) user_email = current_user.email user_name = current_user.name if saved_uri: console_uri = 'https://console.developers.google.com/m/cloudstorage/b/{}/o/{}' http_uri = console_uri.format(bucket, file_oid) mjs = current_user.get_mjs()['mjs'] if mjs == {}: current_app.logger.debug('Creating mjs for user {}'.format(user_email)) # Add main_image_url for images (UnitType 1) if bhp6_md['UnitType'] == 1: ugc_image_uri = 'https://storage.googleapis.com/' + saved_uri.split('gs://')[1] new_ugc['ugc']['main_image_url'] = ugc_image_uri new_ugc.save() # Send an email to editor subject = 'New UGC submission' with open('templates/editors_email_template') as fh: template = jinja2.Template(fh.read()) body = template.render({'uri': http_uri, 'metadata': clean_md, 'user_email': user_email, 'user_name': user_name}) sent = send_gmail(subject, body, editor_address, message_mode='html') if not sent: current_app.logger.error('There was an error sending an email to {}'.format(editor_address)) clean_md['item_page'] = '/item/ugc.{}'.format(str(file_oid)) return humanify({'md': clean_md}) else: abort(500, 'Failed to save {}'.format(filename))
def set_story_branch_name(branch_num): name = request.data current_user.story_branches[int(branch_num) - 1] = name current_user.save() return humanify(current_user.get_mjs())
def delete_item_from_story(item_id): remove_item_from_story(item_id) return humanify(current_user.get_mjs())