Closed zmactep closed 10 years ago
Идея отличная. Может, введем в Storage не плоский список, как сейчас, а древовидную структуру - группировка по группе, а затем по run? Нажимаешь на плюсик - список разворачивается. И отдельный переключатель "показать все/только полезное из манифеста". Можно еше отдельную кнопку flat view, которая развернет все подпапки/подгруппы в выбранной группе в плоский список как сейчас.
О! И туда же кнопку "просканировать директорию". Нажимаешь на нее - вводишь путь - запускается scan_dir.py. Тебе показывается список найденных файлов, в котором ты удаляешь лишнее, затем указываешь группу и run куда добавить. Если группы нет - предлагается создать новую.
Да, это классно, мы это уже обсуждали как-то. И сейчас необходимость реально есть.
Получилось вот такое дерево:
А еще самому себе на заметку - если комментарий на русском - то все падает :( Это потому что в MySQL неправильный collation, так как джанго выдает ошибку при попытке сохранить данные в таблицу.
Ну, в самом конце можно будет какой-нибудь валидатор прицепить на все формы.
Вот итог работы над формой в /storage/. Это изначальный вид страницы при первой загрузке:
Затем, если пораскрывать списки, получается вот так:
Группы помечены бледно-зеленой шапкой, а run-ы - желтой, чтобы визуально их отличать. Фильтрацию файлов по манифесту я не делал (чекбокс "показать только нужное"). Если честно, при такой группировке даже не знаю, нужна ли фильтрация? Изначально файлы глаза не мозолят, и скрываются внутри run-а, не занимая места.
Кнопка "Развернуть все", как ни странно, разворачивает все:
При нажатии на кнопку "Добавить файл" открывается вот такая форма:
1) Я решил не добавлять кнопку scan_dir, а сделал древовидное меню внизу, через которое нужно выбрать файл. Папки разворачиваются. При клике на файл путь автоматом добавляется в последнюю строку формы, а название файла как ID добавляется в первую строку.
2) Прикрутил jquery плагин для валидации форм на стороне клиента. В аттрибутах input'ов прописывается тип валидации (длина, дата, регулярка и т.п. Вариантов много.), и, соответственно, форма не отправляется пока все поля не пройдут валидацию.
3) Дерево папок внизу может быть любым, который вернет функция dir_list() в igstorage/views.py. Функция возвращает на клиент html список (ul tag), поэтому, потенциально, мы можем передать любой список файлов, а не только реальную файловую систему. Например, можно отдавать список файлов на ftp сервере. Корневая директория прописыватся в igcad/settings.py в переменную STORAGE_ROOT. Сейчас там проставлено значение '/opt/ig-pipeline/'
На скриншоте подсвечен NUC4.4.txt вместо DH.fasta не потому, что глюк, а потому что строки подсвечиваются onmouseover
Предлагаю ограничиться простым манифестом:
{
"output": [
{
"name": "description.txt",
"type": "text",
"pipelined": false
},
{
"name": "output.fasta",
"type": "fasta",
"pipelined": true
},
]
}
Нужно только условиться, что у наших утилит будут стандартные имена выходных файлов (или чтобы у них было значение по-умолчанию, которое переопределяется доп. параметром). Хранить будем в базе: ключ - путь к тулу от tools_root, значение - json как на примере выше. Я буду брать файлы с pipeline=true, и, ориентируясь на тип, подставлять в соответствующий список входных файлов следующего тула.
Костя, в тебе умер гениальный дизайнер! Достанет программировать, задумайся! :)
Манифест пускай пока будет таким. А переименовывать выходы я предлагаю вообще запретить. Пара группа/ран и так дают однозначную идентификацию, да и всем потом будет удобнее, что можно запомнить стандартные названия.
Предлагаю закрыть. Манифесты есть и работают.
Требуется внедрить манифесты (см #21) как можно скорее, а то сейчас от пары запусков storage похож на помойку.
В случае же наличия манифеста можно будет добавлять в storage только "полезные" outputs, игнорируя все прочее.