Это решение использует грубую силу, чтобы сравнить каждую строку с оставшейся (нарезая массив), просто для удовольствия написать один вкладыш.
Он не удаляет строку, если порядок обратный, например "hair bright"
не рассматривается как подпункт "bright hair dryer"
.
[ e for i, e in enumerate(mylist) if not any([ e in s for s in mylist[:i] + mylist[i+1:] ]) ]
#=> ['love', 'bright light', 'bright hair dryer']
1) индикатор хода выполнения высокого уровня:
вкладка дорожной карты дает Вам своего рода индикатор хода выполнения высокого уровня. Это перечисляет все этапы, и в течение каждого этапа это показывает Вам:
, можно ограничить полномочия способом, что клиент может только получить доступ к этому представлению.
В зависимости от отношений между Вами и Вашим клиентом, Вы могли бы хотеть дать ему способность создать новые тикеты (разрешение TICKET_CREATE), который должен быть возможным, не давая ему доступ для чтения к другим билетам (TICKET_VIEW и TICKET_MODIFY). Извините, но я не могу в настоящее время тестировать, если это действительно работает, возможно, кто-то может прокомментировать это.
2) ежедневные сводные отчеты
trac предлагает Вам каналы RSS для всего, о чем можно думать. Должно быть возможно генерировать ежедневные отчеты от этого, или Вы просто говорите Вашему клиенту RSS проверять канал один раз в день.
Trac также имеет способность сообщить владельцу билета через почту, если тот билет изменился, но это произойдет немедленно, не как ежедневная сводка. Можно прокомментировать билеты, и иногда мы используем их как форум или список рассылки, и в этом случае хорошо быть уведомленным немедленно.
Другая конфигурация
В каждом проекте, который я делаю с trac, я создаю пользовательский запрос для списка всех билетов, которыми никто не владеет:
SELECT p.value AS __color__, owner AS __group__, status, id AS ticket, summary, component, milestone, t.type AS type, time AS created, changetime AS _changetime, description AS _description, reporter AS _reporter FROM ticket t LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' WHERE status = 'new' AND (owner = '' OR owner = 'somebody' OR owner = 'None' ) ORDER BY owner, p.value, t.type, time
Каждый билет может иметь владельца и несколько человек в cc поле, но отчет для мои билеты только списки они, где Вы - владелец. Для преодоления этого я добавляю запрос как это:
SELECT p.value AS __color__, (CASE owner WHEN '$USER' THEN (CASE status WHEN 'assigned' THEN 'Tickets that you accepted' ELSE 'Tickets that were assigned to you, please accept or reassign' END) ELSE 'Tickets, that have your name in the cc' END) AS __group__, id AS ticket, summary, component, version, milestone, t.type AS type, priority, time AS created, changetime AS _changetime, description AS _description, reporter AS _reporter FROM ticket t LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' WHERE t.status 'closed' AND (owner = '$USER' OR cc like '%$USER%') ORDER BY owner, (status = 'assigned') DESC, p.value, milestone, t.type, time
(этот код работает в trac 0.11b)
Это - мой любимый отчет билета. Это goups билеты тремя классами:
запросы могли бы выглядеть страшными, но они - простые модификации запросов, которые уже являются там. Вы не должны взламывать trac исходный код, webinterface позволяет Вам отредактировать запросы.
Плагины
я рекомендую плагин RPC XML , если Вы работаете с затмением. Это включает тесную интеграцию с Mylin. (Я думаю основные работы интеграции даже без плагина), таким образом, Ваши разработчики могут сделать много задач из затмения, не переключаясь на trac webinterface.
(Если Вы используете затмение, но не знаете mylin, необходимо взглянуть на него. Можно протестировать его без любой конфигурации, потому что это идет с большинством дистрибутивов затмения и может работать автономным без trac.)
Я не рекомендовал бы использовать тот же проект Trac для отслеживания задач разработки и показа потребительского успеха. Вы хотите быть в состоянии быть искренними с Вашими билетами разработки, комментариями, и т.д. Клиенты могут сфокусироваться на неправильных вещах и неправильно истолковать данные, Вы вставляете билеты. Я рекомендовал бы предоставить клиенту отдельный проект, который содержит задачи высокого уровня и только показывает достижения по тем задачам, не вшивое песчаное.
Насколько дополнительные плагины затронуты, мы устанавливаем TocMacro, XmlRpcPlugin, WysiwygPlugin и TracRedirect. В частности, плагин WYSIWYG действительно хорош для поощрения меньшего технического штата поддержать их собственные документы в Wiki - Вы можете даже C& P от MS Word при сохранении форматирования, которое помогает.
Смотрят на пользовательский материал рабочего процесса билета, который тот Trac дает Вам, если Ваш собственный рабочий процесс не хорошо представлен значениями по умолчанию Trac. Это позволило нам добавлять обзор кода, и интеграционное тестирование ступает в рабочий процесс.
я рекомендовал бы заставить Ваш сервер Trac аутентифицировать против некоторой платформы централизованной аутентификации. Мы выполняем дерево LDAP с подлинными учетными данными в нем, и это используется всеми нашими внутренними системами - включая trac, svn, самбу, openvpn и т.д.
@ Дэйв Данкин прав. Используйте Trac для внутреннего использования и используйте систему, подобную Basecamp , чтобы предоставить своим клиентам общий обзор того, что происходит в проекте.
Если это - установка запаса, база данных является просто SQLite3, таким образом, можно легко записать сценарии для выборки "безопасной" информации, как количество билетов, или почему не один из отчетов. Тем путем можно обсудить свободно, пока название билета в порядке. Изменения, этапы, wikipages, теги (при использовании того плагина) также доступны.
Вы могли, вероятно, забрать все полномочия кроме ROADMAP_VIEW
от анонимного пользователя, но это, вероятно, будет немного также высокий уровень, нет? Управление доступом на отдельном уровне билета или комментария в настоящее время не поддерживается AFAIK. См. http://trac.edgewall.org/wiki/TracPermissions для получения дополнительной информации о trac полномочиях.
Как упомянуто в одном из комментариев, Вы не можете ограничить билет или прокомментировать доступ на основе пользователя. Нахождение или создание внешней системы отчетности являются Вашим лучшим выбором.
Несколько вещей на основе опыта с Trac:
Создание пользовательского рабочий процесс довольно прямо упрям. Использование GraphViz является огромной справкой для передачи состояний и действий. Плагин рабочего процесса (как AdvancedTicketWorkflowPlugin), который далее расширяет встроенную функциональность, не слишком трудно сделать при необходимости в более сложном взаимодействии состояния.
Для пользовательского создания отчетов, можно записать SQL-запросы, которые берут именованные параметры, затем связываются с ними от страницы Wiki:
, Например, запрос может содержать оператор Where как это:
WHERE datetime(t.changetime, 'unixepoch') >= datetime('now','-$DAYS days')
и страница Wiki может иметь это:
Show activity for last [http://server.com/trac/report/9?DAYS=8 8] days.