def move_contact(args): "Moves matching contacts to given actor" fix_unicode(args, 'from_actor', 'query', 'type', 'new_actor') new_actor = None try: new_actor = get_single(find_actors, args.new_actor) except MultipleMatches as e: raise CommandError(e) except NotFound as e: raise CommandError(u'No actor matches "{0}".'.format(args.actor)) assert args.from_actor or args.query, 'specify actor or auery' db = default_storage() contacts = Contact.objects(db).where_not(actor=new_actor.pk) if args.type: contacts = contacts.where(type__in=args.type) if args.query: contacts = contacts.where(value__matches_caseless=args.query) if args.from_actor: try: from_actor = get_single(find_actors, args.from_actor) except MultipleMatches as e: raise CommandError(e) except NotFound(e): raise CommandError('Bad --from-actor: no match for "{0}"'.format( args.from_actor)) contacts = contacts.where(actor=from_actor.pk) if not len(contacts): raise CommandError('No suitable contacts were found.') yield('About to move these contacts:\n') for c in contacts: yield(u'- {actor}: {kind} {v}'.format(v=bright(c.value), **c)) yield('') msg = u'Move these contacts to {0}'.format(bright(new_actor)) if confirm(msg, default=True): for c in contacts: c.actor = new_actor c.save(db) else: yield('\nCancelled.')
def add_contact(args): "Adds a contact to given actor" fix_unicode(args, 'actor', 'value', 'type') actor = None try: actor = get_single(find_actors, args.actor) except MultipleMatches as e: raise CommandError(e) except NotFound as e: raise CommandError(u'No actor matches "{0}".'.format(args.actor)) db = default_storage() qs = Contact.objects(db) dupes = qs.where(actor=actor, kind=args.type, value=args.value) if dupes.count(): raise CommandError('Such contact already exists.') # FIXME Docu doesn't properly assign values from Contact(foo=bar) contact = Contact() contact.actor = actor contact.kind = args.type contact.value = args.value contact.save(db)