docs: def promote_chat_member(self, chat_id, user_id, can_change_info=None, can_post_messages=None, can_edit_messages=None, can_delete_messages=None, can_invite_users=None, can_restrict_members=None, can_pin_messages=None, can_promote_members=None):
          """
          Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate admin rights. Pass False for all boolean parameters to demote a user. Returns True on success.
  
          https://core.telegram.org/bots/api#promotechatmember
  
          
          Parameters:
          
          :param chat_id: Unique identifier for the target chat or username of the target channel (in the format @channelusername)
          :type  chat_id: int | str|unicode
          
          :param user_id: Unique identifier of the target user
          :type  user_id: int
          
          
          Optional keyword parameters:
          
          :param can_change_info: Pass True, if the administrator can change chat title, photo and other settings
          :type  can_change_info: bool
          
          :param can_post_messages: Pass True, if the administrator can create channel posts, channels only
          :type  can_post_messages: bool
          
          :param can_edit_messages: Pass True, if the administrator can edit messages of other users and can pin messages, channels only
          :type  can_edit_messages: bool
          
          :param can_delete_messages: Pass True, if the administrator can delete messages of other users
          :type  can_delete_messages: bool
          
          :param can_invite_users: Pass True, if the administrator can invite new users to the chat
          :type  can_invite_users: bool
          
          :param can_restrict_members: Pass True, if the administrator can restrict, ban or unban chat members
          :type  can_restrict_members: bool
          
          :param can_pin_messages: Pass True, if the administrator can pin messages, supergroups only
          :type  can_pin_messages: bool
          
          :param can_promote_members: Pass True, if the administrator can add new administrators with a subset of his own privileges or demote administrators that he has promoted, directly or indirectly (promoted by administrators that were appointed by him)
          :type  can_promote_members: bool
          
          Returns:
  
          :return: Returns True on success
          :rtype:  bool
          """
          assert_type_or_raise(chat_id, (int, unicode_type), parameter_name="chat_id")
          
          assert_type_or_raise(user_id, int, parameter_name="user_id")
          
          assert_type_or_raise(can_change_info, None, bool, parameter_name="can_change_info")
          
          assert_type_or_raise(can_post_messages, None, bool, parameter_name="can_post_messages")
          
          assert_type_or_raise(can_edit_messages, None, bool, parameter_name="can_edit_messages")
          
          assert_type_or_raise(can_delete_messages, None, bool, parameter_name="can_delete_messages")
          
          assert_type_or_raise(can_invite_users, None, bool, parameter_name="can_invite_users")
          
          assert_type_or_raise(can_restrict_members, None, bool, parameter_name="can_restrict_members")
          
          assert_type_or_raise(can_pin_messages, None, bool, parameter_name="can_pin_messages")
          
          assert_type_or_raise(can_promote_members, None, bool, parameter_name="can_promote_members")
          
          result = self.do("promoteChatMember", chat_id=chat_id, user_id=user_id, can_change_info=can_change_info, can_post_messages=can_post_messages, can_edit_messages=can_edit_messages, can_delete_messages=can_delete_messages, can_invite_users=can_invite_users, can_restrict_members=can_restrict_members, can_pin_messages=can_pin_messages, can_promote_members=can_promote_members)
          if self.return_python_objects:
              logger.debug("Trying to parse {data}".format(data=repr(result)))
              try:
                  return from_array_list(bool, result, list_level=0, is_builtin=True)
              except TgApiParseException:
                  logger.debug("Failed parsing as primitive bool", exc_info=True)
              # end try
              # no valid parsing so far
              raise TgApiParseException("Could not parse result.")  # See debug log for details!
          # end if return_python_objects
          return result