Commit 2be27bf9cd1801ded98cefbbe7c01544ecd3aede

Authored by Sergio Oliveira
1 parent c7f6314f

Moved all trac bits to it's own django app

src/proxy/diazo/jenkins.xml
@@ -1,27 +0,0 @@ @@ -1,27 +0,0 @@
1 -<rules  
2 - xmlns="http://namespaces.plone.org/diazo"  
3 - xmlns:css="http://namespaces.plone.org/diazo/css"  
4 - xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
5 -  
6 - <before theme-children="/html/head" content-children="/html/head" />  
7 - <before css:theme-children="#main-content" css:content-children="body" />  
8 -  
9 - <merge attributes="class" css:theme="body" css:content="body" />  
10 - <drop css:content="#top-panel" />  
11 -  
12 - <drop attributes="style" css:content="#main-table" />  
13 -  
14 - <after theme-children="/html/head">  
15 - <script>jQuery.noConflict();</script>  
16 - <style>  
17 - #breadcrumbs {  
18 - border: 0 !important;  
19 - }  
20 -  
21 - #right-top-nav {  
22 - margin-right: 5em !important;  
23 - }  
24 - </style>  
25 - </after>  
26 -  
27 -</rules>  
src/proxy/diazo/trac.xml
@@ -1,45 +0,0 @@ @@ -1,45 +0,0 @@
1 -<rules  
2 - xmlns="http://namespaces.plone.org/diazo"  
3 - xmlns:css="http://namespaces.plone.org/diazo/css"  
4 - xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
5 -  
6 - <replace css:theme="#trac-css" content="//head/link" />  
7 - <replace css:theme="#trac-js" content="//head/script" />  
8 - <replace theme="//head/title" content="//head/title" />  
9 -  
10 - <before css:theme-children="#main-content" css:content="#main" />  
11 -  
12 - <after theme-children="/html/head">  
13 - <style>  
14 - .navbar .nav ul { font-size: 14px; text-align: left; padding: 5px 0; }  
15 - .navbar .nav li { border: 0; padding: 0; white-space: normal; display: list-item;}  
16 - :link:not(.btn),  
17 - :visited:not(.btn) { border: 0; color: rgb(66, 139, 202); }  
18 - h1 { font-size: 24px; margin: 0.15em 1em 0.5em 0px; }  
19 - h2 { font-size: 20px }  
20 - h3 { font-size: 16px }  
21 - h4 { font-size: 14px }  
22 - input[type="checkbox"], input[type="radio"] { margin: 0 4px; }  
23 - fieldset { padding: 1em; margin: 1em 0; border: 1px solid rgb(215, 215, 215); }  
24 - label { font-weight: 400; }  
25 - legend { margin-bottom: 0; width: auto; }  
26 - input, textarea, select { margin: 2px; }  
27 -  
28 - .wikitoolbar,  
29 - .wikitoolbar:before,  
30 - .wikitoolbar:after {  
31 - -moz-box-sizing: content-box;  
32 - -webkit-box-sizing: content-box;  
33 - }  
34 - .wikitoolbar :link,  
35 - .wikitoolbar :visited {  
36 - border-width: 1px;  
37 - border-style: solid;  
38 - border-color: #fff #fff #fff #ccc;  
39 - -moz-box-sizing: content-box;  
40 - -webkit-box-sizing: content-box;  
41 - }  
42 - </style>  
43 - </after>  
44 -  
45 -</rules>  
src/proxy/jenkins/diazo.xml 0 → 100644
@@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
  1 +<rules
  2 + xmlns="http://namespaces.plone.org/diazo"
  3 + xmlns:css="http://namespaces.plone.org/diazo/css"
  4 + xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5 +
  6 + <before theme-children="/html/head" content-children="/html/head" />
  7 + <before css:theme-children="#main-content" css:content-children="body" />
  8 +
  9 + <merge attributes="class" css:theme="body" css:content="body" />
  10 + <drop css:content="#top-panel" />
  11 +
  12 + <drop attributes="style" css:content="#main-table" />
  13 +
  14 + <after theme-children="/html/head">
  15 + <script>jQuery.noConflict();</script>
  16 + <style>
  17 + #breadcrumbs {
  18 + border: 0 !important;
  19 + }
  20 +
  21 + #right-top-nav {
  22 + margin-right: 5em !important;
  23 + }
  24 + </style>
  25 + </after>
  26 +
  27 +</rules>
src/proxy/search_indexes.py
@@ -1,157 +0,0 @@ @@ -1,157 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -  
3 -import math  
4 -import string  
5 -  
6 -from django.template import loader, Context  
7 -from django.utils.text import slugify  
8 -from haystack import indexes  
9 -from haystack.utils import log as logging  
10 -  
11 -from search.base_indexes import BaseIndex  
12 -from .models import Attachment, Ticket, Wiki, Revision  
13 -  
14 -  
15 -logger = logging.getLogger('haystack')  
16 -  
17 -# the string maketrans always return a string encoded with latin1  
18 -# http://stackoverflow.com/questions/1324067/how-do-i-get-str-translate-to-work-with-unicode-strings  
19 -table = string.maketrans(  
20 - string.punctuation,  
21 - '.' * len(string.punctuation)  
22 -).decode('latin1')  
23 -  
24 -  
25 -class AttachmentIndex(BaseIndex, indexes.Indexable):  
26 - title = indexes.CharField(model_attr='filename')  
27 - description = indexes.CharField(model_attr='description', null=True)  
28 - modified = indexes.DateTimeField(model_attr='created', null=True)  
29 - used_by = indexes.CharField(model_attr='used_by', null=True, stored=False)  
30 - mimetype = indexes.CharField(  
31 - model_attr='mimetype',  
32 - null=True,  
33 - stored=False  
34 - )  
35 - size = indexes.IntegerField(model_attr='size', null=True, stored=False)  
36 - filename = indexes.CharField(stored=False)  
37 -  
38 - def get_model(self):  
39 - return Attachment  
40 -  
41 - def get_updated_field(self):  
42 - return 'created'  
43 -  
44 - def prepare(self, obj):  
45 - data = super(AttachmentIndex, self).prepare(obj)  
46 -  
47 - try:  
48 - file_obj = open(obj.filepath)  
49 - except IOError as e:  
50 - logger.warning(u'IOError: %s - %s', e.strerror, e.filename)  
51 - return data  
52 - backend = self._get_backend(None)  
53 -  
54 - extracted_data = backend.extract_file_contents(file_obj)  
55 - file_obj.close()  
56 -  
57 - if not extracted_data:  
58 - return data  
59 -  
60 - t = loader.select_template(  
61 - ('search/indexes/proxy/attachment_text.txt', )  
62 - )  
63 - data['text'] = t.render(Context({  
64 - 'object': obj,  
65 - 'extracted': extracted_data,  
66 - }))  
67 - return data  
68 -  
69 - def prepare_filename(self, obj):  
70 - return obj.filename.translate(table).replace('.', ' ')  
71 -  
72 - def prepare_icon_name(self, obj):  
73 - return u'file'  
74 -  
75 - def prepare_type(self, obj):  
76 - return u'attachment'  
77 -  
78 -  
79 -class WikiIndex(BaseIndex, indexes.Indexable):  
80 - title = indexes.CharField(model_attr='name')  
81 - collaborators = indexes.CharField(  
82 - model_attr='collaborators',  
83 - null=True,  
84 - stored=False,  
85 - )  
86 -  
87 - def get_model(self):  
88 - return Wiki  
89 -  
90 - def prepare_description(self, obj):  
91 - return u'{}\n{}'.format(obj.wiki_text, obj.collaborators)  
92 -  
93 - def prepare_icon_name(self, obj):  
94 - return u'book'  
95 -  
96 - def prepare_type(self, obj):  
97 - return u'wiki'  
98 -  
99 -  
100 -class TicketIndex(BaseIndex, indexes.Indexable):  
101 - tag = indexes.CharField(model_attr='status', null=True)  
102 - milestone = indexes.CharField(model_attr='milestone', null=True)  
103 - component = indexes.CharField(model_attr='component', null=True)  
104 - severity = indexes.CharField(model_attr='severity', null=True)  
105 - reporter = indexes.CharField(model_attr='reporter', null=True)  
106 - keywords = indexes.CharField(model_attr='keywords', null=True)  
107 - collaborators = indexes.CharField(  
108 - model_attr='collaborators',  
109 - null=True,  
110 - stored=False,  
111 - )  
112 -  
113 - def get_model(self):  
114 - return Ticket  
115 -  
116 - def prepare_description(self, obj):  
117 - return u'{}\n{}\n{}\n{}\n{}\n{}\n{}'.format(  
118 - obj.description, obj.milestone, obj.component, obj.severity,  
119 - obj.reporter, obj.keywords, obj.collaborators  
120 - )  
121 -  
122 - def prepare_icon_name(self, obj):  
123 - return u'tag'  
124 -  
125 - def prepare_title(self, obj):  
126 - return u'#{} - {}'.format(obj.pk, obj.summary)  
127 -  
128 - def prepare_type(self, obj):  
129 - return 'ticket'  
130 -  
131 -  
132 -class RevisionIndex(BaseIndex, indexes.Indexable):  
133 - description = indexes.CharField(model_attr='message', null=True)  
134 - modified = indexes.DateTimeField(model_attr='created', null=True)  
135 - repository_name = indexes.CharField(  
136 - model_attr='repository_name',  
137 - stored=False  
138 - )  
139 -  
140 - def get_model(self):  
141 - return Revision  
142 -  
143 - def get_updated_field(self):  
144 - return 'created'  
145 -  
146 - def get_boost(self, obj):  
147 - boost = super(RevisionIndex, self).get_boost(obj)  
148 - return boost * 0.8  
149 -  
150 - def prepare_icon_name(self, obj):  
151 - return u'align-right'  
152 -  
153 - def prepare_title(self, obj):  
154 - return u'{} [{}]'.format(obj.repository_name, obj.rev)  
155 -  
156 - def prepare_type(self, obj):  
157 - return 'changeset'  
src/proxy/templates/proxy/trac.html
@@ -1,7 +0,0 @@ @@ -1,7 +0,0 @@
1 -{% extends "base.html" %}  
2 -  
3 -{% block head %}  
4 - <placeholder id="trac-css"/>  
5 - <placeholder id="trac-js"/>  
6 - {{ block.super }}  
7 -{% endblock %}  
src/proxy/test.html
@@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
1 -<!DOCTYPE html><html><head>  
2 -  
3 -  
4 - <title>Painel Principal [Jenkins]</title><link rel="stylesheet" type="text/css" href="/ci/static/93570b24/css/style.css" /><link rel="stylesheet" type="text/css" href="/ci/static/93570b24/css/color.css" /><link rel="shortcut icon" type="image/vnd.microsoft.icon" href="/ci/static/93570b24/favicon.ico" /><script>var isRunAsTest=false; var rootURL="/ci"; var resURL="/ci/static/93570b24";</script><script src="/ci/static/93570b24/scripts/prototype.js" type="text/javascript"></script><script src="/ci/static/93570b24/scripts/behavior.js" type="text/javascript"></script><script src='/ci/adjuncts/93570b24/org/kohsuke/stapler/bind.js' type='text/javascript'></script><script src="/ci/static/93570b24/scripts/yui/yahoo/yahoo-min.js"></script><script src="/ci/static/93570b24/scripts/yui/dom/dom-min.js"></script><script src="/ci/static/93570b24/scripts/yui/event/event-min.js"></script><script src="/ci/static/93570b24/scripts/yui/animation/animation-min.js"></script><script src="/ci/static/93570b24/scripts/yui/dragdrop/dragdrop-min.js"></script><script src="/ci/static/93570b24/scripts/yui/container/container-min.js"></script><script src="/ci/static/93570b24/scripts/yui/connection/connection-min.js"></script><script src="/ci/static/93570b24/scripts/yui/datasource/datasource-min.js"></script><script src="/ci/static/93570b24/scripts/yui/autocomplete/autocomplete-min.js"></script><script src="/ci/static/93570b24/scripts/yui/menu/menu-min.js"></script><script src="/ci/static/93570b24/scripts/yui/element/element-min.js"></script><script src="/ci/static/93570b24/scripts/yui/button/button-min.js"></script><script src="/ci/static/93570b24/scripts/yui/storage/storage-min.js"></script><script src="/ci/static/93570b24/scripts/hudson-behavior.js" type="text/javascript"></script><script src="/ci/static/93570b24/scripts/sortable.js" type="text/javascript"></script><script>crumb.init("", "");</script><link rel="stylesheet" type="text/css" href="/ci/static/93570b24/scripts/yui/container/assets/container.css" /><link rel="stylesheet" type="text/css" href="/ci/static/93570b24/scripts/yui/assets/skins/sam/skin.css" /><link rel="stylesheet" type="text/css" href="/ci/static/93570b24/scripts/yui/container/assets/skins/sam/container.css" /><link rel="stylesheet" type="text/css" href="/ci/static/93570b24/scripts/yui/button/assets/skins/sam/button.css" /><link rel="stylesheet" type="text/css" href="/ci/static/93570b24/scripts/yui/menu/assets/skins/sam/menu.css" /><link title="Jenkins" rel="search" type="application/opensearchdescription+xml" href="/ci/opensearch.xml" /><meta name="ROBOTS" content="INDEX,NOFOLLOW" /><link title="Jenkins:Tudo (all builds)" rel="alternate" type="application/rss+xml" href="/ci/rssAll" /><link title="Jenkins:Tudo (all builds) (RSS 2.0)" rel="alternate" type="application/rss+xml" href="/ci/rssAll?flavor=rss20" /><link title="Jenkins:Tudo (failed builds)" rel="alternate" type="application/rss+xml" href="/ci/rssFailed" /><link title="Jenkins:Tudo (failed builds) (RSS 2.0)" rel="alternate" type="application/rss+xml" href="/ci/rssFailed?flavor=rss20" /><script src="/ci/static/93570b24/scripts/yui/cookie/cookie-min.js"></script><script>  
5 - YAHOO.util.Cookie.set("screenResolution", screen.width+"x"+screen.height);  
6 - </script><script src="/ci/static/93570b24/scripts/yui/cookie/cookie-min.js"></script></head><body class="yui-skin-sam"><a href="#skip2content" class="skiplink">Skip to content</a><table id="header" cellpadding="0" cellspacing="0" width="100%" border="0"><tr><td id="top-panel" colspan="2"><table cellpadding="0" cellspacing="0" width="100%" border="0"><tr><td style="font-weight:bold; font-size: 2em;"><a href="/ci/"><img alt="title" src="/ci/static/93570b24/images/title.png" /></a></td><td style="vertical-align: middle; text-align: right; padding-right: 1em;"><form style="position:relative;" name="search" action="/ci/search/" class="no-json" method="get"><div id="search-box-minWidth"></div><div id="search-box-sizer"></div><div id="searchform"><input id="search-box" name="q" value="buscar" class="has-default-text defaulted" /> <a href="http://wiki.jenkins-ci.org/display/JENKINS/Search+Box"><img height="16" alt="help for search" width="16" src="/ci/static/93570b24/images/16x16/help.png" /></a><div id="search-box-completion"></div><script>createSearchBox("/ci/search/");</script></div></form></td><td id="login-field"><span> <a style="color:inherit" href="/ci/login?from=%2Fci%2F"><b>Logar</b></a>  
7 - |  
8 - <a href="/ci/signup"><b>registrar</b></a></span></td></tr></table></td></tr><tr id="top-nav"><td id="left-top-nav" colspan="2"><link rel='stylesheet' href='/ci/adjuncts/93570b24/lib/layout/breadcrumbs.css' type='text/css' /><script src='/ci/adjuncts/93570b24/lib/layout/breadcrumbs.js' type='text/javascript'></script><div class="top-sticker noedge"><div class="top-sticker-inner"><div id="right-top-nav"><div id="right-top-nav"><div class="smallfont"><a href="?auto_refresh=true">ENABLE AUTO REFRESH</a></div></div></div><ul id="breadcrumbs"><li class="true?null:'no-context-menu'}"><a href="/ci/">Jenkins</a></li></ul><div id="breadcrumb-menu-target"></div></div></div></td></tr></table><table id="main-table" height="70%" style="background-image: url(/ci/static/93570b24/images/jenkins.png); background-repeat: no-repeat; background-position: bottom left;" width="100%" border="0"><tr><td id="side-panel" width="20%"><div id="navigation" style="min-height: 323px; height: auto !important; height: 323px;"><div id="tasks"><div class="task">  
9 -  
10 -  
11 - <a href="/ci/view/Tudo/newJob"><img height="24" style="margin: 2px;" alt="" width="24" src="/ci/static/93570b24/images/24x24/new-package.png" /></a> <a href="/ci/view/Tudo/newJob">Novo(a) Job</a></div><div class="task">  
12 -  
13 -  
14 - <a href="/ci/people/"><img height="24" style="margin: 2px;" alt="" width="24" src="/ci/static/93570b24/images/24x24/user.png" /></a> <a href="/ci/people/">Pessoas</a></div><div class="task">  
15 -  
16 -  
17 - <a href="/ci/view/Tudo/builds"><img height="24" style="margin: 2px;" alt="" width="24" src="/ci/static/93570b24/images/24x24/notepad.png" /></a> <a href="/ci/view/Tudo/builds">Histórico de Construções</a></div><div class="task">  
18 -  
19 -  
20 - <a href="/ci/manage"><img height="24" style="margin: 2px;" alt="" width="24" src="/ci/static/93570b24/images/24x24/setting.png" /></a> <a href="/ci/manage">Gerenciar Jenkins</a></div></div><table id="buildQueue" class="pane"><tr><td colspan="2" class="pane-header">Fila de Compilação</td></tr><tr><td class="pane" colspan="2">Nenhuma compilação na fila.</td></tr></table><script defer="defer">refreshPart('buildQueue',"./ajaxBuildQueue");</script><table id="executors" class="pane"><tr><td colspan="3" class="pane-header"><a href='/ci/computer/'>Estado do Executador de Compilação</a></td></tr><colgroup><col width="1*" /><col width="200*" /><col width="24" /></colgroup><tr><th class="pane">#</th><th class="pane" colspan="2"><div style="margin-right:19px">Estado</div></th></tr><tr><td class="pane" align="right" style="vertical-align: top">1</td><td class="pane">Ocioso</td><td class="pane"></td></tr><tr><td class="pane" align="right" style="vertical-align: top">2</td><td class="pane">Ocioso</td><td class="pane"></td></tr></table><script defer="defer">refreshPart('executors',"./ajaxExecutors");</script></div></td><td id="main-panel" width="80%" height="100%"><a name="skip2content"></a><div id="view-message"><div id="description"><div></div><div align="right"><a onclick="return replaceDescription();" href="editDescription"><img height="16" alt="" width="16" src="/ci/static/93570b24/images/16x16/notepad.png" />adicionar descrição</a></div></div></div><div class="dashboard"><table cellpadding="0" cellspacing="0" id="viewList"><tr style="height:3px;"><td style="height:3px; padding:0px"></td><td class="active" rowspan="2">Tudo</td><td style="height:3px; padding:0px"></td></tr><tr><td style="border: none; border-bottom: 1px solid #bbb;"> </td><td class="inactive noLeft"><a title="Nova Visão" href="/ci/newView">+</a></td><td class="filler"> </td></tr></table><table id="projectstatus" style="margin-top:0px; border-top: none;" class="sortable pane bigtable"><tr style="border-top: 0px;"><th tooltip="Estado da última compilação">&nbsp;&nbsp;&nbsp;S</th><th tooltip="Relatório de clima mostrando o status consolidado das construções recentes">&nbsp;&nbsp;&nbsp;W</th><th initialSortDir="down">Name</th><th>Último Sucesso</th><th>Última Falha</th><th>Última Duração</th><th width="1"> </th><th> </th></tr><tr id="job_Portal Interlegis"><td data="0"><img alt="Falhou" class="icon32x32" src="/ci/static/93570b24/images/32x32/red.png" tooltip="Falhou" /></td><td data="0" class="healthReport" onmouseover="this.className='healthReport hover';return true;  
21 - " onmouseout="this.className='healthReport';return true;"><a href="job/Portal%20Interlegis/lastBuild"><img alt="0%" class="icon32x32" src="/ci/static/93570b24/images/32x32/health-00to19.png" /></a><div class="healthReportDetails"><table border="0"><thead><tr><th align="left">W</th><th align="left">Descrição</th><th align="right">%</th></tr></thead><tbody><tr><td align="left"><img title="" alt="" src="/ci/static/93570b24/images/16x16/health-00to19.png" /></td><td>Estabilidade de construção: Todas as construções recentes falharam.</td><td align="right">0</td></tr></tbody></table></div></td><td><a class="model-link" href="job/Portal%20Interlegis/">Portal Interlegis</a></td><td data="-">N/D</td><td data="2012-09-03T20:01:05Z">  
22 - 1 ano 2 meses  
23 - (<a class="model-link" href="job/Portal%20Interlegis/lastFailedBuild/">#13</a>)  
24 - </td><td data="4255">4,2 segundos</td><td><a href="job/Portal%20Interlegis/build?delay=0sec"><img title="Agendar uma construção" alt="Agendar uma construção" src="/ci/static/93570b24/images/24x24/clock.png" border="0" /></a></td><td> </td></tr></table><table style="width:100%"><tr><td>Ícone:  
25 -  <a href="/ci/iconSize?16x16">S</a> <a href="/ci/iconSize?24x24">M</a> L</td><td><div align="right" style="margin:1em"><a href="/ci/legend">Legenda</a><span style="padding-left:1em"><a href="rssAll"><img height="16" alt="Feed" width="16" src="/ci/static/93570b24/images/atom.gif" border="0" /> RSS para todos</a></span><span style="padding-left:1em"><a href="rssFailed"><img height="16" alt="Feed" width="16" src="/ci/static/93570b24/images/atom.gif" border="0" /> RSS para falhas</a></span><span style="padding-left:1em"><a href="rssLatest"><img height="16" alt="Feed" width="16" src="/ci/static/93570b24/images/atom.gif" border="0" /> RSS apenas para as últimas construções</a></span></div></td></tr></table></div></td></tr></table><table width="100%"><tr><td id="footer"><span style="padding-right:2em; color:gray">  
26 - Página gerada em:  
27 - 21/11/2013 16:59:30</span><span style="padding-right:2em"><a href="api/">REST API</a></span><a href="http://jenkins-ci.org/">Jenkins ver. 1.477</a></td></tr></table><script>Behaviour.addLoadEvent(function() { downloadService.download("hudson.tasks.Maven.MavenInstaller","http://updates.jenkins-ci.org/updates/hudson.tasks.Maven.MavenInstaller.json",{version:"1.477"},"/ci/descriptor/hudson.model.DownloadService/byId/hudson.tasks.Maven.MavenInstaller/postBack",null);});</script><script>Behaviour.addLoadEvent(function() { downloadService.download("hudson.tasks.Ant.AntInstaller","http://updates.jenkins-ci.org/updates/hudson.tasks.Ant.AntInstaller.json",{version:"1.477"},"/ci/descriptor/hudson.model.DownloadService/byId/hudson.tasks.Ant.AntInstaller/postBack",null);});</script><script>Behaviour.addLoadEvent(function() { downloadService.download("hudson.tools.JDKInstaller","http://updates.jenkins-ci.org/updates/hudson.tools.JDKInstaller.json",{version:"1.477"},"/ci/descriptor/hudson.model.DownloadService/byId/hudson.tools.JDKInstaller/postBack",null);});</script><div id="l10n-dialog" class="dialog"></div><div id="l10n-footer" style="display:none; float:left"><a href="#" onclick="return showTranslationDialog();"><img src="/ci/plugin/translation/flags.png" />  
28 - Ajude-nos a traduzir esta página!  
29 - </a></div><script>var footer = document.getElementById('l10n-footer');  
30 - var f = document.getElementById('footer');  
31 - f.insertBefore(footer,f.firstChild);  
32 - footer.style.display="block";  
33 -  
34 - var translation={};  
35 - translation.bundles = "2NnwkGTHJrEDa0LWifLhzy0bMMKQpfr+V8jqndzlngw8BcpuWU5pjp88+DvojWmlwDWk5m1yDKf+uVfATuzn/o9R6ohC+FzqqtfmVvk5qee2XfHlwey+vSS7+I6CXDq+WEIAbvl4UyC0YbxXUNHV+UDWGj9u3noOvWQzyVZIAz7OwpltiCaChyLRN8o/Ga7v/FuhvR6ylHYU2qtTpGsRVucVXKcZIfthj+eGnVIio9aHNE+u7OWIApYbnftjJt3ulC39+i6H/i8r3iTr6qGxDrPBkvWUW5AGQsXZ4uS8UchpnPV1JWyPp8odeubPq1mzHevzbWXHSM4bg5PUQJI1r6tc5puI89i/CFOpKKVg3uZqnnbJ5f+CMBZMYSOYLg07t7iDUu60xIAZ43nXqKO301bRp8+MQEIvESNl1ljGyNUIVq4zqIabq6XJ6jtXJn8jFwQ4JuYZkqclHjQf6dIYHvu9QEYGzbbSdAX9JA0MY2Vg9olsS/nWqekhJ31sgEt5XTYlIpv3GwLWJjscFWith3uFsch1i/brTqK+05x/u4+7nLlJt1D+SViTWh+ocHddv0h06pZr2prrdGJCfSpCCmIp2+BYxLvBVaeceOtrabCUvFgKO2ofnSryjLrKj2bRwy+Ierw0TAVTDQP7gVF4edoMU9ATzAGNf2JtV9UvlkRGGxSuG6L+dvNVZ5gMVVHbHBtlgV7+pGIzgMTSfNHwz92R8ezx9ycor6Xo8WrXsMBCjTzy6mThLp1IpnIfyV+W4rYPpxcHe2/xWPysjLezZxgnmrhxLgtcQnKUK+buUHaL7GDooEPMx13v/NB2Ym3U";  
36 - translation.detectedLocale = "";  
37 -  
38 - function showTranslationDialog() {  
39 - if(!translation.launchDialog)  
40 - loadScript("/ci/plugin/translation/dialog.js");  
41 - else  
42 - translation.launchDialog();  
43 - return false;  
44 - }</script></body></html>  
45 \ No newline at end of file 0 \ No newline at end of file
src/proxy/trac/diazo.xml 0 → 100644
@@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
  1 +<rules
  2 + xmlns="http://namespaces.plone.org/diazo"
  3 + xmlns:css="http://namespaces.plone.org/diazo/css"
  4 + xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5 +
  6 + <replace css:theme="#trac-css" content="//head/link" />
  7 + <replace css:theme="#trac-js" content="//head/script" />
  8 + <replace theme="//head/title" content="//head/title" />
  9 +
  10 + <before css:theme-children="#main-content" css:content="#main" />
  11 +
  12 + <after theme-children="/html/head">
  13 + <style>
  14 + .navbar .nav ul { font-size: 14px; text-align: left; padding: 5px 0; }
  15 + .navbar .nav li { border: 0; padding: 0; white-space: normal; display: list-item;}
  16 + :link:not(.btn),
  17 + :visited:not(.btn) { border: 0; color: rgb(66, 139, 202); }
  18 + h1 { font-size: 24px; margin: 0.15em 1em 0.5em 0px; }
  19 + h2 { font-size: 20px }
  20 + h3 { font-size: 16px }
  21 + h4 { font-size: 14px }
  22 + input[type="checkbox"], input[type="radio"] { margin: 0 4px; }
  23 + fieldset { padding: 1em; margin: 1em 0; border: 1px solid rgb(215, 215, 215); }
  24 + label { font-weight: 400; }
  25 + legend { margin-bottom: 0; width: auto; }
  26 + input, textarea, select { margin: 2px; }
  27 +
  28 + .wikitoolbar,
  29 + .wikitoolbar:before,
  30 + .wikitoolbar:after {
  31 + -moz-box-sizing: content-box;
  32 + -webkit-box-sizing: content-box;
  33 + }
  34 + .wikitoolbar :link,
  35 + .wikitoolbar :visited {
  36 + border-width: 1px;
  37 + border-style: solid;
  38 + border-color: #fff #fff #fff #ccc;
  39 + -moz-box-sizing: content-box;
  40 + -webkit-box-sizing: content-box;
  41 + }
  42 + </style>
  43 + </after>
  44 +
  45 +</rules>
src/proxy/trac/search_indexes.py 0 → 100644
@@ -0,0 +1,157 @@ @@ -0,0 +1,157 @@
  1 +# -*- coding: utf-8 -*-
  2 +
  3 +import math
  4 +import string
  5 +
  6 +from django.template import loader, Context
  7 +from django.utils.text import slugify
  8 +from haystack import indexes
  9 +from haystack.utils import log as logging
  10 +
  11 +from search.base_indexes import BaseIndex
  12 +from .models import Attachment, Ticket, Wiki, Revision
  13 +
  14 +
  15 +logger = logging.getLogger('haystack')
  16 +
  17 +# the string maketrans always return a string encoded with latin1
  18 +# http://stackoverflow.com/questions/1324067/how-do-i-get-str-translate-to-work-with-unicode-strings
  19 +table = string.maketrans(
  20 + string.punctuation,
  21 + '.' * len(string.punctuation)
  22 +).decode('latin1')
  23 +
  24 +
  25 +class AttachmentIndex(BaseIndex, indexes.Indexable):
  26 + title = indexes.CharField(model_attr='filename')
  27 + description = indexes.CharField(model_attr='description', null=True)
  28 + modified = indexes.DateTimeField(model_attr='created', null=True)
  29 + used_by = indexes.CharField(model_attr='used_by', null=True, stored=False)
  30 + mimetype = indexes.CharField(
  31 + model_attr='mimetype',
  32 + null=True,
  33 + stored=False
  34 + )
  35 + size = indexes.IntegerField(model_attr='size', null=True, stored=False)
  36 + filename = indexes.CharField(stored=False)
  37 +
  38 + def get_model(self):
  39 + return Attachment
  40 +
  41 + def get_updated_field(self):
  42 + return 'created'
  43 +
  44 + def prepare(self, obj):
  45 + data = super(AttachmentIndex, self).prepare(obj)
  46 +
  47 + try:
  48 + file_obj = open(obj.filepath)
  49 + except IOError as e:
  50 + logger.warning(u'IOError: %s - %s', e.strerror, e.filename)
  51 + return data
  52 + backend = self._get_backend(None)
  53 +
  54 + extracted_data = backend.extract_file_contents(file_obj)
  55 + file_obj.close()
  56 +
  57 + if not extracted_data:
  58 + return data
  59 +
  60 + t = loader.select_template(
  61 + ('search/indexes/proxy/attachment_text.txt', )
  62 + )
  63 + data['text'] = t.render(Context({
  64 + 'object': obj,
  65 + 'extracted': extracted_data,
  66 + }))
  67 + return data
  68 +
  69 + def prepare_filename(self, obj):
  70 + return obj.filename.translate(table).replace('.', ' ')
  71 +
  72 + def prepare_icon_name(self, obj):
  73 + return u'file'
  74 +
  75 + def prepare_type(self, obj):
  76 + return u'attachment'
  77 +
  78 +
  79 +class WikiIndex(BaseIndex, indexes.Indexable):
  80 + title = indexes.CharField(model_attr='name')
  81 + collaborators = indexes.CharField(
  82 + model_attr='collaborators',
  83 + null=True,
  84 + stored=False,
  85 + )
  86 +
  87 + def get_model(self):
  88 + return Wiki
  89 +
  90 + def prepare_description(self, obj):
  91 + return u'{}\n{}'.format(obj.wiki_text, obj.collaborators)
  92 +
  93 + def prepare_icon_name(self, obj):
  94 + return u'book'
  95 +
  96 + def prepare_type(self, obj):
  97 + return u'wiki'
  98 +
  99 +
  100 +class TicketIndex(BaseIndex, indexes.Indexable):
  101 + tag = indexes.CharField(model_attr='status', null=True)
  102 + milestone = indexes.CharField(model_attr='milestone', null=True)
  103 + component = indexes.CharField(model_attr='component', null=True)
  104 + severity = indexes.CharField(model_attr='severity', null=True)
  105 + reporter = indexes.CharField(model_attr='reporter', null=True)
  106 + keywords = indexes.CharField(model_attr='keywords', null=True)
  107 + collaborators = indexes.CharField(
  108 + model_attr='collaborators',
  109 + null=True,
  110 + stored=False,
  111 + )
  112 +
  113 + def get_model(self):
  114 + return Ticket
  115 +
  116 + def prepare_description(self, obj):
  117 + return u'{}\n{}\n{}\n{}\n{}\n{}\n{}'.format(
  118 + obj.description, obj.milestone, obj.component, obj.severity,
  119 + obj.reporter, obj.keywords, obj.collaborators
  120 + )
  121 +
  122 + def prepare_icon_name(self, obj):
  123 + return u'tag'
  124 +
  125 + def prepare_title(self, obj):
  126 + return u'#{} - {}'.format(obj.pk, obj.summary)
  127 +
  128 + def prepare_type(self, obj):
  129 + return 'ticket'
  130 +
  131 +
  132 +class RevisionIndex(BaseIndex, indexes.Indexable):
  133 + description = indexes.CharField(model_attr='message', null=True)
  134 + modified = indexes.DateTimeField(model_attr='created', null=True)
  135 + repository_name = indexes.CharField(
  136 + model_attr='repository_name',
  137 + stored=False
  138 + )
  139 +
  140 + def get_model(self):
  141 + return Revision
  142 +
  143 + def get_updated_field(self):
  144 + return 'created'
  145 +
  146 + def get_boost(self, obj):
  147 + boost = super(RevisionIndex, self).get_boost(obj)
  148 + return boost * 0.8
  149 +
  150 + def prepare_icon_name(self, obj):
  151 + return u'align-right'
  152 +
  153 + def prepare_title(self, obj):
  154 + return u'{} [{}]'.format(obj.repository_name, obj.rev)
  155 +
  156 + def prepare_type(self, obj):
  157 + return 'changeset'
src/proxy/trac/templates/proxy/trac.html 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +{% extends "base.html" %}
  2 +
  3 +{% block head %}
  4 + <placeholder id="trac-css"/>
  5 + <placeholder id="trac-js"/>
  6 + {{ block.super }}
  7 +{% endblock %}
src/proxy/trac/urls.py
1 1
2 -from django.conf.urls import patterns, include, url 2 +from django.conf.urls import patterns, url
3 3
4 from .views import TracProxyView 4 from .views import TracProxyView
5 5
6 6
7 urlpatterns = patterns('', 7 urlpatterns = patterns('',
8 - # Trac URLs  
9 - url(r'^(?P<path>(?:admin|wiki|changeset|newticket|ticket|chrome|timeline|roadmap|browser|report|tags|query|about|prefs|log|attachment|raw-attachment|diff|milestone).*)$',  
10 - TracProxyView.as_view()),  
11 -  
12 - # Trac  
13 - url(r'^trac/(?P<path>.*)$', TracProxyView.as_view()), 8 + # Trac
  9 + url(r'^trac/(?P<path>.*)$', TracProxyView.as_view()),
14 ) 10 )
src/proxy/trac/views.py
1 1
2 -import os  
3 -  
4 from django.conf import settings 2 from django.conf import settings
5 3
6 -from revproxy.views import ProxyView  
7 from hitcounter.views import HitCounterViewMixin 4 from hitcounter.views import HitCounterViewMixin
8 5
  6 +from ..utils import ColabProxyView
9 from .models import Wiki, Ticket, Revision 7 from .models import Wiki, Ticket, Revision
10 8
11 9
12 -CWD = os.path.abspath(os.path.dirname(__file__))  
13 -DIAZO_RULES_DIR = os.path.join(CWD, 'diazo')  
14 -  
15 -  
16 -class TracProxyView(HitCounterViewMixin, ProxyView):  
17 - base_url = settings.COLAB_TRAC_URL  
18 - add_remote_user = settings.REVPROXY_ADD_REMOTE_USER 10 +class TracProxyView(HitCounterViewMixin, ColabProxyView):
  11 + upstream = settings.COLAB_TRAC_URL
19 diazo_theme_template = 'proxy/trac.html' 12 diazo_theme_template = 'proxy/trac.html'
20 - diazo_rules = os.path.join(DIAZO_RULES_DIR, 'trac.xml')  
21 - html5 = True  
22 13
23 def get_object(self): 14 def get_object(self):
24 obj = None 15 obj = None
src/proxy/urls.py
1 1
2 from django.conf.urls import patterns, include, url 2 from django.conf.urls import patterns, include, url
3 3
4 -from .views import ProxyView, JenkinsProxyView, GitlabProxyView, RedmineProxyView 4 +from .views import JenkinsProxyView, GitlabProxyView, RedmineProxyView
5 5
6 6
7 urlpatterns = patterns('', 7 urlpatterns = patterns('',
src/proxy/utils.py 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +
  2 +from django.conf import settings
  3 +
  4 +from revproxy.views import ProxyView
  5 +
  6 +
  7 +class ColabProxyView(ProxyView):
  8 + add_remote_user = settings.REVPROXY_ADD_REMOTE_USER
  9 + diazo_theme_template = 'base.html'
  10 + html5 = True