Manatee.Trello 移动卡片
Manatee.Trello Moving Cards
我正在编写一个小型应用程序来管理 Trello Boards,仅在几个方面进行管理,例如对列表中的卡片进行排序、moving/copying 基于截止日期 and/or 标签的卡片、将列表归档到定期并根据标签等生成报告。因此,我一直在围绕 Manatee.Trello 库构建外观以简化我的服务界面。
我对图书馆越来越满意,事情也相对顺利。但是,我在 Card class 上写了一个扩展方法,用于在 Lists 内或 Lists 之间移动 Cards,另一种方法是重复调用此扩展方法,将所有 Cards 从一个 List 移动到另一个。
我的问题是,当 运行 两个包含 7 张卡片的虚拟列表上的代码时,它完成时没有错误,但至少有一张卡片实际上没有移动(尽管多达3 张牌未能移动)。我不知道这是因为我移动得太快了,还是我需要调整 TrelloConfiguration.ChangeSubmissionTime,或者是什么原因。我试过延迟,但没有用。
这是我的调用代码:
public void MoveCardsBetweenLists(
string originListName,
string destinationListName,
string originBoardName,
string destinationBoardName = null)
{
var fromBoard = GetBoard(originBoardName); // returns a Manatee.Trello.Board
var toBoard = destinationBoardName == null
|| destinationBoardName.Equals(originBoardName, StringComparison.OrdinalIgnoreCase)
? fromBoard
: GetBoard(destinationBoardName);
var fromList = GetListFromBoard(originListName, fromBoard); // returns a Manatee.Trello.List from the specified Board
var toList = GetListFromBoard(destinationListName, toBoard);
for (int i = 0; i < fromList.Cards.Count(); i++)
{
fromList.Cards[i].Move(1, toList);
}
}
这是我在 Manatee.Trello.Card 上的扩展方法:
public static void Move(this Card card, int position, List list = null)
{
if (list != null && list != card.List)
{
card.List = list;
}
card.Position = position;
}
我已经创建了一个测试来复制您想要的功能。基本上,我在我的板上创建了 7 张卡片,将它们移动到另一个列表,然后删除它们(只是为了保持初始状态)。
private static void Run(System.Action action)
{
var serializer = new ManateeSerializer();
TrelloConfiguration.Serializer = serializer;
TrelloConfiguration.Deserializer = serializer;
TrelloConfiguration.JsonFactory = new ManateeFactory();
TrelloConfiguration.RestClientProvider = new WebApiClientProvider();
TrelloAuthorization.Default.AppKey = TrelloIds.AppKey;
TrelloAuthorization.Default.UserToken = TrelloIds.UserToken;
action();
TrelloProcessor.Flush();
}
#region
private static void Move(Card card, int position, List list = null)
{
if (list != null && list != card.List)
{
card.List = list;
}
card.Position = position;
}
[TestMethod]
public void MovingCards()
{
Run(() =>
{
var list = new List(TrelloIds.ListId);
var cards = new List<Card>();
for (int i = 0; i < 10; i++)
{
cards.Add(list.Cards.Add("test card " + i));
}
var otherList = list.Board.Lists.Last();
for(var i = 0; i < cards.Count; i++)
{
Move(card, i, otherList);
}
foreach (var card in cards)
{
card.Delete();
}
});
}
#endregion
快速提问:您是否在执行结束前调用 TrelloProcessor.Flush()
?如果不这样做,那么当应用程序结束时,一些更改可能会保留在请求处理器队列中,因此它们永远不会被发送。有关详细信息,请参阅我的 wiki page on processing requests。
此外,我注意到您使用 1
作为每一步的位置。通过这样做,您最终会得到一个不可靠的排序。 Trello 使用的位置数据是浮点数。要将一张牌放在另外两张牌之间,只需取其他牌的平均值。在您的情况下,(如果目标列表为空),我建议发送索引器变量进行排序。如果目的地列表不为空,您将需要根据列表中的其他卡片计算新位置(通过 Trello 使用的平均方法)。
最后,我喜欢你的扩展代码。如果您有认为对添加到库中有用的想法,请随时分叉 GitHub 存储库并创建拉取请求。
我正在编写一个小型应用程序来管理 Trello Boards,仅在几个方面进行管理,例如对列表中的卡片进行排序、moving/copying 基于截止日期 and/or 标签的卡片、将列表归档到定期并根据标签等生成报告。因此,我一直在围绕 Manatee.Trello 库构建外观以简化我的服务界面。
我对图书馆越来越满意,事情也相对顺利。但是,我在 Card class 上写了一个扩展方法,用于在 Lists 内或 Lists 之间移动 Cards,另一种方法是重复调用此扩展方法,将所有 Cards 从一个 List 移动到另一个。
我的问题是,当 运行 两个包含 7 张卡片的虚拟列表上的代码时,它完成时没有错误,但至少有一张卡片实际上没有移动(尽管多达3 张牌未能移动)。我不知道这是因为我移动得太快了,还是我需要调整 TrelloConfiguration.ChangeSubmissionTime,或者是什么原因。我试过延迟,但没有用。
这是我的调用代码:
public void MoveCardsBetweenLists(
string originListName,
string destinationListName,
string originBoardName,
string destinationBoardName = null)
{
var fromBoard = GetBoard(originBoardName); // returns a Manatee.Trello.Board
var toBoard = destinationBoardName == null
|| destinationBoardName.Equals(originBoardName, StringComparison.OrdinalIgnoreCase)
? fromBoard
: GetBoard(destinationBoardName);
var fromList = GetListFromBoard(originListName, fromBoard); // returns a Manatee.Trello.List from the specified Board
var toList = GetListFromBoard(destinationListName, toBoard);
for (int i = 0; i < fromList.Cards.Count(); i++)
{
fromList.Cards[i].Move(1, toList);
}
}
这是我在 Manatee.Trello.Card 上的扩展方法:
public static void Move(this Card card, int position, List list = null)
{
if (list != null && list != card.List)
{
card.List = list;
}
card.Position = position;
}
我已经创建了一个测试来复制您想要的功能。基本上,我在我的板上创建了 7 张卡片,将它们移动到另一个列表,然后删除它们(只是为了保持初始状态)。
private static void Run(System.Action action)
{
var serializer = new ManateeSerializer();
TrelloConfiguration.Serializer = serializer;
TrelloConfiguration.Deserializer = serializer;
TrelloConfiguration.JsonFactory = new ManateeFactory();
TrelloConfiguration.RestClientProvider = new WebApiClientProvider();
TrelloAuthorization.Default.AppKey = TrelloIds.AppKey;
TrelloAuthorization.Default.UserToken = TrelloIds.UserToken;
action();
TrelloProcessor.Flush();
}
#region
private static void Move(Card card, int position, List list = null)
{
if (list != null && list != card.List)
{
card.List = list;
}
card.Position = position;
}
[TestMethod]
public void MovingCards()
{
Run(() =>
{
var list = new List(TrelloIds.ListId);
var cards = new List<Card>();
for (int i = 0; i < 10; i++)
{
cards.Add(list.Cards.Add("test card " + i));
}
var otherList = list.Board.Lists.Last();
for(var i = 0; i < cards.Count; i++)
{
Move(card, i, otherList);
}
foreach (var card in cards)
{
card.Delete();
}
});
}
#endregion
快速提问:您是否在执行结束前调用 TrelloProcessor.Flush()
?如果不这样做,那么当应用程序结束时,一些更改可能会保留在请求处理器队列中,因此它们永远不会被发送。有关详细信息,请参阅我的 wiki page on processing requests。
此外,我注意到您使用 1
作为每一步的位置。通过这样做,您最终会得到一个不可靠的排序。 Trello 使用的位置数据是浮点数。要将一张牌放在另外两张牌之间,只需取其他牌的平均值。在您的情况下,(如果目标列表为空),我建议发送索引器变量进行排序。如果目的地列表不为空,您将需要根据列表中的其他卡片计算新位置(通过 Trello 使用的平均方法)。
最后,我喜欢你的扩展代码。如果您有认为对添加到库中有用的想法,请随时分叉 GitHub 存储库并创建拉取请求。