aboutsummaryrefslogtreecommitdiff
path: root/cgi/templates/manage
diff options
context:
space:
mode:
authorLibravatar bai 2019-03-29 02:14:43 +0000
committerLibravatar bai 2019-03-29 02:14:43 +0000
commit95dfe14528663923ca2a88ec928f1d8d9df2402b (patch)
tree5bc88d1466957f1aa39043b056bde5c439648022 /cgi/templates/manage
downloadweabot-95dfe14528663923ca2a88ec928f1d8d9df2402b.tar.gz
weabot-95dfe14528663923ca2a88ec928f1d8d9df2402b.tar.xz
weabot-95dfe14528663923ca2a88ec928f1d8d9df2402b.zip
Init
Diffstat (limited to 'cgi/templates/manage')
-rw-r--r--cgi/templates/manage/addboard.html21
-rw-r--r--cgi/templates/manage/bans.html92
-rw-r--r--cgi/templates/manage/boardoptions.html195
-rw-r--r--cgi/templates/manage/changepassword.html24
-rw-r--r--cgi/templates/manage/delete.html23
-rw-r--r--cgi/templates/manage/filters.html119
-rw-r--r--cgi/templates/manage/ipdelete.html24
-rw-r--r--cgi/templates/manage/ipshow.html73
-rw-r--r--cgi/templates/manage/lockboard.html20
-rw-r--r--cgi/templates/manage/login.html21
-rw-r--r--cgi/templates/manage/logs.html17
-rw-r--r--cgi/templates/manage/manage.html22
-rw-r--r--cgi/templates/manage/menu.html30
-rw-r--r--cgi/templates/manage/message.html8
-rw-r--r--cgi/templates/manage/mod.html96
-rw-r--r--cgi/templates/manage/move.html60
-rw-r--r--cgi/templates/manage/quotes.html12
-rw-r--r--cgi/templates/manage/rebuild.html20
-rw-r--r--cgi/templates/manage/recent_images.html24
-rw-r--r--cgi/templates/manage/recyclebin.html72
-rw-r--r--cgi/templates/manage/reports.html58
-rw-r--r--cgi/templates/manage/search.html27
-rw-r--r--cgi/templates/manage/staff.html63
23 files changed, 1121 insertions, 0 deletions
diff --git a/cgi/templates/manage/addboard.html b/cgi/templates/manage/addboard.html
new file mode 100644
index 0000000..71b3c31
--- /dev/null
+++ b/cgi/templates/manage/addboard.html
@@ -0,0 +1,21 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Nuevo board</div>
+<form action="#{cgi_url}manage/addboard" method="post">
+ <table>
+ <tr>
+ <td class="postblock">Directorio</td>
+ <td><input type="text" name="dir" maxlength="16" style="width:100%;" /></td>
+ </tr>
+ <tr>
+ <td class="postblock">Nombre</td>
+ <td><input type="text" name="name" maxlength="64" style="width:100%;" /></td>
+ </tr>
+ <tr>
+ <td colspan="2"><input type="submit" name="submit" style="width:100%;" value="Agregar board" /></td>
+ </table>
+</form>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/bans.html b/cgi/templates/manage/bans.html
new file mode 100644
index 0000000..81e0f71
--- /dev/null
+++ b/cgi/templates/manage/bans.html
@@ -0,0 +1,92 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<?py from tenjin.helpers.html import * ?>
+<center>
+<div class="replymode">Bans</div>
+<?py if mode == 0: ?>
+<form action="#{cgi_url}manage/ban/" name="banform" method="post">
+<table>
+<tr>
+ <td class="postblock">Dirección IP</td>
+ <td><input type="text" name="ip" size="20" /></td>
+</tr>
+<tr><td colspan="2"><input type="submit" value="Ir a formulario de ban" style="width:100%;" /></td></tr>
+</table>
+</form>
+<hr />
+<table class="managertable">
+<tr>
+ <th>Dirección IP</th>
+ <th>Máscara de red</th>
+ <th>Boards</th>
+ <th>Agregado</th>
+ <th>Expira</th>
+ <th>Ciego</th>
+ <th>Puesto por</th>
+ <th>Razón</th>
+ <th>Nota</th>
+ <th>Acción</th>
+</tr>
+<?py for ban in bans: ?>
+<tr>
+ <td>${ban['ip']}</td>
+ <td>${ban['netmask']}</td>
+ <td>${ban['boards']}</td>
+ <td>${ban['added']}</td>
+ <td>${ban['until']}</td>
+ <td>${ban['blind']}</td>
+ <td>${ban['staff']}</td>
+ <td>${ban['reason']}</td>
+ <td>${ban['note']}</td>
+ <td>
+ [<a href="#{cgi_url}manage/ipshow?ip=#{ban['ip']}">Ver posts</a>]
+ [<a href="#{cgi_url}manage/ban?ip=#{ban['ip']}&amp;edit=#{ban['id']}">Editar</a>]
+ [<a href="#{cgi_url}manage/bans/delete/#{ban['id']}">Eliminar</a>]
+ </td>
+</tr>
+<?py #endfor ?>
+</table>
+<?py elif mode == 1: ?>
+<form action="#{cgi_url}manage/ban" name="banform" method="post">
+<table>
+ <tr><td class="postblock">IP</td><td><input type="text" name="ip" value="${ip}" size="20" style="width:100%;" /></td></tr>
+ <tr><td class="postblock">Máscara de red</td><td><input type="text" name="netmask" value="${startvalues['netmask']}" style="width:100%;" /></td></tr>
+ <tr>
+ <td class="postblock">Board(s)</td>
+ <td>
+ <input type="checkbox" name="board_all" id="b_all" value="1"#{checked(startvalues['where'] == '')} /><label for="b_all" style="font-weight:bold">Todos los boards</label><hr />
+ <?py for board in boards: ?>
+ <input type="checkbox" name="board_#{board['dir']}" id="b#{board['dir']}" value="1"#{checked(board['dir'] in startvalues['where'])} /><label for="b#{board['dir']}">${board['name']}</label><br />
+ <?py #endfor ?>
+ <?py if edit_id > 0: ?>
+ <input type="hidden" name="edit" value="${edit_id}" />
+ <?py #endif ?>
+ </td>
+ </tr>
+ <tr><td class="postblock">Mensaje</td><td><textarea name="reason" style="width:100%;">${startvalues['reason']}</textarea></td></tr>
+ <tr><td class="postblock">Nota para staff</td><td><input type="text" name="note" value="${startvalues['note']}" style="width:100%;" /></td></tr>
+ <tr><td class="postblock">Ciego</td><td><input type="checkbox" name="blind" id="blind" value="1"#{checked(startvalues['blind'] == '1')} /><label for="blind"></label></td></tr>
+ <tr><td class="postblock">Expira en <span style="font-weight:normal;">(segundos)</span></td><td><input type="text" id="seconds" name="seconds" value="#{startvalues['seconds']}" style="width:100%;" />
+ <br />
+ <div id="timelist">
+ <a href="#" data-secs="0">Nunca</a>
+ <a href="#" data-secs="3600">1h</a>
+ <a href="#" data-secs="21600">6h</a>
+ <a href="#" data-secs="43200">12h</a>
+ <a href="#" data-secs="86400">1d</a>
+ <a href="#" data-secs="259200">3d</a>
+ <a href="#" data-secs="604800">1w</a>
+ <a href="#" data-secs="2592000">30d</a>
+ <a href="#" data-secs="31536000">1y</a>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><input type="submit" value="Colocar ban" style="width:100%;" /></td>
+ </tr>
+</table>
+</form>
+<?py #endif ?>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/boardoptions.html b/cgi/templates/manage/boardoptions.html
new file mode 100644
index 0000000..436b036
--- /dev/null
+++ b/cgi/templates/manage/boardoptions.html
@@ -0,0 +1,195 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<?py from tenjin.helpers.html import * ?>
+<center>
+<div class="replymode">Opciones de Board</div>
+<?py if mode == 0: ?>
+<table class="managertable">
+ <tr><th colspan="2">Sección</th><th>Accion</th></tr>
+ <?py for board in boards: ?>
+ <tr><td>/#{board['dir']}/</td><td>#{board['name']}</td><td>[<a href="#{cgi_url}manage/board/#{board['dir']}">Configurar</a>]</td></tr>
+ <?py #endfor ?>
+ </table>
+<?py elif mode == 1: ?>
+<form action="#{cgi_url}manage/board/${boardopts['dir']}" method="post">
+<table>
+<tr>
+ <td class="postblock">ID</td>
+ <td><input type="text" name="name" value="${boardopts['id']}" maxlength="16" style="width:100%;" disabled="disabled" /></td>
+</tr>
+<tr>
+ <td class="postblock">Directorio</td>
+ <td><input type="text" name="name" value="${boardopts['dir']}" maxlength="32" style="width:100%;" disabled="disabled" /></td>
+</tr>
+<tr>
+ <td class="postblock">Nombre</td>
+ <td><input type="text" name="name" value="${boardopts['name']}" maxlength="64" style="width:100%;" /></td>
+</tr>
+<tr>
+<td class="postblock">Nombre largo</td>
+<td><input type="text" name="longname" size="50" value="${boardopts['longname']}" maxlength="128" style="width:100%;" /></td>
+</tr>
+<tr>
+<td class="postblock">Sub-nombre</td>
+<td><input type="text" name="subname" value="${boardopts['subname']}" maxlength="3" style="width:100%;" /></td>
+</tr>
+<tr>
+<td class="postblock">Tipo</td>
+<td>
+ <select style="width:100%;" name="type">
+ <option value="0">Imageboard</option>
+ <option value="1"#{selected(boardopts['board_type'] == '1')}>Textboard</option>
+ </select>
+</td>
+</tr>
+<tr>
+<td class="postblock">Descripción / Reglas</td>
+<td>
+ <textarea id="brd_desc" name="postarea_desc" rows="10" cols="50" style="width:100%;">${boardopts['postarea_desc']}</textarea>
+ <div id="prev_desc" style="border:1px dotted gray;display:none;padding:4px;width:100%;" contenteditable="true"></div>
+</td>
+</tr>
+<tr>
+<td class="postblock">Caja extra</td>
+<td><textarea name="postarea_extra" rows="5" cols="50" style="width:100%;">${boardopts['postarea_extra']}</textarea></td>
+</tr>
+<tr>
+<td class="postblock">Forzar CSS <span style="font-weight:normal;">("" = default)</span></td>
+<td><input type="text" name="force_css" size="50" value="#{boardopts['force_css']}" maxlength="255" style="width:100%;" /></td>
+</tr>
+<tr>
+<td class="postblock">Nombre por defecto</td>
+<td><input type="text" name="anonymous" size="50" maxlength="128" value="${boardopts['anonymous']}" style="width:100%;" /></td>
+</tr>
+<tr>
+<td class="postblock">Título por defecto</td>
+<td><input type="text" name="subject" size="50" maxlength="64" value="${boardopts['subject']}" style="width:100%;" /></td>
+</tr>
+<tr>
+<td class="postblock">Mensaje por defecto</td>
+<td><input type="text" name="message" size="50" maxlength="128" value="${boardopts['message']}" style="width:100%;" /></td>
+</tr>
+<tr>
+<td class="postblock">ID</td>
+<td>
+ <select name="useid" style="width:100%;">
+ <option value="0">Desactivado</option>
+ <option value="1"#{selected(boardopts['useid'] == '1')}>Activado</option>
+ <option value="2"#{selected(boardopts['useid'] == '2')}>Activado siempre</option>
+ <option value="3"#{selected(boardopts['useid'] == '3')}>Activado siempre, detallado</option>
+ </select>
+</td>
+</tr>
+<tr>
+<td class="postblock">Slip</td>
+<td>
+ <select name="slip" style="width:100%;">
+ <option value="0">Desactivado</option>
+ <option value="1"#{selected(boardopts['slip'] == '1')}>Activado</option>
+ <option value="2"#{selected(boardopts['slip'] == '2')}>Sólo dominio</option>
+ <option value="3"#{selected(boardopts['slip'] == '3')}>Todo</option>
+ </select>
+</td>
+</tr>
+<tr>
+<td class="postblock">Código de país</td>
+<td>
+ <select name="countrycode" style="width:100%;">
+ <option value="0">Desactivado</option>
+ <option value="1"#{selected(boardopts['countrycode'] == '1')}>Activado</option>
+ </select>
+</td>
+</tr>
+<tr>
+<td class="postblock">Desactivar nombre</td>
+<td><input type="checkbox" name="disable_name" id="noname" value="1"#{checked(boardopts['disable_name'] == '1')} /><label for="noname"></label></td>
+</tr>
+<tr>
+<td class="postblock">Desactivar asunto</td>
+<td><input type="checkbox" name="disable_subject" id="nosub" value="1"#{checked(boardopts['disable_subject'] == '1')} /><label for="nosub"></label></td>
+</tr>
+<tr>
+<td class="postblock">Papelera de reciclaje</td>
+<td><input type="checkbox" name="recyclebin" id="bin" value="1"#{checked(boardopts['recyclebin'] == '1')} /><label for="bin"></label></td>
+</tr>
+<tr>
+<td class="postblock">Cerrado</td>
+<td><input type="checkbox" name="locked" id="locked" value="1"#{checked(boardopts['locked'] == '1')} /><label for="locked"></label></td>
+</tr>
+<tr>
+<td class="postblock">Secreto</td>
+<td><input type="checkbox" name="secret" id="secret" value="1"#{checked(boardopts['secret'] == '1')} /><label for="secret"></label></td>
+</tr>
+<tr>
+<td class="postblock">Permitir spoilers</td>
+<td><input type="checkbox" name="allow_spoilers" id="spoil" value="1"#{checked(boardopts['allow_spoilers'] == '1')} /><label for="spoil"></label></td>
+</tr>
+<tr>
+<td class="postblock">Permitir oekaki</td>
+<td><input type="checkbox" name="allow_oekaki" id="oek" value="1"#{checked(boardopts['allow_oekaki'] == '1')} /><label for="oek"></label></td>
+</tr>
+<tr>
+<td class="postblock">Permitir crear hilos sin imagen</td>
+<td><input type="checkbox" name="allow_noimage" id="noimgallow" value="1"#{checked(boardopts['allow_noimage'] == '1')} /><label for="noimgallow"></label></td>
+</tr>
+<tr>
+<td class="postblock">Permitir subida</td>
+<td><input type="checkbox" name="allow_images" id="img" value="1"#{checked(boardopts['allow_images'] == '1')} /><label for="img">Al crear un hilo</label><br /><input type="checkbox" name="allow_image_replies" id="imgres" value="1"#{checked(boardopts['allow_image_replies'] == '1')} /><label for="imgres">Al responder</label></td>
+</tr>
+<tr>
+<td class="postblock">Tipos de archivo</td>
+<td>
+ <?py for filetype in filetypes: ?>
+ <input type="checkbox" name="filetype#{filetype['ext']}" id="#{filetype['ext']}" value="1"#{checked(filetype['ext'] in supported_filetypes)} /><label for="#{filetype['ext']}">${filetype['ext'].upper()}</label><br />
+ <?py #endfor ?>
+</td>
+</tr>
+<tr>
+<td class="postblock">Tamaño máximo <span style="font-weight:normal;">(KB)</span></td>
+<td><input type="text" name="maxsize" value="#{boardopts['maxsize']}" maxlength="5" size="11" /></td>
+</tr>
+<tr>
+<td class="postblock">Dimensión de miniatura <span style="font-weight:normal;">(px)</span></td>
+<td><input type="text" name="thumb_px" value="#{boardopts['thumb_px']}" maxlength="3" size="11" /></td>
+</tr>
+<tr>
+<td class="postblock">Hilos en página frontal</td>
+<td><input type="text" name="numthreads" value="#{boardopts['numthreads']}" maxlength="2" size="11" /></td>
+</tr>
+<tr>
+<td class="postblock">Respuestas a mostrar</td>
+<td><input type="text" name="numcont" value="#{boardopts['numcont']}" maxlength="2" size="11" /></td>
+</tr>
+<tr>
+<td class="postblock">Máximo de líneas <span style="font-weight:normal;">(frontal)</span></td>
+<td><input type="text" name="numline" value="#{boardopts['numline']}" maxlength="3" size="11" /></td>
+</tr>
+<tr>
+<td class="postblock">Edad máxima de un hilo</td>
+<td><input type="text" name="maxage" value="#{boardopts['maxage']}" maxlength="3" size="11" /> (días; 0 = desactivar)</td>
+</tr>
+<tr>
+<td class="postblock">Inactividad máxima de un hilo</td>
+<td><input type="text" name="maxinactive" value="#{boardopts['maxinactive']}" maxlength="3" size="11" /> (días; 0 = desactivar)</td>
+</tr>
+<tr>
+<td class="postblock">Archivar hilos</td>
+<td><input type="checkbox" name="archive" id="arch" value="1"#{checked(boardopts['archive'] == '1')} /><label for="arch"></label></td>
+</tr>
+<tr>
+<td class="postblock">Espera para crear nuevo hilo</td>
+<td><input type="text" name="threadsecs" value="#{boardopts['threadsecs']}" maxlength="4" size="11" /> (segundos)</td>
+</tr>
+<tr>
+<td class="postblock">Espera entre respuestas</td>
+<td><input type="text" name="postsecs" value="#{boardopts['postsecs']}" maxlength="3" size="11" /> (segundos)</td>
+</tr>
+</table>
+<br />
+<hr />
+<input type="submit" value="Guardar cambios" />
+</form>
+<?py #endif ?>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/changepassword.html b/cgi/templates/manage/changepassword.html
new file mode 100644
index 0000000..977c772
--- /dev/null
+++ b/cgi/templates/manage/changepassword.html
@@ -0,0 +1,24 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Cambiar contraseña</div>
+<form action="#{cgi_url}manage/changepassword" method="post">
+<table>
+ <tr>
+ <td class="postblock">Clave actual</td>
+ <td><input type="password" name="oldpassword" style="width:100%;" /></td>
+ </tr>
+ <tr>
+ <td class="postblock">Nueva clave</td>
+ <td><input type="password" name="newpassword" style="width:100%;" /></td>
+ </tr>
+ <tr>
+ <td class="postblock">Confirmar nueva clave</td>
+ <td><input type="password" name="newpassword2" style="width:100%;" /></td>
+ </tr>
+ <tr><td colspan="2"><input type="submit" style="width:100%;" value="Cambiar" /></td></tr>
+</table>
+</form>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/delete.html b/cgi/templates/manage/delete.html
new file mode 100644
index 0000000..78c1c5e
--- /dev/null
+++ b/cgi/templates/manage/delete.html
@@ -0,0 +1,23 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Eliminar Post</div>
+<form action="#{cgi_url}manage/delete_confirmed/#{curboard}/#{postid}" method="get">
+<?py if do_ban: ?>
+ <input type="hidden" name="ban" value="true" />
+<?py #endif ?>
+<p>
+ <b>Post #${postid} de /${curboard}/</b><br />
+ <input id="a" type="checkbox" name="imageonly" value="true" /><label for="a">Eliminar sólo archivo</label><br />
+ <input id="b" type="checkbox" name="perma" value="true" /><label for="b" style="font-weight:bold">Eliminar permanentemente</label><br />
+ <br />
+ <i>Nota: Por favor evitar eliminar <b>permanentemente</b> el post al menos que sea estrictamente necesario.
+ <br />Al eliminar permanentemente un post no queda en papelera y se rompen
+ las referencias que se pueden haber hecho hacia él, especialmente en los BBS.</i>
+ <br /><br />
+ <input type="submit" value="Eliminar" />
+</p>
+</form>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/filters.html b/cgi/templates/manage/filters.html
new file mode 100644
index 0000000..188a741
--- /dev/null
+++ b/cgi/templates/manage/filters.html
@@ -0,0 +1,119 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<?py from tenjin.helpers.html import * ?>
+<center>
+<div class="replymode">Filtros</div>
+<?py if mode == 0: ?>
+<table class="managertable">
+ <tr>
+ <th>ID</th>
+ <th>Boards</th>
+ <th>Tipo</th>
+ <th>Acción</th>
+ <th>Mensaje</th>
+ <th>Modificado</th>
+ <th>Por</th>
+ <th>Acción</th>
+ </tr>
+ <?py for filter in filters: ?>
+ <tr>
+ <td style="text-align:center">#{filter['id']}</td>
+ <td style="text-align:center">${filter['boards']}</td>
+ <td>#{filter['type_formatted']}</td>
+ <td>#{filter['action_formatted']}</td>
+ <td>${filter['reason']}</td>
+ <td style="text-align:center">${filter['added']}</td>
+ <td style="text-align:center">${filter['staff']}</td>
+ <td style="text-align:center">[<a href="#{cgi_url}manage/filters/add?edit=#{filter['id']}">Editar</a>]<br />
+ [<a href="#{cgi_url}manage/filters/delete/#{filter['id']}">Eliminar</a>]</td>
+ </tr>
+ <?py #endfor ?>
+ <tr><td colspan="9" style="text-align:center">
+ <form action="#{cgi_url}manage/filters/add" method="get">
+ <input type="submit" value="Agregar filtro" />
+ </form></td>
+ </tr>
+</table>
+<?py elif mode == 1: ?>
+<form name="banform" method="post">
+<table>
+ <tr><th colspan="3" class="postblock">Tipo de filtro</th></tr>
+ <tr>
+ <td class="postblock"><input type="radio" name="type" id="type1" value="0"#{checked(startvalues['type'] == '0')} /><label for="type1">Palabra</label></td>
+ <td style="text-align:right">Regex:</td>
+ <td><input type="text" name="word" value="${startvalues['word']}" /></td>
+ </tr>
+ <tr>
+ <td rowspan="2" class="postblock"><input type="radio" name="type" id="type2" value="1"#{checked(startvalues['type'] == '1')} /><label for="type2">Nombre/Tripcode</label></td>
+ <td style="text-align:right">Nombre:</td>
+ <td><input type="text" name="name" value="${startvalues['name']}" /> (regex)</td>
+ </tr>
+ <tr>
+ <td style="text-align:right">Tripcode:</td>
+ <td><input type="text" name="trip" value="${startvalues['trip']}" /> (incluir separador)</td>
+ </tr>
+</table>
+<br />
+<div style="text-align:left;display:inline-block;">
+ <div class="postblock" style="display:block;text-align:center;margin-bottom:0.5em;">Aplicar a</div>
+ <div style="padding:0 10px">
+ <input type="checkbox" name="board_all" id="board_all" value="1"#{checked(startvalues['where'] == '')} /><label for="board_all" style="font-weight:bold">Todos los boards</label>
+ <hr />
+ <?py for board in boards: ?>
+ <input type="checkbox" name="board_#{board['dir']}" id="board_#{board['dir']}" value="1"#{checked(board['dir'] in startvalues['where'])} /><label for="board_#{board['dir']}">${board['name']} <span style="opacity:0.5">(/#{board['dir']}/)</span></label><br />
+ <?py #endfor ?>
+ </div>
+</div>
+<br /><br />
+<table>
+ <tr>
+ <th colspan="3" class="postblock">Acción</th>
+ </tr>
+ <tr>
+ <td class="postblock"><input type="radio" name="action" id="act0" value="0"#{checked(startvalues['action'] == '0')} /><label for="act0">Abortar post</label></td>
+ <td colspan="2"></td>
+ </tr>
+ <tr>
+ <td class="postblock"><input type="radio" name="action" id="act1" value="1"#{checked(startvalues['action'] == '1')} /><label for="act1">Reemplazar</label></td>
+ <td colspan="2"><input type="text" name="changeto" value="#{startvalues['changeto']}" size="40" /></td>
+ </tr>
+ <tr>
+ <td rowspan="2" class="postblock"><input type="radio" name="action" id="act2" value="2"#{checked(startvalues['action'] == '2')} /><label for="act2">Autoban</label></td>
+ <td style="text-align:right">Expira en:</td>
+ <td><input type="text" name="seconds" id="seconds" size="6" value="#{startvalues['seconds']}" /> (segundos)<div style="float:right"><input type="checkbox" name="blind" id="blind" value="1"#{checked(startvalues['blind'] == '1')} /><label for="blind">Ban ciego</label></div></td>
+ </tr>
+ <tr>
+ <td style="text-align:right">Preset:</td>
+ <td id="timelist">
+ <a href="#" data-secs="0">Nunca</a>
+ <a href="#" data-secs="3600">1h</a>
+ <a href="#" data-secs="21600">6h</a>
+ <a href="#" data-secs="43200">12h</a>
+ <a href="#" data-secs="86400">1d</a>
+ <a href="#" data-secs="259200">3d</a>
+ <a href="#" data-secs="604800">1w</a>
+ <a href="#" data-secs="2592000">30d</a>
+ <a href="#" data-secs="31536000">1y</a>
+ </td>
+ </tr>
+ <tr>
+ <td rowspan="2" class="postblock"><input type="radio" name="action" id="act3" value="3"#{checked(startvalues['action'] == '3')} /><label for="act3">Redireccionar</label></td>
+ <td colspan="2"><input type="text" name="redirect_url" value="#{startvalues['redirect_url']}" size="40" /></td>
+ </tr>
+ <tr>
+ <td style="text-align:right">Tardar:</td>
+ <td><input type="text" name="redirect_time" size="6" value="#{startvalues['redirect_time']}" /> (segundos)</td>
+ </tr>
+</table>
+<br />
+<table>
+ <tr><th class="postblock" style="padding:2px">Mensaje a mostrar</th></tr>
+ <tr><td><input type="text" size="50" name="reason" value="#{startvalues['reason']}" /></td></tr>
+</table>
+<br />
+<input type="submit" name="add" value="#{submit}" />
+</form>
+<?py #endif ?>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/ipdelete.html b/cgi/templates/manage/ipdelete.html
new file mode 100644
index 0000000..71c043a
--- /dev/null
+++ b/cgi/templates/manage/ipdelete.html
@@ -0,0 +1,24 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+ <div class="replymode">Eliminar por IP</div>
+ <form action="#{cgi_url}manage/ipdelete" name="ipdeleteform" method="post">
+ <table>
+ <tr>
+ <td class="postblock">Board(s)</td>
+ <td>
+ <input type="checkbox" name="board_all" id="all" value="1" /><label for="all" style="font-weight:bold">Todos los boards</label><hr />
+ <?py for board in boards: ?>
+ <input type="checkbox" name="board_#{board['dir']}" id="#{board['dir']}" value="1" /><label for="#{board['dir']}">#{board['name']} <span style="opacity:0.5">(/#{board['dir']}/)</span></label><br />
+ <?py #endfor ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="postblock">Dirección IP</td>
+ <td><input type="text" name="ip" style="width:100%;" /></td>
+ </tr>
+ <tr><td colspan="2"><input type="submit" style="width:100%;" value="Eliminar posts" /></td></tr>
+ </table>
+ </form>
+</center><hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/ipshow.html b/cgi/templates/manage/ipshow.html
new file mode 100644
index 0000000..6937a0e
--- /dev/null
+++ b/cgi/templates/manage/ipshow.html
@@ -0,0 +1,73 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+ <div class="replymode">Mostrar por IP</div>
+ <?py if mode == 0: ?>
+ <form action="#{cgi_url}manage/ipshow" method="post">
+ <table>
+ <tr><td class="postblock">Dirección IP</td><td><input type="text" name="ip" /></td></tr>
+ <tr><td colspan="2"><input type="submit" style="width:100%;" value="Mostrar posts" /></td></tr>
+ </table>
+ </form>
+ <?py else: ?>
+ <style>td img{max-width:150px;height:auto;}td.z{padding:0}</style>
+ <div class="logo" style="margin:0;">Actividad IP #{ip} (#{len(posts)})</div>
+ <center>
+ Hostname: #{host if host else "Desconocido"} [#{country if country else "??"}]#{" (Nodo Tor)" if tor else ""}<br />
+ <br />
+ <form action="#{cgi_url}manage/ban/" name="banform" method="post"><input type="hidden" name="ip" value="${ip}" /><input type="submit" value="Ir a formulario de ban" /></form>
+ <hr />
+ <?py if posts: ?>
+ <table class="managertable">
+ <tr>
+ <th>Sección</th>
+ <th>Padre</th>
+ <th>ID</th>
+ <th>Fecha</th>
+ <th>Nombre</th>
+ <th>Asunto</th>
+ <th>Mensaje</th>
+ <th>Archivo</th>
+ <th>Acción</th>
+ </tr>
+ <?py for post in posts: ?>
+ <tr>
+ <td>#{post['dir']}</td>
+ <td>#{post['parentid']}</td>
+ <td>#{post['id']}</td>
+ <td class="date" data-unix="${post['timestamp']}">#{post['timestamp_formatted']}</td>
+ <?py if post['tripcode']: ?>
+ <td class="name"><b>#{post['name']}</b> #{post['tripcode']}</td>
+ <?py else: ?>
+ <td class="name"><b>#{post['name']}</b></td>
+ <?py #endif ?>
+ <td>#{post['subject']}</td>
+ <td>#{post['message']}</td>
+ <?py if post['file']: ?>
+ <td class="z"><img src="#{images_url}#{post['dir']}/thumb/#{post['thumb']}" width="#{post['thumb_width']}" height="#{post['thumb_height']}" /></td>
+ <?py else: ?>
+ <td></td>
+ <?py #endif ?>
+ <td>
+ <?py if post['IS_DELETED'] == '0': ?>
+ <a href="#{cgi_url}manage/delete/#{post['dir']}/#{post['id']}">Eliminar</a>
+ <?py elif post['IS_DELETED'] == '1': ?>
+ <a href="#{cgi_url}manage/recyclebin/0/restore/#{post['dir']}/#{post['id']}">Rec</a>
+ <abbr title="Eliminado por usuario">[1]</abbr>
+ <?py else: ?>
+ <a href="#{cgi_url}manage/recyclebin/0/restore/#{post['dir']}/#{post['id']}">Rec</a>
+ <abbr title="Eliminado por staff">[2]</abbr>
+ <?py #endif ?>
+ </td>
+ </tr>
+ <?py #endfor ?>
+ </table>
+ <hr />
+ <?py else: ?>
+ <b>Error:</b> No hay posts<br /><br />
+ <?py #endif ?>
+ [<a href="#{cgi_url}manage/ipshow">Volver al panel</a>]
+ <?py #endif ?>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/lockboard.html b/cgi/templates/manage/lockboard.html
new file mode 100644
index 0000000..cebf061
--- /dev/null
+++ b/cgi/templates/manage/lockboard.html
@@ -0,0 +1,20 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Cerrar o abrir board</div>
+<table class="managertable">
+ <tr><th colspan="2">Sección</th><th>Acción</th></tr>
+ <?py for board in boards: ?>
+ <tr>
+ <td>/#{board['dir']}/</td><td>#{board['name']}</td>
+ <?py if board['locked'] == '0': ?>
+ <td style="text-align:center;">[<a href="#{cgi_url}manage/boardlock/#{board['dir']}">Cerrar</a>]</td>
+ <?py elif board['locked'] == '1': ?>
+ <td style="text-align:center;">[<a href="#{cgi_url}manage/boardlock/#{board['dir']}">Abrir</a>]</td>
+ <?py #endif ?>
+ </tr>
+ <?py #endfor ?>
+</table>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/login.html b/cgi/templates/manage/login.html
new file mode 100644
index 0000000..7ce47a1
--- /dev/null
+++ b/cgi/templates/manage/login.html
@@ -0,0 +1,21 @@
+<?py include('templates/base_top.html') ?>
+<center>
+ #{page}
+ <form action="#{cgi_url}manage" method="post">
+ <table>
+ <tr>
+ <td class="postblock">Usuario</td>
+ <td><input type="text" name="username" /></td>
+ </tr>
+ <tr>
+ <td class="postblock">Contraseña</td>
+ <td><input type="password" name="password" /></td>
+ </tr>
+ <tr>
+ <td colspan="2"><input id="submit" type="submit" name="submit" style="width:100%;" value="Entrar" /></td>
+ </tr>
+ </table>
+ </form>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/logs.html b/cgi/templates/manage/logs.html
new file mode 100644
index 0000000..e11780a
--- /dev/null
+++ b/cgi/templates/manage/logs.html
@@ -0,0 +1,17 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Registro</div>
+<table class="managertable">
+ <tr><th>Fecha</th><th>Staff</th><th>Acción</th></tr>
+<?py for log in logs: ?>
+ <tr>
+ <td class="date" data-unix="${log['timestamp']}" style="white-space:nowrap;">${log['timestamp_formatted']}</td>
+ <td>${log['staff']}</td>
+ <td>${log['action']}</td>
+ </tr>
+<?py #endfor ?>
+</table>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/manage.html b/cgi/templates/manage/manage.html
new file mode 100644
index 0000000..06b1737
--- /dev/null
+++ b/cgi/templates/manage/manage.html
@@ -0,0 +1,22 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+ <div style="margin:0.5em 0;"><strong>BANDEJA DE ENTRADA</strong>
+ <br />
+ Denuncias:
+ <?py if int(reports) > 0: ?>
+ <a href="#{cgi_url}manage/reports" style="color:red;font-weight:bold;">#{reports}</a>
+ <?py else: ?>
+ 0
+ <?py #endif ?></div>
+ <hr />
+ <strong>NOTICIAS DEL STAFF</strong>
+</center>
+<dl style="margin:0 2.5%">
+<?py for post in posts: ?>
+ <dt><strong>#{post['title'] if post['title'] else "Sin asunto"}</strong><br />#{post['id']} : <b class="name">${post['name']}</b> : <span class="date" data-unix="${post['timestamp']}"}>${post['timestamp_formatted']}</span></dt>
+ <dd style="margin-bottom:1em;">#{post['message']}</dd>
+<?py #endfor ?>
+</dl>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/menu.html b/cgi/templates/manage/menu.html
new file mode 100644
index 0000000..d6ffd5e
--- /dev/null
+++ b/cgi/templates/manage/menu.html
@@ -0,0 +1,30 @@
+<style>#adminmenu {text-align:center;}#adminmenu table {display:inline-block;font-size:10pt;margin-top:2px;text-align:left;}
+#adminmenu a {font-weight:bold;}label {vertical-align:top;}dd p {margin:0;}</style>
+<script type="text/javascript" src="/static/js/manage.js"></script>
+<input type="hidden" name="board" value="" />
+<?py if int(rights) < 4: ?>
+<div id="adminmenu">¡Bienvenido, <b><acronym title="Cuenta creada el #{added}">#{username}</acronym></b>! ¡Eres
+<?py if rights == '0': ?><b>Accionista</b>
+<?py elif rights == '1': ?><b>Accionista</b>
+<?py elif rights == '2': ?><span class="developer">Developer</span>
+<?py elif rights == '3': ?><span class="moderator">Moderador</span>
+<?py #endif ?> de #{site_title}!<br />
+<center>
+<table class="reply">
+<tr><td>Principal:</td>
+<td>- <a href="#{cgi_url}manage">Inicio</a> - <a href="#{cgi_url}manage/changepassword">Cambiar contrase&ntilde;a</a> - <a href="#{cgi_url}manage/newschannel">News Channel</a> - <a href="//webmail.bienvenidoainternet.org">Correo</a> - <a href="#{cgi_url}manage/logout">Cerrar sesi&oacute;n</a> -</td></tr>
+<tr><td>Posts:</td>
+<td>- <a href="#{cgi_url}manage/mod">Modbrowse</a> - <a href="#{cgi_url}manage/ipshow">Ver por IP</a> - <a href="#{cgi_url}manage/recyclebin">Papelera de reciclaje</a> - <a href="#{cgi_url}manage/recent_images">Im&aacute;genes recientes</a> -</td></tr>
+<tr><td>Moderaci&oacute;n:</td>
+<td>- <a href="#{cgi_url}manage/reports">Denuncias</a> - <a href="#{cgi_url}manage/ipdelete">Eliminar por IP</a> - <a href="#{cgi_url}manage/bans">Lista de bans</a> - <a href="#{cgi_url}manage/move">Mover hilo</a> - <a href="#{cgi_url}manage/filters">Filtros</a> - <a href="#{cgi_url}manage/quotes">Frases</a> -</td></tr>
+<?py if int(rights) < 3: ?>
+<tr><td>Administraci&oacute;n:</td>
+<td>- <a href="#{cgi_url}manage/rebuild">Reconstruir</a> - <a href="#{cgi_url}manage/news?type=1">Noticias</a> - <a href="#{cgi_url}manage/news?type=2">Twitter</a> - <a href="#{cgi_url}manage/board">Opciones de board</a> - <a href="#{cgi_url}manage/addboard">Agregar board</a> - <a href="#{cgi_url}manage/lockboard">Cerrar board</a> -</td></tr>
+<?py if int(rights) in [0,2]: ?>
+<tr><td>Staff:</td>
+<td>- <a href="#{cgi_url}manage/staff">Miembros</a> - <a href="#{cgi_url}manage/logs">Registro de acciones</a> -</td></tr>
+<?py #endif ?>
+<?py #endif ?>
+</table></center></div>
+<hr />
+<?py #endif ?> \ No newline at end of file
diff --git a/cgi/templates/manage/message.html b/cgi/templates/manage/message.html
new file mode 100644
index 0000000..6c53ecc
--- /dev/null
+++ b/cgi/templates/manage/message.html
@@ -0,0 +1,8 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+ <div class="replymode">#{title if title else "Mensaje"}</div>
+ <p>#{message}</p>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/mod.html b/cgi/templates/manage/mod.html
new file mode 100644
index 0000000..ddc688f
--- /dev/null
+++ b/cgi/templates/manage/mod.html
@@ -0,0 +1,96 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Modbrowse</div>
+<?py if mode == 1: ?>
+<table class="managertable">
+ <tr><th colspan="2">Sección</th><th>Acción</th></tr>
+ <?py for board in boards: ?>
+ <tr><td>/#{board['dir']}/</td><td>#{board['name']}</td><td>[<a href="#{cgi_url}manage/mod/#{board['dir']}">Navegar</a>]</td></tr>
+ <?py #endfor ?>
+</table>
+<?py elif mode == 2: ?>
+<table class="managertable">
+<tr>
+ <th>#</th>
+ <th>ID</th>
+ <th style="width:20%;">Asunto</th>
+ <th>Fecha</th>
+ <th style="width:80%;">Mensaje</th>
+ <th>Resp.</th>
+ <th>Acciones</th>
+</tr>
+<?py i = 1 ?>
+<?py for thread in threads: ?>
+<tr>
+ <td>#{i}</td>
+ <td>#{thread['id']}</td>
+ <td><a href="?thread=#{thread['id']}"><b>#{thread['subject']}</b></a></td>
+ <td class="date" data-unix="${thread['timestamp']}">#{thread['timestamp_formatted'][:21]}</td>
+ <td>${thread['message'][:200]}</td>
+ <td>#{thread['length']}</td>
+ <td style="white-space:nowrap;">
+ <a href="#{cgi_url}manage/lock/#{dir}/#{thread['id']}">L#{"-" if thread['locked'] == "1" else "+"}</a>
+ <a href="#{cgi_url}manage/permasage/#{dir}/#{thread['id']}">PS#{"-" if thread['locked'] == "2" else "+"}</a>
+ <a href="#{cgi_url}manage/move/#{dir}/#{thread['id']}">M</a>
+ <a href="#{cgi_url}manage/delete/#{dir}/#{thread['id']}">D</a>
+ <a href="#{cgi_url}manage/delete/#{dir}/#{thread['id']}?ban=true">&</a>
+ <a href="#{cgi_url}manage/ban/#{dir}/#{thread['id']}">B</a>
+ </td>
+</tr>
+<?py i += 1 ?>
+<?py #endfor ?>
+</table>
+<hr />
+[<a href="#{cgi_url}manage/mod" class="return">Volver</a>]
+<?py elif mode == 3: ?>
+<table class="managertable">
+<tr><th colspan="8" style="font-size:16pt;">Hilo: ${posts[0]['subject']} (#{posts[0]['length']})</th></tr>
+<tr><td colspan="8" style="font-size:14pt;text-align:center;"><a href="#{cgi_url}manage/lock/#{dir}/#{posts[0]['id']}">#{"Abrir hilo" if posts[0]['locked'] == "1" else "Cerrar hilo"}</a> /
+<a href="#{cgi_url}manage/permasage/#{dir}/#{posts[0]['id']}">#{"Quitar permasage" if posts[0]['locked'] == "2" else "Permasage"}</a> /
+<a href="#{cgi_url}manage/move/#{dir}/#{posts[0]['id']}">Mover hilo</a></td></tr>
+<tr>
+ <th>#</th>
+ <th>ID</th>
+ <th>Fecha</th>
+ <th>Nombre</th>
+ <th>Mensaje</th>
+ <th>Archivo</th>
+ <th>IP</th>
+ <th>Acción</th>
+</tr>
+<?py i = 1 ?>
+<?py for p in posts: ?>
+<tr>
+ <td>#{i}</td>
+ <td>#{p['id']}</td>
+ <td class="date" data-unix="${p['timestamp']}">${p['timestamp_formatted']}</td>
+ <td><span class="postername">${p['name']}</span></td>
+ <td>${p['message']}</td>
+ <td>
+ <?py if p['file']: ?><a href="/${dir}/src/#{p['file']}" target="_blank"><img src="/${dir}/mobile/${p['thumb']}" /></a><?py #endif ?>
+ </td>
+ <td><a href="#{cgi_url}manage/ipshow?ip=#{p['ip']}">#{p['ip']}</a></td>
+ <td style="white-space:nowrap;">
+ <?py if p['IS_DELETED'] == '0': ?>
+ <a href="#{cgi_url}manage/delete/#{dir}/#{p['id']}">Eliminar</a>
+ <a href="#{cgi_url}manage/delete/#{dir}/#{p['id']}?ban=true">&</a>
+ <a href="/cgi/manage/ban?ip=#{p['ip']}">Ban</a>
+ <?py elif p['IS_DELETED'] == '1': ?>
+ <a href="#{cgi_url}manage/recyclebin/0/restore/#{dir}/#{p['id']}">Recuperar</a>
+ <abbr title="Eliminado por usuario">[1]</abbr>
+ <?py elif p['IS_DELETED'] == '2': ?>
+ <a href="#{cgi_url}manage/recyclebin/0/restore/#{dir}/#{p['id']}">Recuperar</a>
+ <abbr title="Eliminado por staff">[2]</abbr>
+ <?py #endif ?>
+ </td>
+</tr>
+<?py i += 1 ?>
+<?py #endfor ?>
+</table>
+<hr />
+[<a href="#{cgi_url}manage/mod/#{dir}">Volver al panel</a>]
+<?py #endif ?>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/move.html b/cgi/templates/manage/move.html
new file mode 100644
index 0000000..8fcc1e9
--- /dev/null
+++ b/cgi/templates/manage/move.html
@@ -0,0 +1,60 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Mover hilo</div>
+<?py if oldboardid and oldthread: ?>
+<form action="#{cgi_url}manage/move/#{oldboardid}/#{oldthread}" method="post">
+<?py else: ?>
+<form action="#{cgi_url}manage/move" method="post">
+<?py #endif ?>
+<table>
+ <tr>
+ <td class="postblock">Board actual</td>
+ <td>
+ <?py if oldboardid and oldthread: ?>
+ <select name="oldboardid" style="width:100%;">
+ <?py for board in boards: ?>
+ <option value="#{board['dir']}"#{' selected="selected"' if oldboardid == board['dir'] else ''}>#{board['dir']} - #{board['name']}</option>
+ <?py #endfor ?>
+ </select>
+ <?py else: ?>
+ <select name="oldboardid" style="width:100%;">
+ <?py for board in boards: ?>
+ <option value="#{board['dir']}">#{board['dir']} - #{board['name']}</option>
+ <?py #endfor ?>
+ </select>
+ <?py #endif ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="postblock">ID de hilo</td>
+ <td>
+ <?py if oldboardid and oldthread: ?>
+ <input type="text" name="oldthread" style="width:100%;" value="#{oldthread}" />
+ <?py else: ?>
+ <input type="text" name="oldthread" style="width:100%;" />
+ <?py #endif ?>
+ </td>
+ </tr>
+ <tr>
+ <td class="postblock">Mover a</td>
+ <td>
+ <select name="newboardid" style="width:100%;">
+ <?py for board in boards: ?>
+ <option value="#{board['dir']}">#{board['dir']} - #{board['name']}</option>
+ <?py #endfor ?>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td class="postblock">Insertar mensaje</td>
+ <td>
+ <input type="checkbox" name="msg" value="1" />
+ </td>
+ </tr>
+ <tr><td colspan="2"><input type="submit" name="submit" style="width:100%;" value="Mover" /></td></tr>
+</table>
+</form>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/quotes.html b/cgi/templates/manage/quotes.html
new file mode 100644
index 0000000..d30a403
--- /dev/null
+++ b/cgi/templates/manage/quotes.html
@@ -0,0 +1,12 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+ <div class="replymode">Quotes</div>
+ <p>Ingresa un mensaje a mostrar por cada linea:</p>
+ <form method="post" action="">
+ <textarea name="data" cols="80" rows="15" style="width:500px;height:250px;">${data}</textarea><br />
+ <input type="submit" name="save" style="width:500px;" value="Guardar" />
+ </form>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/rebuild.html b/cgi/templates/manage/rebuild.html
new file mode 100644
index 0000000..3afc057
--- /dev/null
+++ b/cgi/templates/manage/rebuild.html
@@ -0,0 +1,20 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Reconstruir board</div>
+<table class="managertable">
+ <tr><th colspan="2">Sección</th><th colspan="2">Acción</th></tr>
+ <tr><td colspan="2"><b>Home</b></td><td colspan="2" style="text-align:center;">[<a href="#{cgi_url}manage/rebuild/!HOME">Reconstruir</a>]</td></tr>
+ <tr><td colspan="2"><b>Noticias</b></td><td colspan="2" style="text-align:center;">[<a href="#{cgi_url}manage/rebuild/!NEWS">Reconstruir</a>]</td></tr>
+ <tr><td colspan="2"><b>Índices de archivos</b></td><td colspan="2" style="text-align:center;">[<a href="#{cgi_url}manage/rebuild/!KAKO">Reconstruir</a>]</td></tr>
+ <tr><td colspan="2"><b>.htaccess</b></td><td colspan="2" style="text-align:center;">[<a href="#{cgi_url}manage/rebuild/!HTACCESS">Reconstruir</a>]</td></tr>
+ <?py for board in boards: ?>
+ <tr><td>/#{board['dir']}/</td><td>#{board['name']}</td><td>[<a href="#{cgi_url}manage/rebuild/#{board['dir']}">Reconstruir frontales</a>]</td><td>[<a href="#{cgi_url}manage/rebuild/#{board['dir']}?everything=1">Reconstruir todo</a>]</td></tr>
+ <?py #endfor ?>
+ <tr><td colspan="4" align="center"><form action="#{cgi_url}manage/rebuild/!ALL" method="get"><input type="submit" style="width:100%" value="Reconstruir todos (frontales)" /></form></td></tr>
+ <tr><td colspan="4" align="center"><form action="#{cgi_url}manage/rebuild/!BBS" method="get"><input type="submit" style="width:100%" value="Reconstruir todos (BBS)" /></form></td></tr>
+ <tr><td colspan="4" align="center"><form action="#{cgi_url}manage/rebuild/!IB" method="get"><input type="submit" style="width:100%" value="Reconstruir todos (IB)" /></form></td></tr>
+</table>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/recent_images.html b/cgi/templates/manage/recent_images.html
new file mode 100644
index 0000000..39f919c
--- /dev/null
+++ b/cgi/templates/manage/recent_images.html
@@ -0,0 +1,24 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<style>.imgs{font-size:0;}.imgs img{vertical-align:top;margin:2px;height:150px;width:auto;}</style>
+<center>
+<div class="replymode">Imágenes recientes</div>
+<form action="#{cgi_url}manage/recent_images" name="recent_images" method="post">
+ <table>
+ <tr><td class="postblock">Número a mostrar</td><td><input type="text" name="images" size="4" /></td></tr>
+ <tr><td colspan="2"><input type="submit" style="width:100%;" value="Enviar" /></td></tr>
+ </table>
+</form>
+<hr />
+<div class="imgs">
+<?py for post in posts: ?>
+ <?py if post['parentid'] != '0': ?>
+ <a href="/#{post['dir']}/res/#{post['parentid']}.html##{post['id']}"><img src="#{boards_url}#{post['dir']}/thumb/#{post['thumb']}" /></a>
+ <?py else: ?>
+ <a href="/#{post['dir']}/res/#{post['id']}.html##{post['id']}"><img src="#{boards_url}#{post['dir']}/thumb/#{post['thumb']}" /></a>
+ <?py #endif ?>
+<?py #endfor ?>
+</div>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/recyclebin.html b/cgi/templates/manage/recyclebin.html
new file mode 100644
index 0000000..b413c9c
--- /dev/null
+++ b/cgi/templates/manage/recyclebin.html
@@ -0,0 +1,72 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<?py from tenjin.helpers.html import * ?>
+<center>
+<div class="replymode">Papelera de Reciclaje</div>
+<form name="boardForm" method="get" action="#{cgi_url}manage/recyclebin/0">
+<table>
+<tr>
+ <td class="postblock">Eliminado por</td>
+ <td>
+ <input type="radio" id="type1" name="type" value="1"#{checked(type == 1)} /><label for="type1">Usuario</label>
+ <input type="radio" id="type2" name="type" value="2"#{checked(type == 2)} /><label for="type2">Staff</label>
+ <input type="radio" id="type0" name="type" value="0"#{checked(type == 0)} /><label for="type0">Ambos</label>
+ </td>
+</tr>
+<tr>
+ <td class="postblock">Board</td><td>
+ <select name="board" style="width:100%;">
+ <option value="all">Todos los boards</option>
+<?py for board in boards: ?>
+ <option value="#{board['dir']}"#{selected(board['checked'])}>#{board['dir']} - ${board['name']}</option>
+<?py #endfor ?>
+ </select>
+ </td>
+</tr>
+<tr><td colspan="2"><input type="submit" style="width:100%;" value="Mostrar" /></td></tr>
+</table>
+</form>
+<hr />
+<?py if message: ?>
+${message}
+<hr />
+<?py #endif ?>
+<?py if not skip: ?>
+<form name="deleteForm" method="post" action="#{cgi_url}manage/recyclebin/#{currentpage}">
+ <?py if curboard: ?>
+ <input type="hidden" name="board" value="#{curboard}" />
+ <?py #endif ?>
+ <table class="managertable">
+ <tr>
+ <th></th>
+ <th></th>
+ <th>ID</th>
+ <th>Timestamp</th>
+ <th>Board</th>
+ <th>Tipo</th>
+ <th>IP</th>
+ <th>Mensaje</th>
+ </tr>
+ <?py for post in posts: ?>
+ <tr>
+ <td><a href="#{cgi_url}manage/recyclebin/#{currentpage}/delete/#{post['dir']}/#{post['id']}">X</a><br /><a href="#{cgi_url}manage/recyclebin/#{currentpage}/restore/#{post['dir']}/#{post['id']}">R</a></td>
+ <td><input type="checkbox" name="!i#{post['dir']}/#{post['id']}" id="#{post['dir']}#{post['id']}" value="1" /><label for="#{post['dir']}#{post['id']}"></label></td>
+ <td>#{post['id']}</td>
+ <td class="date" data-unix="${post['timestamp']}">${post['timestamp_formatted']}</td>
+ <td>${post['dir']}</td>
+ <td>${post['IS_DELETED']}</td>
+ <td>${post['ip']}</td>
+ <td>#{post['message']}</td>
+ </tr>
+ <?py #endfor ?>
+ <tr><td colspan="8" align="center"><input name="deleteall" type="submit" value="Eliminar seleccionados" /></td></tr>
+ </table>
+</form>
+<hr />
+<div style="font-size:larger">#{navigator}</div>
+<?py else: ?>
+ No hay posts.
+<?py #endif ?>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/reports.html b/cgi/templates/manage/reports.html
new file mode 100644
index 0000000..f47ec38
--- /dev/null
+++ b/cgi/templates/manage/reports.html
@@ -0,0 +1,58 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<?py from tenjin.helpers.html import * ?>
+<center>
+<div class="replymode">Reportes</div>
+<?py if message: ?>
+${message}
+<?py #endif ?>
+<form name="boardForm" method="get" action="#{cgi_url}manage/reports/0">
+<table>
+ <tr>
+ <td class="postblock">Board</td>
+ <td>
+ <select name="board">
+ <option value="all">Todos los boards</option>
+<?py for board in boards: ?>
+ <option value="#{board['dir']}"#{selected(board['checked'])}>#{board['dir']} - #{board['name']}</option>
+<?py #endfor ?>
+ </select>
+ <td><input type="submit" value="Mostrar" /></td>
+ </td></tr>
+</table>
+</form>
+
+<form name="ignoreForm" method="post" action="#{cgi_url}manage/reports/#{currentpage}">
+<?py if curboard: ?>
+<input type="hidden" name="board" value="#{board}" />
+<?py #endif ?>
+<hr />
+<table class="managertable">
+<tr>
+ <th></th>
+ <th></th>
+ <th>Fecha</th>
+ <th>Post</th>
+ <th>IP Post</th>
+ <th>Raz&oacute;n</th>
+ <th>IP Denuncia</th>
+</tr>
+<?py for report in reports: ?>
+<tr>
+ <td> <a href="#{cgi_url}manage/reports/#{currentpage}/ignore/#{report['id']}">X</a> </td>
+ <td><input type="checkbox" name="i#{report['id']}" id="i#{report['id']}" value="1" /><label for="i#{report['id']}"></label></td>
+ <td class="date" data-unix="${report['timestamp']}">${report['timestamp_formatted']}</td>
+ <td><a href="#{report['link']}">${report['link']}</a></td>
+ <td><a href="#{cgi_url}manage/ipshow?ip=${report['ip']}">${report['ip']}</a></td>
+ <td>${report['reason']}</td>
+ <td><a href="#{cgi_url}manage/ipshow?ip=${report['reporterip']}">${report['reporterip']}</a></td>
+</tr>
+<?py #endfor ?>
+<tr>
+ <td colspan="8" style="text-align:center;"><input name="ignore" type="submit" value="Ignorar seleccionados" /></td>
+</tr>
+</table>
+</form>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?>
diff --git a/cgi/templates/manage/search.html b/cgi/templates/manage/search.html
new file mode 100644
index 0000000..6c2ec6f
--- /dev/null
+++ b/cgi/templates/manage/search.html
@@ -0,0 +1,27 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<center>
+<div class="replymode">Registro de búsqueda</div>
+<table class="managertable">
+ <tr>
+ <th>ID</th>
+ <th>Fecha</th>
+ <th>Búsqueda</th>
+ <th>En</th>
+ <th>Resultados</th>
+ <th>Por</th>
+ </tr>
+<?py for log in search: ?>
+ <tr>
+ <td>${log['id']}</td>
+ <td class="date" data-unix="${log['timestamp']}">${log['timestamp_formatted']}</td>
+ <td>${log['keyword']}</td>
+ <td>${"[A] " if log['archive'] else ""}${"Global" if log["ita"] == "" else log["ita"]}</td>
+ <td>${log['res']}</td>
+ <td><a href="#{cgi_url}manage/ipshow?ip=${log['ip']}">${log['ip']}</a></td>
+ </tr>
+<?py #endfor ?>
+</table>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file
diff --git a/cgi/templates/manage/staff.html b/cgi/templates/manage/staff.html
new file mode 100644
index 0000000..787a843
--- /dev/null
+++ b/cgi/templates/manage/staff.html
@@ -0,0 +1,63 @@
+<?py include('templates/base_top.html') ?>
+<?py include('templates/manage/menu.html') ?>
+<?py from tenjin.helpers.html import * ?>
+<center>
+<div class="replymode">Staff</div>
+<?py if mode == 0: ?>
+ <table class="managertable">
+ <tr>
+ <th>ID</th>
+ <th>Nombre</th>
+ <th>Nivel</th>
+ <th>Última actividad</th>
+ <th>Acciones</th>
+ </tr>
+ <?py for member in staff: ?>
+ <tr>
+ <td>${member['id']}</td>
+ <td><b>${member['username']}</b></td>
+ <td>${member['rights']}</td>
+ <td class="date" data-unix="${member['lastactivestamp']}">${member['lastactive']}</td>
+ <td>
+ [<a href="#{cgi_url}manage/staff/edit/#{member['id']}">Editar</a>]
+ [<a href="#{cgi_url}manage/staff/delete/#{member['id']}">Eliminar</a>]
+ </td>
+ </tr>
+ <?py #endfor ?>
+ <tr>
+ <td colspan="5"><form action="#{cgi_url}manage/staff/add" method="get"><input type="submit" style="width:100%;" value="Agregar miembro" /></form></td>
+ </tr>
+ </table>
+<?py elif mode == 1: ?>
+<form action="#{cgi_url}manage/staff/#{action}" method="post">
+<table>
+ <tr>
+ <td class="postblock">Nombre</td>
+ <td><input type="text" name="username" value="${member_username}" style="width:100%;" /></td>
+ </tr>
+ <?py if not member: ?>
+ <tr>
+ <td class="postblock">Contraseña</td>
+ <td><input type="password" name="password" style="width:100%;"/></td>
+ </tr>
+ <?py #endif ?>
+ <tr>
+ <td class="postblock">Nivel</td>
+ <td>
+ <select name="rights" style="width:100%;">
+ <option value="3"#{selected(member_rights == '3')}>Moderador</option>
+ <option value="2"#{selected(member_rights == '2')}>Developer</option>
+ <option value="1"#{selected(member_rights == '1')}>Administrador</option>
+ <option value="0"#{selected(member_rights == '0')}>Super-Administrador</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><input type="submit" name="submit" style="width:100%;" value="${submit}"/></td>
+ </tr>
+</table>
+</form>
+<?py #endif ?>
+</center>
+<hr />
+<?py include('templates/base_bottom.html') ?> \ No newline at end of file