Skip to content

Commit 33af778

Browse files
committed
jinja2: added query editing pages
1 parent 8147af5 commit 33af778

File tree

5 files changed

+254
-7
lines changed

5 files changed

+254
-7
lines changed

share/roundup/templates/jinja2/html/issue.search.html

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
{% macro input(name, type='text') -%}
1212
<input class="form-control" type="{{ type }}" name="{{ name }}"
13-
value="{{ request.form.getvalue(name, '')|e }}" />
13+
value="{{ request.form.getvalue(name, '') }}" />
1414
{%- endmacro %}
1515
{% macro display_column(name) -%}
1616
<input type="checkbox" name="@columns"
@@ -173,18 +173,35 @@
173173
<td><input type="checkbox" name="@groupdir" {% if group_desc %}checked{% endif %} /></td>
174174
</tr>
175175

176+
{% if request.user.hasPermission('Edit', 'query') %}
177+
<tr>
178+
<th>{% trans %}Query name**:{% endtrans %}</th>
179+
{% set value = request.form.getvalue('@queryname', '') %}
180+
<td>
181+
<input name="@queryname" value="{{ value }}" />
182+
<input type="hidden" name="@old-queryname" value="{{ value }}" />
183+
<input type="hidden" name="@template" value="index|search" />
184+
</td>
185+
</tr>
186+
{% endif %}
187+
176188
<tr>
177189
<td>
178190
&nbsp;
179191
<input type="hidden" name="@action" value="search">
180192
</td>
181-
<td><input class="btn btn-primary" type="submit" value="Search" i18n:attributes="value"></td>
193+
<td><input class="btn btn-primary" type="submit" value="{% trans %}Search{% endtrans %}"></td>
182194
</tr>
183195

184-
<tr><td>&nbsp;</td>
185-
<td colspan="4" class="help">
186-
{% trans %}*: The "all text" field will look in message bodies and issue titles{% endtrans %}
187-
</td>
196+
<tr>
197+
<td>&nbsp;</td>
198+
<td colspan="4" class="help">
199+
{% trans %}*: The "all text" field will look in message bodies and issue titles{% endtrans %}
200+
{% if request.user.hasPermission('Edit', 'query') %}
201+
<br>
202+
{% trans %}**: If you supply a name, the query will be saved off and available as a link in the sidebar{% endtrans %}
203+
{% endif %}
204+
</td>
188205
</tr>
189206
</table>
190207
</form>

share/roundup/templates/jinja2/html/layout/edit.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
<label class="col-form-label" for="{{ name }}">{{ i18n.gettext(text)|u|safe }}</label>
4646
</dt>
4747
<dd class="col col-8 col-md-9 col-lg-10">
48-
<textarea class="form-control" name="{{ name }}" id="{{ name }}" rows="5">{% if name in request.form %}{{ request.form[name].value|u }}{% endif %}</textarea>
48+
<textarea class="form-control" name="{{ name }}" id="{{ name }}" rows="5">{{ request.form.getvalue(name, '')|u }}</textarea>
4949
</dd>
5050
</div>
5151
{% endmacro -%}

share/roundup/templates/jinja2/html/layout/navigation.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
{% if request.user.hasPermission('View', 'query') %}
55
<p>
66
<b>{% trans %}Your Queries{% endtrans %}</b> (<a href="query?@template=edit">{% trans %}edit{% endtrans %}</a>)
7+
{% for qs in request.user.queries %}
8+
<br />
9+
<a href="{{ qs.klass.plain() }}?{{ qs.url.plain() }}&amp;@dispname={{ qs.name.url_quote()|u }}">{{ qs.name.plain()|u }}</a>
10+
{% endfor %}
711
</p>
812
{% endif %}
913

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
{% extends "layout/page.html" -%}
2+
3+
{% block head_title %}
4+
{% trans %}"Your Queries" Editing{% endtrans %} - {{ config.TRACKER_NAME }}
5+
{% endblock -%}
6+
7+
{% block page_header %}
8+
{% if not context.is_edit_ok() %}
9+
{% trans %}You are not allowed to edit queries.{% endtrans %}
10+
{% else %}
11+
{% trans %}"Your Queries" Editing{% endtrans %}
12+
{% endif %}
13+
{% endblock -%}
14+
15+
{% block extrajs %}
16+
<script nonce="{{ request.client.client_nonce }}"
17+
language="javascript">
18+
// This allows us to make the delete button an immediate action.
19+
// The post_to_url function comes from:
20+
// http://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit
21+
function retire(qid, csrf) {
22+
post_to_url('query'+qid, {'@action': 'retire', '@template':'edit',
23+
'@csrf': csrf});
24+
}
25+
26+
function restore(qid, csrf) {
27+
post_to_url('query'+qid, {'@action': 'restore', '@template': 'edit',
28+
'@csrf': csrf});
29+
}
30+
function post_to_url(path, params, method) {
31+
method = method || "post"; // Set method to post by default if not specified.
32+
33+
var form = document.createElement("form");
34+
form.setAttribute("method", method);
35+
form.setAttribute("action", path);
36+
37+
for(var key in params) {
38+
if(params.hasOwnProperty(key)) {
39+
var hiddenField = document.createElement("input");
40+
hiddenField.setAttribute("type", "hidden");
41+
hiddenField.setAttribute("name", key);
42+
hiddenField.setAttribute("value", params[key]);
43+
44+
form.appendChild(hiddenField);
45+
}
46+
}
47+
48+
document.body.appendChild(form);
49+
form.submit();
50+
}
51+
</script>
52+
{% endblock -%}
53+
54+
{% macro include_query(query) %}
55+
<td>
56+
{% if query.id not in request.user.queries %}
57+
<select name="user{{ request.user.id }}@add@queries">
58+
<option value="">{% trans %}leave out{% endtrans %}</option>
59+
<option value="{{ query.id }}">{% trans %}include{% endtrans %}</option>
60+
</select>
61+
{% else %}
62+
<select name="user{{ request.user.id }}@remove@queries">
63+
<option value="">{% trans %}leave in{% endtrans %}</option>
64+
<option value="{{ query.id }}">{% trans %}remove{% endtrans %}</option>
65+
</select>
66+
{% endif %}
67+
</td>
68+
{% endmacro %}
69+
70+
{% block content %}
71+
{% include 'layout/permission.html' %}
72+
73+
{% if context.is_edit_ok() %}
74+
<form method="POST" onSubmit="return submit_once()" action="query"
75+
enctype="multipart/form-data">
76+
77+
<table class="list" width="100%">
78+
{% set uid = request.user.id -%}
79+
{% set mine = request.user.queries -%}
80+
81+
<tr>
82+
<th>{% trans %}Query{% endtrans %}</th>
83+
<th>{% trans %}Include in "Your Queries"{% endtrans %}</th>
84+
<th>{% trans %}Edit{% endtrans %}</th>
85+
<th>{% trans %}Private to you?{% endtrans %}</th>
86+
<th>{% trans %}delete/restore<br> (javascript<br>required){% endtrans %}</th>
87+
</tr>
88+
<tr>
89+
<td colspan="5"><b>{% trans %}Queries I created{% endtrans %}</b></td>
90+
</tr>
91+
92+
{% set queries = db.query.filter(filterspec={'creator': uid}) %}
93+
{% for query in queries %}
94+
<tr>
95+
<td>
96+
<a href="{{ query.klass.plain()|u }}?{{ query.url.plain()|u }}">{{ query.name.plain() }}</a>
97+
</td>
98+
99+
{{ include_query(query) }}
100+
101+
<td>
102+
<a href="query{{ query.id }}">{% trans %}edit{% endtrans %}</a>
103+
</td>
104+
105+
<td>
106+
<select name="query{{ query.id }}@private_for">
107+
<option {% if query.private_for == uid %}selected{% endif %}
108+
value="{{ uid }}">{% trans %}yes{% endtrans %}</option>
109+
<option {% if not query.private_for %}selected{% endif %}
110+
value="-1">{% trans %}no{% endtrans %}</option>
111+
</select>
112+
</td>
113+
114+
<td>
115+
<input class="btn btn-sm btn-danger" type="button"
116+
value="{% trans %}Delete{% endtrans %}"
117+
onClick="retire('{{ query.id }}','{{ utils.anti_csrf_nonce() }}')">
118+
</td>
119+
</tr>
120+
{% endfor %}
121+
<tr>
122+
<td colspan="4"><b>{% trans %}Queries others created{% endtrans %}</b></td>
123+
<td colspan="4"><b>{% trans %}Owner{% endtrans %}</b></td>
124+
</tr>
125+
126+
{% set queries = db.query.filter(filterspec={'private_for': None}) %}
127+
{% for query in queries %}
128+
<tr>
129+
{% if query.creator != uid %}
130+
<td>
131+
<a href="{{ query.klass.plain()|u }}?{{ query.url.plain()|u }}">{{ query.name.plain() }}</a>
132+
</td>
133+
134+
{{ include_query(query) }}
135+
136+
{% if not query.is_edit_ok() %}
137+
<td colspan="2">{% trans %}[not yours to edit]{% endtrans %}</td>
138+
{% else %}
139+
<td colspan="2"><a href="query{{ query.id }}">{% trans %}edit{% endtrans %}</a></td>
140+
{% endif %}
141+
<td colspan="2">{{ query.creator.plain()|u }}</td>
142+
{% endif %}
143+
</tr>
144+
{% endfor %}
145+
146+
<tr>
147+
<td colspan="5"><b>{% trans %}Active retired/private queries{% endtrans %}</b></td>
148+
</tr>
149+
{% for query in request.user.queries %}
150+
<tr>
151+
{% if query.is_retired() %}
152+
<td>
153+
<a href="{{ query.klass.plain()|u }}?{{ query.url.plain()|u }}">{{ query.name.plain() }}</a>
154+
</td>
155+
156+
{% if query.creator != uid %}
157+
{{ include_query(query) }}
158+
{% endif %}
159+
160+
<td colspan="{% if query.creator == uid %}3{% else %}2{% endif %}">{% trans %}[query is retired]{% endtrans %}</td>
161+
{% if query.creator == uid %}
162+
<td>
163+
<input class="btn btn-sm btn-success" type="button"
164+
value="{% trans %}Restore{% endtrans %}"
165+
onClick="restore('{{ query.id }}','{{ utils.anti_csrf_nonce() }}')" />
166+
</td>
167+
{% else %}
168+
<td>{{ query.creator.plain()|u }}</td>
169+
{% endif %}
170+
{% endif %}
171+
</tr>
172+
<tr>
173+
{% if query.private_for and query.creator != uid %}
174+
<td>
175+
<a href="{{ query.klass.plain()|u }}?{{ query.url.plain()|u }}">{{ query.name.plain() }}</a>
176+
</td>
177+
178+
{{ include_query(query) }}
179+
180+
<td colspan="2">{% trans %}[query is private]{% endtrans %}</td>
181+
{% if query.creator == uid %}
182+
<td>
183+
<input type="button" value="{% trans %}Restore{% endtrans %}"
184+
onClick="restore('{{ query.id }}','{{ utils.anti_csrf_nonce() }}')" />
185+
</td>
186+
{% endif %}
187+
<td>{{ query.creator.plain()|u }}</td>
188+
{% endif %}
189+
</tr>
190+
{% endfor %}
191+
<tr>
192+
<td colspan="5">
193+
<input type="hidden" name="@action" value="edit" />
194+
<input type="hidden" name="@template" value="edit" />
195+
<input name="@csrf" type="hidden" value="{{ utils.anti_csrf_nonce() }}" />
196+
<input class="btn btn-primary" type="submit"
197+
value="{% trans %}Save Selection{% endtrans %}" />
198+
</td>
199+
</tr>
200+
201+
</table>
202+
203+
</form>
204+
</td>
205+
{% endif %}
206+
{% endblock %}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{% if context.is_view_ok() %}
2+
{{ context.renderQueryForm()|u|safe }}
3+
{% else %}
4+
{% extends "layout/page.html" -%}
5+
6+
{% block head_title %}
7+
{% trans %}You can not view query{% endtrans %} - {{ config.TRACKER_NAME }}
8+
{% endblock -%}
9+
10+
{% block page_header %}
11+
{% trans %}You can not view query.{% endtrans %}
12+
{% endblock -%}
13+
14+
{% block content %}
15+
<td class="content">
16+
You are not allowed to view {{ context._classname }}
17+
with id {{ context.id }}
18+
</td>
19+
{% endblock %}
20+
{% endif %}

0 commit comments

Comments
 (0)