Ссылка для скачивания файла, динамически создаваемого Trac- Wikimacro

Мне дали задание написать плагин для Trac. Он должен предоставлять данные о выгорании для количества билетов и оценок, внесенных в систему отслеживания проблем. Пользователь записывает свой запрос как wikimacro, и ему предоставляется ссылка / кнопка для загрузки Burndown в виде csv-файла, также планируется вывод в виде диаграммы, но имеет более низкий приоритет.

У меня есть рабочее решение для обработки данных, но у меня осталась следующая проблема.

Мой вопрос

Как я могу предоставить ссылку для скачивания / кнопку на Wikipage для файла, который динамически создается по запросу пользователя?

Я видел несколько попыток отправить файлы в самом источнике trac и других плагинах, но, поскольку я новичок в веб-программировании, это не очень помогает.

Update1 Я пытался решить проблему способом, предложенным Феликсом, и это открыло для меня новую проблему. Этот (глупый) пример должен продемонстрировать мою проблему. Мой макрос генерирует следующий URL-адрес и добавляет его в качестве ссылки на вики-страницу.

//http://servername.com/projectname/wiki/page_name?teddy=bear    

Но RequestHandler не реагирует, даже если условие возвращает true. Изменить: этот фрагмент кода теперь показывает рабочую версию для примера.

Новый URL:

#example url
#http://127.0.0.1:8000/prove/files/new

class CustomRequestHandlerModule(Component):
    implements(IRequestHandler)

    def match_request(self,req):
        #old, not working
        #return "teddy=bear"== str(req.path_info).split('?')[1]
        #new
        accept="/files/new"== str(req.path_info)
        return accept

    def process_request(self,req):
        csvfile = self.create_csv()
        req.send_response(200)
        req.send_header('Content-Type', 'text/csv')
        req.send_header('Content-length', len(csvfile))
        req.send_header('Content-Disposition','filename=lala.csv')
        req.end_headers()
        req.write(csvfile)
        raise RequestDone     

Update2 Вставка loggingstatements показывает, что match_request никогда не вызывается.

Что я делаю неправильно? (Да, create_csv () уже существует)

Обновление 3 Спасибо, за помощь =)


person Ria    schedule 08.06.2011    source источник


Ответы (2)


Если match_request не получает вызова, то process_request никогда не сможет выполнить. Если предположить, что с вашим плагином нет ничего плохого, что мешает Trac правильно загрузить его, то, вероятно, происходит то, что другой обработчик сопоставляет URL-адрес до того, как будет вызвана ваша версия match_request. Попробуйте увеличить уровень журнала до «Отладка» и посмотрите, достаточно ли в нем информации, чтобы определить, кто обрабатывает этот запрос.

Другой вариант - создать собственное «пространство имен» для ваших автоматически сгенерированных файлов. Попробуйте заменить «wiki» в сгенерированных URL-адресах чем-то вроде «files». Это должно помешать каким-либо встроенным обработчикам обработать запрос до того, как будет вызван match_request метод вашего плагина.

person bta    schedule 13.06.2011

По сути, вам нужно написать свой собственный IRequestHandler, который обрабатывает определенный URL-адрес и возвращает ваши динамически созданные данные. После этого макрос должен вернуть URL-адрес, настроенный для вашего обработчика запросов.

person Felix Schwarz    schedule 08.06.2011