Source code for aiida.cmdline.commands.comment

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida_core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
"""
This allows to manage comments from command line.
"""
import sys

from aiida.cmdline.baseclass import VerdiCommandWithSubcommands
from aiida.backends.utils import load_dbenv, is_dbenv_loaded
from aiida.cmdline import delayed_load_node as load_node



[docs]class Comment(VerdiCommandWithSubcommands): """ Manage general properties of nodes in the database """
[docs] def __init__(self): """ A dictionary with valid commands and functions to be called. """ self.valid_subcommands = { 'add': (self.comment_add, self.complete_none), 'remove': (self.comment_remove, self.complete_none), 'show': (self.comment_show, self.complete_none), 'update': (self.comment_update, self.complete_none), }
[docs] def comment_add(self, *args): """ Add comment to a node """ import argparse from aiida.backends.utils import get_automatic_user if not is_dbenv_loaded(): load_dbenv() user = get_automatic_user() parser = argparse.ArgumentParser( prog=self.get_full_command_name(), description='Add a comment to a node in the database.') parser.add_argument('pk', metavar='PK', type=int, help='The pk (an integer) of the node') parser.add_argument('-c', '--comment', type=str, default="", help='The comment (a string) to be added to the node') parsed_args = parser.parse_args(args) comment = parsed_args.comment if not comment: print "Write below the comment to be added to the node." print " # This is a multiline input, press CTRL+D on a" print " # empty line when you finish" try: newlines = [] while True: input_txt = raw_input() if input_txt.strip() == '?': print "\n".join([" > {}".format(descl) for descl in "HELP: {}".format(desc).split('\n')]) continue else: newlines.append(input_txt) except EOFError: # Ctrl+D pressed: end of input. pass comment = "\n".join(newlines) node = load_node(parsed_args.pk) node.add_comment(comment, user)
[docs] def comment_show(self, *args): """ Show the comments of a node """ import argparse from aiida.backends.utils import get_automatic_user if not is_dbenv_loaded(): load_dbenv() user = get_automatic_user() parser = argparse.ArgumentParser( prog=self.get_full_command_name(), description='Show the comments of a node in the database.') parser.add_argument('-u', '--user', type=str, default=None, help='Show only the comments of a given user (optional).') parser.add_argument('pk', metavar='PK', type=int, help='The pk (an integer) of the node.') parser.add_argument('id', metavar='ID', type=int, default=None, nargs='?', help='The id (an integer) of the comment.') # Note that this is a false description, I'm using the DBComment.pk parsed_args = parser.parse_args(args) node = load_node(parsed_args.pk) all_comments = node.get_comments(pk=parsed_args.id) if parsed_args.user is not None: to_print = [i for i in all_comments if i['user__email'] == parsed_args.user] if not to_print: print "Nothing found for user '{}'.".format(parsed_args.user) print "Valid users found for Node {} are: {}.".format(parsed_args.pk, ", ".join(set( ["'" + i['user__email'] + "'" for i in all_comments]))) else: to_print = all_comments if parsed_args.id is not None: to_print = [i for i in to_print if i['pk'] == parsed_args.id] for i in to_print: print "***********************************************************" print "Comment of '{}' on {}".format(i['user__email'], i['ctime'].strftime("%Y-%m-%d %H:%M")) print "ID: {}. Last modified on {}".format(i['pk'], i['mtime'].strftime("%Y-%m-%d %H:%M")) print "" print "{}".format(i['content']) print "" # If there is nothing to print, print a message if not to_print: print "No comment found."
[docs] def comment_remove(self, *args): """ Remove comments. The user can only remove its own comments """ # Note: in fact, the user can still manually delete any comment import argparse from aiida.backends.utils import get_automatic_user if not is_dbenv_loaded(): load_dbenv() user = get_automatic_user() parser = argparse.ArgumentParser( prog=self.get_full_command_name(), description='Remove comments of a node.') parser.add_argument('pk', metavar='PK', type=int, help='The pk (an integer) of the node') parser.add_argument('id', metavar='ID', type=int, default=None, nargs='?', help='#ID of the comment to be removed from node #PK') parser.add_argument('-a', '--all', action='store_true', default=False, help='If used, deletes all the comments of the active user attached to the node') parsed_args = parser.parse_args(args) if parsed_args.id is None and not parsed_args.all: print "One argument between -a and ID must be provided" sys.exit(1) if parsed_args.id is not None and parsed_args.all: print "Only one between -a and ID should be provided" sys.exit(1) node = load_node(parsed_args.pk) allowed_trues = ['1', 't', 'true', 'y', 'yes'] if parsed_args.all: sys.stdout.write("Delete all comments of user {}? ".format(user)) inpread = sys.stdin.readline() do_I_delete = True if inpread.strip().lower() in allowed_trues else False if not do_I_delete: print "Not deleting comment. Aborting." sys.exit(1) else: comments = node.get_comment_obj(user=user) for comment in comments: comment.delete() print("Deleted {} comments.".format(len(comments))) else: sys.stdout.write("Delete comment? ") inpread = sys.stdin.readline() do_I_delete = True if inpread.strip().lower() in allowed_trues else False if not do_I_delete: print "Not deleting comment. Aborting." sys.exit(1) else: from aiida.orm.implementation import Comment as CommentOrm c = CommentOrm(id=parsed_args.id, user=user) c.delete()
[docs] def comment_update(self, *args): """ Update a comment """ import argparse from aiida.backends.utils import get_automatic_user if not is_dbenv_loaded(): load_dbenv() user = get_automatic_user() parser = argparse.ArgumentParser( prog=self.get_full_command_name(), description='Add a comment to a node in the database.') parser.add_argument('pk', metavar='PK', type=int, help='The pk (an integer) of the node') parser.add_argument('id', metavar='ID', type=int, help='Identify the comment to update by ID') parser.add_argument('-c', '--comment', type=str, default=None, help='The comment (a string) to be added to the node') parsed_args = parser.parse_args(args) # read the comment from terminal if it is not on command line if parsed_args.comment is None: print "Write below the comment that you want to save in the database." print " # This is a multiline input, press CTRL+D on a" print " # empty line when you finish" try: newlines = [] while True: input_txt = raw_input() if input_txt.strip() == '?': print "\n".join([" > {}".format(descl) for descl in "HELP: {}".format(desc).split('\n')]) continue else: newlines.append(input_txt) except EOFError: # Ctrl+D pressed: end of input. pass the_comment = "\n".join(newlines) else: the_comment = parsed_args.comment node = load_node(parsed_args.pk) node._update_comment(the_comment, parsed_args.id, user)