def tag_add(form): action = '{action} {controller}'.format( action=TRANSLATIONS['add']['title'], controller=TRANSLATIONS['tag']['title']) error = [] disallowed_tag_names = ['device_id', 'unit', 'channel'] if not form.tag_name.data: error.append("Tag name is empty") if ' ' in form.tag_name.data: error.append("Tag name cannot contain spaces") elif form.tag_name.data in disallowed_tag_names: error.append("Tag name cannot be from this list: {}".format( disallowed_tag_names)) if NoteTags.query.filter(NoteTags.name == form.tag_name.data).count(): error.append("Tag already exists") if not error: new_tag = NoteTags() new_tag.name = form.tag_name.data new_tag.save() flash_success_errors(error, action, url_for('routes_page.page_notes'))
def tag_add(form): action = '{action} {controller}'.format( action=TRANSLATIONS['add']['title'], controller=TRANSLATIONS['tag']['title']) error = [] disallowed_tag_names = ['device_id', 'unit', 'channel'] if not form.tag_name.data: error.append("Tag name is empty") if ' ' in form.tag_name.data: error.append("Tag name cannot contain spaces") elif form.tag_name.data in disallowed_tag_names: error.append("Tag name cannot be from this list: {}".format(disallowed_tag_names)) if NoteTags.query.filter(NoteTags.name == form.tag_name.data).count(): error.append("Tag already exists") if not error: new_tag = NoteTags() new_tag.name = form.tag_name.data new_tag.save() flash_success_errors(error, action, url_for('routes_page.page_notes'))
def import_notes(form): """ Receive a zip file containing a CSV file and note attachments """ action = '{action} {controller}'.format( action=gettext("Import"), controller=TRANSLATIONS['note']['title']) error = [] upload_folder = os.path.join(INSTALL_DIRECTORY, 'upload') tmp_folder = os.path.join(upload_folder, 'mycodo_notes_tmp') try: if not form.notes_import_file.data: error.append('No file present') elif form.notes_import_file.data.filename == '': error.append('No file name') if not error: # Save file to upload directory filename = secure_filename(form.notes_import_file.data.filename) full_path = os.path.join(tmp_folder, filename) assure_path_exists(upload_folder) assure_path_exists(tmp_folder) form.notes_import_file.data.save(os.path.join( tmp_folder, filename)) # Unzip file try: zip_ref = zipfile.ZipFile(full_path, 'r') zip_ref.extractall(tmp_folder) zip_ref.close() except Exception as err: logger.exception(1) error.append("Exception while extracting zip file: " "{err}".format(err=err)) if not error: found_csv = False for each_file in os.listdir(tmp_folder): if each_file.endswith('_notes_exported.csv') and not found_csv: found_csv = True count_notes = 0 count_notes_skipped = 0 count_attach = 0 logger.error(each_file) file_csv = os.path.join(tmp_folder, each_file) path_attachments = os.path.join(tmp_folder, 'attachments') with open(file_csv, 'r') as theFile: reader = csv.DictReader(theFile) for line in reader: if not Notes.query.filter( Notes.unique_id == line['UUID']).count(): count_notes += 1 new_note = Notes() new_note.unique_id = line['UUID'] new_note.date_time = datetime.strptime( line['Time'], '%Y-%m-%d %H:%M:%S') new_note.name = line['Name'] new_note.note = line['Note'] tag_ids = [] tags = {} for each_tag in line['Tags'].split(';'): tags[each_tag.split(',') [0]] = each_tag.split(',')[1] tag_ids.append(each_tag.split(',')[0]) for each_tag_id, each_tag_name in tags.items(): if (not NoteTags.query.filter( NoteTags.unique_id == each_tag_id).count() and not NoteTags.query.filter( NoteTags.name == each_tag_name).count()): new_tag = NoteTags() new_tag.unique_id = each_tag_id new_tag.name = each_tag_name new_tag.save() elif (not NoteTags.query.filter( NoteTags.unique_id == each_tag_id).count() and NoteTags.query.filter( NoteTags.name == each_tag_name).count()): new_tag = NoteTags() new_tag.unique_id = each_tag_id new_tag.name = each_tag_name + str( uuid.uuid4())[:8] new_tag.save() new_note.tags = ','.join(tag_ids) new_note.files = line['Files'] new_note.save() for each_file_name in line['Files'].split(','): count_attach += 1 os.rename( os.path.join(path_attachments, each_file_name), os.path.join(PATH_NOTE_ATTACHMENTS, each_file_name)) else: count_notes_skipped += 1 if (count_notes + count_attach) == 0: error.append("0 imported, {notes} skipped".format( notes=count_notes_skipped)) else: flash( "Imported {notes} notes and {attach} " "attachments".format(notes=count_notes, attach=count_attach), "success") if not found_csv: error.append( "Cannot import notes: Could not find CSV file in ZIP archive." ) except Exception as err: error.append("Exception: {}".format(err)) finally: if os.path.isdir(tmp_folder): shutil.rmtree(tmp_folder) # Delete tmp directory flash_success_errors(error, action, url_for('routes_page.page_export'))
def import_notes(form): """ Receive a zip file containing a CSV file and note attachments """ action = '{action} {controller}'.format( action=gettext("Import"), controller=TRANSLATIONS['note']['title']) error = [] upload_folder = os.path.join(INSTALL_DIRECTORY, 'upload') tmp_folder = os.path.join(upload_folder, 'mycodo_notes_tmp') full_path = None try: if not form.notes_import_file.data: error.append('No file present') elif form.notes_import_file.data.filename == '': error.append('No file name') if not error: # Save file to upload directory filename = secure_filename( form.notes_import_file.data.filename) full_path = os.path.join(tmp_folder, filename) assure_path_exists(upload_folder) assure_path_exists(tmp_folder) form.notes_import_file.data.save( os.path.join(tmp_folder, filename)) # Unzip file try: zip_ref = zipfile.ZipFile(full_path, 'r') zip_ref.extractall(tmp_folder) zip_ref.close() except Exception as err: logger.exception(1) error.append("Exception while extracting zip file: " "{err}".format(err=err)) if not error: found_csv = False for each_file in os.listdir(tmp_folder): if each_file.endswith('_notes_exported.csv') and not found_csv: found_csv = True count_notes = 0 count_notes_skipped = 0 count_attach = 0 logger.error(each_file) file_csv = os.path.join(tmp_folder, each_file) path_attachments = os.path.join(tmp_folder, 'attachments') with open(file_csv, 'r' ) as theFile: reader = csv.DictReader(theFile) for line in reader: if not Notes.query.filter(Notes.unique_id == line['UUID']).count(): count_notes += 1 new_note = Notes() new_note.unique_id = line['UUID'] new_note.date_time = datetime.strptime(line['Time'], '%Y-%m-%d %H:%M:%S') new_note.name = line['Name'] new_note.note = line['Note'] tag_ids = [] tags = {} for each_tag in line['Tags'].split(';'): tags[each_tag.split(',')[0]] = each_tag.split(',')[1] tag_ids.append(each_tag.split(',')[0]) for each_tag_id, each_tag_name in tags.items(): if (not NoteTags.query.filter(NoteTags.unique_id == each_tag_id).count() and not NoteTags.query.filter(NoteTags.name == each_tag_name).count()): new_tag = NoteTags() new_tag.unique_id = each_tag_id new_tag.name = each_tag_name new_tag.save() elif (not NoteTags.query.filter(NoteTags.unique_id == each_tag_id).count() and NoteTags.query.filter(NoteTags.name == each_tag_name).count()): new_tag = NoteTags() new_tag.unique_id = each_tag_id new_tag.name = each_tag_name + str(uuid.uuid4())[:8] new_tag.save() new_note.tags = ','.join(tag_ids) new_note.files = line['Files'] new_note.save() for each_file in line['Files'].split(','): count_attach += 1 os.rename(os.path.join(path_attachments, each_file), os.path.join(PATH_NOTE_ATTACHMENTS, each_file)) else: count_notes_skipped += 1 if (count_notes + count_attach) == 0: error.append("0 imported, {notes} skipped".format( notes=count_notes_skipped)) else: flash("Imported {notes} notes and {attach} " "attachments".format(notes=count_notes, attach=count_attach), "success") if not found_csv: error.append("Cannot import notes: Could not find CSV file in ZIP archive.") except Exception as err: error.append("Exception: {}".format(err)) finally: if os.path.isdir(tmp_folder): shutil.rmtree(tmp_folder) # Delete tmp directory flash_success_errors(error, action, url_for('routes_page.page_export'))