@ -0,0 +1,83 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# |
||||
|
# sigi.apps.ocorrencias.forms |
||||
|
# |
||||
|
# Copyright (c) 2015 by Interlegis |
||||
|
# |
||||
|
# GNU General Public License (GPL) |
||||
|
# |
||||
|
# This program is free software; you can redistribute it and/or |
||||
|
# modify it under the terms of the GNU General Public License |
||||
|
# as published by the Free Software Foundation; either version 2 |
||||
|
# of the License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU General Public License |
||||
|
# along with this program; if not, write to the Free Software |
||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
||||
|
# 02110-1301, USA. |
||||
|
# |
||||
|
from django.forms import ModelForm, ModelChoiceField, HiddenInput, TextInput |
||||
|
from sigi.apps.ocorrencias.models import Ocorrencia, Comentario, Anexo |
||||
|
from sigi.apps.servidores.models import Servico |
||||
|
from django.utils.encoding import force_text |
||||
|
from django.utils.html import format_html |
||||
|
from django.forms.utils import flatatt |
||||
|
from django.core.urlresolvers import reverse_lazy |
||||
|
from django.utils.safestring import mark_safe |
||||
|
|
||||
|
class AjaxSelect(TextInput): |
||||
|
url = "" |
||||
|
def __init__(self, url, attrs=None): |
||||
|
super(AjaxSelect, self).__init__(attrs) |
||||
|
self.url = url |
||||
|
|
||||
|
def render(self, name, value, attrs=None): |
||||
|
if value is None: |
||||
|
value = '' |
||||
|
final_attrs = self.build_attrs(attrs, type=self.input_type) |
||||
|
code_attrs = self.build_attrs(type='hidden', name=name, id='hidden_'+name) |
||||
|
if value != '': |
||||
|
# Only add the 'value' attribute if a value is non-empty. |
||||
|
final_attrs['value'] = force_text(self._format_value(value)) |
||||
|
result = format_html('<input{0} />', flatatt(final_attrs)) + "\n" |
||||
|
result = result + format_html('<input{0} />', flatatt(code_attrs)) |
||||
|
js = """ |
||||
|
<script type="text/javascript"> |
||||
|
$( document ).ready(function() { |
||||
|
$("#id_%(name)s").autocomplete({ |
||||
|
source: "%(url)s", |
||||
|
select: function(event, ui) { |
||||
|
$("#hidden_%(name)s").attr("value", ui.item.value); |
||||
|
ui.item.value = ui.item.label |
||||
|
} |
||||
|
}) |
||||
|
}); |
||||
|
</script>""" % {'name': name, 'url': self.url} |
||||
|
result = result + mark_safe(js) |
||||
|
return result |
||||
|
|
||||
|
class AnexoForm(ModelForm): |
||||
|
class Meta: |
||||
|
model = Anexo |
||||
|
fields = ['ocorrencia', 'descricao', 'arquivo',] |
||||
|
widgets = {'ocorrencia': HiddenInput()} |
||||
|
|
||||
|
class ComentarioForm(ModelForm): |
||||
|
encaminhar_setor = ModelChoiceField(queryset=Servico.objects.all(), cache_choices=True) |
||||
|
|
||||
|
class Meta: |
||||
|
model = Comentario |
||||
|
fields = ['ocorrencia', 'descricao', 'novo_status', 'encaminhar_setor'] |
||||
|
widgets = {'ocorrencia': HiddenInput(),} |
||||
|
|
||||
|
class OcorrenciaForm(ModelForm): |
||||
|
class Meta: |
||||
|
model = Ocorrencia |
||||
|
fields = ['casa_legislativa', 'categoria', 'tipo_contato', 'assunto', 'prioridade', |
||||
|
'descricao', 'setor_responsavel',] |
||||
|
widgets = {'casa_legislativa': AjaxSelect(url=reverse_lazy('painel-buscacasa'), attrs={'size':100}), } |
After Width: | Height: | Size: 418 B |
After Width: | Height: | Size: 312 B |
After Width: | Height: | Size: 205 B |
After Width: | Height: | Size: 262 B |
After Width: | Height: | Size: 348 B |
After Width: | Height: | Size: 207 B |
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 278 B |
After Width: | Height: | Size: 328 B |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 6.2 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
@ -0,0 +1,14 @@ |
|||||
|
{% extends "admin/base.html" %} |
||||
|
{% load i18n admin_static %} |
||||
|
{% load static from staticfiles %} |
||||
|
|
||||
|
{% block content_title %}<h1>{% trans "Enviar novo arquivo" %}</h1>{% endblock %} |
||||
|
{% block content %} |
||||
|
<div class="small"> |
||||
|
<form id="form_anexos_{{ ocorrencia.id|safe }}" action="" method="POST" enctype="multipart/form-data" > |
||||
|
{% csrf_token %} |
||||
|
{{ form.as_p }} |
||||
|
<input type="submit" name="Adicionar"/> |
||||
|
</form> |
||||
|
</div> |
||||
|
{% endblock %} |
@ -0,0 +1,24 @@ |
|||||
|
{% load i18n admin_static %} |
||||
|
{% load static from staticfiles %} |
||||
|
|
||||
|
{% if ocorrencia.anexo_set.exists %} |
||||
|
<table class="table"> |
||||
|
<tr> |
||||
|
<th>{% trans "Descrição" %}</th> |
||||
|
<th>{% trans "Data de publicação" %}</th> |
||||
|
<th> </th> |
||||
|
</tr> |
||||
|
{% for anexo in ocorrencia.anexo_set.all %} |
||||
|
<tr> |
||||
|
<td><a href="{{ anexo.arquivo.url }}">{{ anexo.descricao }}</a></td> |
||||
|
<td>{{ anexo.data_pub }}</td> |
||||
|
<td><a href="{% url "ocorrencia-excluianexo" %}?anexo_id={{ anexo.id|safe }}" |
||||
|
data-ocorrencia-id="{{ ocorrencia.id|safe }}" onclick="return remove_anexo(this);">Excluir</a></td> |
||||
|
</tr> |
||||
|
{% endfor %} |
||||
|
</table> |
||||
|
{% endif %} |
||||
|
|
||||
|
<a href="{% url 'ocorrencia-incluianexo' %}?ocorrencia_id={{ ocorrencia.id|safe }}" onclick="return showAddAnexoPopup(this);"> |
||||
|
{% trans "Anexar novo arquivo" %} |
||||
|
</a> |
@ -0,0 +1,7 @@ |
|||||
|
<div class="panel-body"> |
||||
|
<form id="form_ocorrencia" action="{% url 'ocorrencia-incluiocorrencia' %}" method="post"> |
||||
|
{% csrf_token %} |
||||
|
{{ ocorrencia_form.as_p }} |
||||
|
<input type="submit" value="Salvar"/> |
||||
|
</form> |
||||
|
</div> |
@ -0,0 +1,105 @@ |
|||||
|
{% load i18n admin_static %} |
||||
|
{% load static from staticfiles %} |
||||
|
{% load thumbnail %} |
||||
|
|
||||
|
{% static 'ocorrencias/images/lid.png' as default_lid %} |
||||
|
{% static 'ocorrencias/images/mm.png' as default_mm %} |
||||
|
|
||||
|
<div class="panel panel-default" id='ticket_{{ ocorrencia.id|safe }}'> |
||||
|
<div class="panel-heading"> |
||||
|
<div class="media"> |
||||
|
<div class="media-left"> |
||||
|
<img class="media-object" src="{{ ocorrencia.casa_legislativa.foto|thumbnail_url:'thumb'|default:default_lid }}" alt=""/> |
||||
|
</div> |
||||
|
<div class="media-body"> |
||||
|
<h4><a href="{{ url_painel }}?type=casa&id={{ ocorrencia.casa_legislativa_id|safe }}"> |
||||
|
{{ ocorrencia.casa_legislativa.nome }}, {{ ocorrencia.casa_legislativa.municipio.uf.sigla }}</a></h4> |
||||
|
<p><a href="{{ ocorrencia.get_absolute_url }}">{% trans "Ticket #" %}{{ ocorrencia.id|safe }}</a>: |
||||
|
{% blocktrans with data_criacao=ocorrencia.data_criacao tipo_contato=ocorrencia.tipo_contato categoria=ocorrencia.categoria id_setor=ocorrencia.setor_responsavel_id|safe setor=ocorrencia.setor_responsavel.sigla status=ocorrencia.get_status_display %} |
||||
|
Criado em {{ data_criacao }} via {{ tipo_contato }} solicitando {{ categoria }}, |
||||
|
está no setor <a href="{{ url_painel }}?type=servico&id={{ id_setor }}">{{ setor }}</a> |
||||
|
com status {{ status }} |
||||
|
{% endblocktrans %}</p> |
||||
|
<p>{% trans "Gerente de contas:" %} |
||||
|
<a href="{{ url_painel }}?type=servidor&id={{ ocorrencia.casa_legislativa.gerente_contas_id|safe }}"> |
||||
|
{{ ocorrencia.casa_legislativa.gerente_contas }}</a></p> |
||||
|
{% trans 'Prioridade' %}: |
||||
|
<div class="btn-group btn-group-xs" data-toggle="buttons" role="group" aria-label="..."> |
||||
|
{% for id, name in PRIORITY_CHOICES %} |
||||
|
<label class="btn btn-primary {% if id == ocorrencia.prioridade %}active{% endif %}"> |
||||
|
<input type="radio" name="ocorrencia-{{ ocorrencia.id|safe }}" value="{{ id|safe }}" autocomplete="off"{% if id == ocorrencia.prioridade %} checked {% endif %}> |
||||
|
{{ name }} |
||||
|
</label> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="panel-body"> |
||||
|
<div class="media"> |
||||
|
<div class="media-left"> |
||||
|
<img class="media-object" src="{{ ocorrencia.servidor_registro.foto|thumbnail_url:'icon'|default:default_mm }}" alt=""/> |
||||
|
</div> |
||||
|
<div class="media-body"> |
||||
|
<p><a href="{{ url_painel }}?type=servidor&id={{ ocorrencia.servidor_registro_id|safe }}"> |
||||
|
<strong>{{ ocorrencia.servidor_registro }}</strong></a> |
||||
|
{% trans 'comentou' %}:</p> |
||||
|
<p>{{ ocorrencia.descricao }}</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
{% for comentario in ocorrencia.comentarios.all %} |
||||
|
<div class="media"> |
||||
|
<div class="media-left"> |
||||
|
<img class="media-object" src="{{ comentario.usuario.foto|thumbnail_url:'icon'|default:default_mm }}" alt=""/> |
||||
|
</div> |
||||
|
<div class="media-body"> |
||||
|
<p><a href="{{ url_painel }}?type=servidor&id={{ comentario.usuario_id|safe }}"> |
||||
|
<strong>{{ comentario.usuario.nome_completo }}</strong></a> |
||||
|
{% trans 'comentou' %}:</p> |
||||
|
<p>{{ comentario.descricao }}</p> |
||||
|
<p class="small">{% trans 'Em' %} {{ comentario.data_criacao }} |
||||
|
{% if comentarui.status %} |
||||
|
| {% trans 'novo status' %}: {{ comentario.get_novo_status_display }} |
||||
|
{% endif %} |
||||
|
{% if comentario.encaminhar_setor %} |
||||
|
| {% trans 'Encaminhado para' %} {{ comentario.encaminhar_setor.sigla }} |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
</div> |
||||
|
{% endfor %} |
||||
|
<a id='link_comentar_{{ ocorrencia.id|safe }}' role="button" data-toggle="collapse" href="#comentario_{{ ocorrencia.id|safe }}" aria-expanded="false" aria-controls="comentario_{{ ocorrencia.id|safe }}"> |
||||
|
{% trans "Comentar esta ocorrência" %} |
||||
|
</a> |
||||
|
<div class="collapse" id="comentario_{{ ocorrencia.id|safe }}"> |
||||
|
<form id="comentar_ocorrencia_{{ ocorrencia.id|safe }}" action="{% url 'ocorrencia-incluicomentario' %}" method="post" data-ocorrencia-id="{{ ocorrencia.id|safe }}"> |
||||
|
{% csrf_token %} |
||||
|
{{ comentario_form.non_field_errors }} |
||||
|
{% for field in comentario_form %} |
||||
|
<div class="fieldWrapper"> |
||||
|
{% if field.name == 'ocorrencia' %} |
||||
|
<input type='hidden' name='ocorrencia' value='{{ ocorrencia.id|safe }}'/> |
||||
|
{% else %} |
||||
|
{{ field.errors }} |
||||
|
<p>{{ field.label_tag }} {{ field }}</p> |
||||
|
{% endif %} |
||||
|
</div> |
||||
|
{% endfor %} |
||||
|
<input type="submit" value="{% trans 'Comentar' %}"> |
||||
|
</form> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="panel-footer"> |
||||
|
<a id='link_anexos_{{ ocorrencia.id|safe }}'role="button" data-toggle="collapse" href="#anexos_{{ ocorrencia.id|safe }}" aria-expanded="false" aria-controls="anexos_{{ ocorrencia.id|safe }}"> |
||||
|
{% blocktrans count counter=ocorrencia.total_anexos %} |
||||
|
{{ counter }} arquivo anexo |
||||
|
{% plural %} |
||||
|
{{ counter }} arquivos anexos |
||||
|
{% endblocktrans %} |
||||
|
</a> |
||||
|
|
||||
|
<div class="collapse" id="anexos_{{ ocorrencia.id|safe }}"> |
||||
|
{% include 'ocorrencias/anexos_snippet.html' %} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
@ -0,0 +1,198 @@ |
|||||
|
{% extends "admin/base_site.html" %} |
||||
|
{% load i18n admin_static %} |
||||
|
{% load static from staticfiles %} |
||||
|
{% load thumbnail %} |
||||
|
|
||||
|
{% block extrastyle %} |
||||
|
{{ block.super }} |
||||
|
<link rel="stylesheet" type="text/css" href="{% static 'ocorrencias/css/jquery-ui.min.css' %}"/> |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block extrahead %} |
||||
|
{{ block.super }} |
||||
|
<script type="text/javascript" src="{% static 'admin/js/core.js' %}" ></script> |
||||
|
<script type="text/javascript" src="{% static 'admin/js/jquery.min.js' %}" ></script> |
||||
|
<script type="text/javascript" src="{% static 'admin/js/jquery.init.js' %}" ></script> |
||||
|
<script type="text/javascript" src="{% static 'ocorrencias/js/jquery-ui.min.js' %}" ></script> |
||||
|
{% endblock %} |
||||
|
|
||||
|
{% block coltype %}colMS{% endblock %} |
||||
|
|
||||
|
{% block content_title %}<h1>{{ panel_title }}</h1>{% endblock %} |
||||
|
|
||||
|
{% block content %} |
||||
|
{% url 'painel-ocorrencias' as url_painel %} |
||||
|
<div id="content-main" class="container-fluid"> |
||||
|
<div class="form-group"> |
||||
|
<div class="input-group"> |
||||
|
<input type="text" class="form-control" id="q" placeholder="{% trans 'Visitar o painel de' %}"> |
||||
|
<span class="input-group-btn"> |
||||
|
<button class="btn btn-default" type="button" onclick="window.location.href='{{ url_painel }}'">{% trans 'Meu painel' %}</button> |
||||
|
</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="nav nav-pills"> |
||||
|
<span class="glyphicon glyphicon-plus"></span> |
||||
|
<a role="button" data-toggle="collapse" href="#form_ocorrencia_panel" aria-expanded="false" aria-controls="form_ocorrencia_panel"> |
||||
|
{% trans "Registrar nova ocorrência" %} |
||||
|
</a> |
||||
|
</div> |
||||
|
|
||||
|
<div class="collapse panel panel-default" id='form_ocorrencia_panel'> |
||||
|
{% include 'ocorrencias/ocorrencia_form.html' %} |
||||
|
</div> |
||||
|
|
||||
|
{% if paineis %} |
||||
|
<ul class="nav nav-pills"> |
||||
|
{% for k, v in paineis.iteritems %} |
||||
|
<li role="presentation" class="{% if k == painel %}active{% endif %}"> |
||||
|
<a href="{{ url_painel }}?type=servidor&id={{ servidor.id }}&painel={{ k }}"> |
||||
|
{{ v }}</a></li> |
||||
|
{% endfor %} |
||||
|
</ul> |
||||
|
{% endif %} |
||||
|
|
||||
|
<div class="row"> |
||||
|
<div id="ocorrencias_display" class="col-md-12"> |
||||
|
{% for ocorrencia in ocorrencias %} |
||||
|
{% include 'ocorrencias/ocorrencia_snippet.html' %} |
||||
|
{% empty %} |
||||
|
<div class="panel panel-default"> |
||||
|
<div class="panel-body"> |
||||
|
<p>{% trans 'Nenhuma ocorrência encontrada.' %}</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<script type="text/javascript"> |
||||
|
$( document ).ready(function() { |
||||
|
$.ajaxSetup({ |
||||
|
beforeSend: function(xhr, settings) { |
||||
|
if (!(/^(GET|HEAD|OPTIONS|TRACE)$/.test(settings.type)) && !this.crossDomain) { |
||||
|
var cookieValue = null, name = 'csrftoken'; |
||||
|
if (document.cookie && document.cookie != '') { |
||||
|
var cookies = document.cookie.split(';'); |
||||
|
for (var i = 0; i < cookies.length; i++) { |
||||
|
var cookie = jQuery.trim(cookies[i]); |
||||
|
if (cookie.substring(0, name.length + 1) == (name + '=')) { |
||||
|
cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
xhr.setRequestHeader("X-CSRFToken", cookieValue); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
$("#q").autocomplete({ |
||||
|
source: "{% url 'painel-buscanominal' %}", |
||||
|
select: function(event, ui) { |
||||
|
window.location.replace("{{ url_painel }}?type="+ui.item.origin+"&id="+ui.item.value); |
||||
|
ui.item.value = ui.item.label |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
$('input[name^=ocorrencia-]').on('change', function() { |
||||
|
var $this = $(this), |
||||
|
data = {'id_ocorrencia': $this.attr('name').split('-')[1], |
||||
|
'prioridade': $this.attr('value')}; |
||||
|
|
||||
|
$.post('{% url "ocorrencia-mudaprioridade" %}', data, function(result) { |
||||
|
if (result.result == 'error') { |
||||
|
alert(result.message); |
||||
|
$this.reset(); |
||||
|
} |
||||
|
}); |
||||
|
}) |
||||
|
|
||||
|
function inclui_comentario( event ) { |
||||
|
event.preventDefault() |
||||
|
|
||||
|
var $this = $(this); |
||||
|
|
||||
|
$.post($this.attr('action'), $this.serialize(), function( result ) { |
||||
|
$('div[id=ticket_'+result.ocorrencia_id+']').html(result.ocorrencia_panel); |
||||
|
$('form[id^=comentar_ocorrencia_').on('submit', inclui_comentario); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function inclui_ocorrencia( event ) { |
||||
|
event.preventDefault() |
||||
|
|
||||
|
var $this = $(this); |
||||
|
|
||||
|
$.post($this.attr('action'), $this.serialize(), function( result ) { |
||||
|
$("#form_ocorrencia_panel").html(result.ocorrencia_form); |
||||
|
if (result.result == 'success') { |
||||
|
$("#form_ocorrencia_panel").collapse('hide'); |
||||
|
$("#ocorrencias_display").prepend(result.ocorrencia_panel); |
||||
|
$('form[id^=comentar_ocorrencia_').on('submit', inclui_comentario); |
||||
|
} |
||||
|
$('#form_ocorrencia').on('submit', inclui_ocorrencia); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
$('form[id^=comentar_ocorrencia_').on('submit', inclui_comentario); |
||||
|
$('#form_ocorrencia').on('submit', inclui_ocorrencia); |
||||
|
}); |
||||
|
|
||||
|
function remove_anexo(link) { |
||||
|
var $this = $(link), |
||||
|
url = $this.attr('href'), |
||||
|
div = $("div#anexos_"+$this.attr('data-ocorrencia-id')), |
||||
|
link = $("a#link_anexos_"+$this.attr('data-ocorrencia-id')); |
||||
|
|
||||
|
$( 'body' ).append('<div id="dialog-confirm" title="{% trans "Excluir anexo?" %}"><p><span class="glyphicon glyphicon-alert" style="float:left; margin:0 7px 20px 0;"></span>{% trans "Este anexo será definitivamente excluído e não poderá ser recuperado. Você confirma a exclusão?" %}</p></div>'); |
||||
|
|
||||
|
var dialog = $("#dialog-confirm"); |
||||
|
|
||||
|
dialog.dialog({ |
||||
|
resizable: true, |
||||
|
modal: true, |
||||
|
buttons: { |
||||
|
"{% trans 'Excluir' %}": function() { |
||||
|
$.get(url, function(result) { |
||||
|
if (result.result == 'error') { |
||||
|
alert(result.message); |
||||
|
} |
||||
|
if (result.result == 'success') { |
||||
|
div.html(result.anexos_panel); |
||||
|
link.html(result.link_label); |
||||
|
} |
||||
|
}); |
||||
|
dialog.dialog( 'destroy' ); |
||||
|
}, |
||||
|
"{% trans 'Cancelar' %}": function() { |
||||
|
dialog.dialog( 'destroy' ); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
function dismissAddAnexoPopup(win, ocorrencia_id) { |
||||
|
var div = $("div#anexos_"+ocorrencia_id), |
||||
|
link = $("a#link_anexos_"+ocorrencia_id); |
||||
|
|
||||
|
win.close(); |
||||
|
|
||||
|
$.get('{% url "ocorrencia-anexosnippet" %}?ocorrencia_id='+ocorrencia_id, function( result ) { |
||||
|
div.html(result); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function showAddAnexoPopup(link) { |
||||
|
var $this = $(link), |
||||
|
href = $this.attr('href'), |
||||
|
win = window.open(href, '', 'height=500,width=800,resizable=yes,scrollbars=yes'); |
||||
|
win.focus(); |
||||
|
return false; |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
{% endblock %} |
@ -0,0 +1,19 @@ |
|||||
|
# coding: utf-8 |
||||
|
from django.conf.urls import patterns, url |
||||
|
|
||||
|
|
||||
|
urlpatterns = patterns( |
||||
|
'sigi.apps.ocorrencias.views', |
||||
|
# Painel de ocorrencias |
||||
|
url(r'^painel/$', 'painel_ocorrencias', name='painel-ocorrencias'), |
||||
|
url(r'^painel/buscanominal/$', 'busca_nominal', {"origin": "tudo"}, name='painel-buscanominal'), |
||||
|
url(r'^painel/buscanominal/casa/$', 'busca_nominal', {"origin": "casa"}, name='painel-buscacasa'), |
||||
|
url(r'^painel/buscanominal/servidor/$', 'busca_nominal', {"origin": "servidor"}, name='painel-buscaservidor'), |
||||
|
url(r'^painel/buscanominal/servico/$', 'busca_nominal', {"origin": "servico"}, name='painel-buscaservico'), |
||||
|
url(r'^mudaprioridade/$', 'muda_prioridade', name='ocorrencia-mudaprioridade'), |
||||
|
url(r'^excluianexo/$', 'exclui_anexo', name='ocorrencia-excluianexo'), |
||||
|
url(r'^incluianexo/$', 'inclui_anexo', name='ocorrencia-incluianexo'), |
||||
|
url(r'^anexosnippet/$', 'anexo_snippet', name='ocorrencia-anexosnippet'), |
||||
|
url(r'^incluicomentario/$', 'inclui_comentario', name='ocorrencia-incluicomentario'), |
||||
|
url(r'^incluiocorrencia/$', 'inclui_ocorrencia', name='ocorrencia-incluiocorrencia'), |
||||
|
) |
@ -0,0 +1,214 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from django.http import JsonResponse, Http404 |
||||
|
from django.db.models import Q, Count |
||||
|
from django.utils.translation import ungettext, ugettext as _ |
||||
|
from django.shortcuts import get_object_or_404, render, HttpResponse |
||||
|
from django.contrib.auth.decorators import login_required |
||||
|
from django.views.decorators.http import require_POST |
||||
|
from django.template.loader import render_to_string |
||||
|
from django.template import RequestContext |
||||
|
from sigi.apps.utils import to_ascii |
||||
|
from sigi.apps.casas.models import CasaLegislativa |
||||
|
from sigi.apps.contatos.models import UnidadeFederativa |
||||
|
from sigi.apps.servidores.models import Servidor, Servico |
||||
|
from sigi.apps.ocorrencias.models import Ocorrencia, Anexo |
||||
|
from sigi.apps.ocorrencias.forms import AnexoForm, ComentarioForm, OcorrenciaForm |
||||
|
from django.utils.html import escape |
||||
|
|
||||
|
@login_required |
||||
|
def painel_ocorrencias(request): |
||||
|
type = request.GET.get('type', None) |
||||
|
id = request.GET.get('id', None) |
||||
|
painel = request.GET.get('painel', None) |
||||
|
|
||||
|
data = {} |
||||
|
|
||||
|
if type is None or type == 'error': |
||||
|
type = 'servidor' |
||||
|
u = get_object_or_404(Servidor, user=request.user) |
||||
|
id = u.pk |
||||
|
|
||||
|
if id is None: |
||||
|
raise Http404("id não definido") |
||||
|
|
||||
|
if type == 'casa': |
||||
|
casa = get_object_or_404(CasaLegislativa, pk=id) |
||||
|
ocorrencias = Ocorrencia.objects.filter(casa_legislativa=casa) |
||||
|
panel_title = "%s, %s" % (casa.nome, casa.municipio.uf.sigla) |
||||
|
elif type == 'servidor': |
||||
|
servidor = get_object_or_404(Servidor, pk=id) |
||||
|
panel_title = servidor.nome_completo |
||||
|
|
||||
|
paineis = {'gerente': 'Minhas casas', 'servico': 'Meu setor', 'timeline': 'Comentados por mim'} |
||||
|
|
||||
|
if painel is None: |
||||
|
if CasaLegislativa.objects.filter(gerente_contas=servidor).count() > 0: |
||||
|
painel = 'gerente' |
||||
|
elif Ocorrencia.objects.filter(setor_responsavel=servidor.servico).count() > 0: |
||||
|
painel = 'servico' |
||||
|
else: |
||||
|
painel = 'timeline' |
||||
|
|
||||
|
data.update({'paineis': paineis, 'painel': painel, 'servidor': servidor}) |
||||
|
|
||||
|
if painel == 'gerente': |
||||
|
ocorrencias = Ocorrencia.objects.filter(casa_legislativa__gerente_contas=servidor) |
||||
|
elif painel == 'servico': |
||||
|
ocorrencias = Ocorrencia.objects.filter(setor_responsavel_id=servidor.servico_id) |
||||
|
else: |
||||
|
ocorrencias = (Ocorrencia.objects.filter(servidor_registro=servidor) | |
||||
|
Ocorrencia.objects.filter(comentarios__usuario=servidor)) |
||||
|
elif type == 'servico': |
||||
|
servico = get_object_or_404(Servico, pk=id) |
||||
|
ocorrencias = Ocorrencia.objects.filter(setor_responsavel_id=id) |
||||
|
panel_title = "%s - %s" % (servico.sigla, servico.nome) |
||||
|
|
||||
|
ocorrencias = ocorrencias.filter(status__in=[1,2]) |
||||
|
ocorrencias = ocorrencias.order_by('prioridade', '-data_modificacao') |
||||
|
ocorrencias = ocorrencias.select_related('casa_legislativa', 'categoria', 'tipo_contato', 'servidor_registro', 'setor_responsavel', |
||||
|
'casa_legislativa__gerente_contas') |
||||
|
ocorrencias = ocorrencias.prefetch_related('comentarios', 'comentarios__usuario', 'comentarios__encaminhar_setor', |
||||
|
'casa_legislativa__municipio', 'casa_legislativa__municipio__uf', 'anexo_set') |
||||
|
ocorrencias = ocorrencias.annotate(total_anexos=Count('anexo')) |
||||
|
|
||||
|
data.update({'ocorrencias': ocorrencias, 'panel_title': panel_title, 'comentario_form': ComentarioForm(), |
||||
|
'ocorrencia_form': OcorrenciaForm(), 'PRIORITY_CHOICES': Ocorrencia.PRIORITY_CHOICES}) |
||||
|
|
||||
|
return render(request, 'ocorrencias/painel.html', data) |
||||
|
|
||||
|
def busca_nominal(request, origin="tudo"): |
||||
|
term = request.GET.get('term', None) |
||||
|
if term is None: |
||||
|
return JsonResponse([{'label': _(u'Erro na pesquisa por termo'), 'value': 'type=error'}], safe=False) |
||||
|
|
||||
|
data = [] |
||||
|
|
||||
|
if origin == "casa" or origin == "tudo": |
||||
|
casas = CasaLegislativa.objects.filter(search_text__icontains=to_ascii(term)).select_related('municipio', 'municipio__uf')[:10] |
||||
|
data += [{'value': c.pk, 'label': "%s, %s" % (c.nome, c.municipio.uf.sigla,), 'origin': 'casa'} for c in casas] |
||||
|
|
||||
|
if origin == "servidor" or origin == "tudo": |
||||
|
servidores = Servidor.objects.filter(nome_completo__icontains=term)[:10] |
||||
|
data += [{'value': s.pk, 'label': s.nome_completo, 'origin': 'servidor'} for s in servidores] |
||||
|
|
||||
|
if origin == "servico" or origin == "tudo": |
||||
|
setores = Servico.objects.filter(nome__icontains=term) | Servico.objects.filter(sigla__icontains=term) |
||||
|
setores = setores[:10] |
||||
|
data += [{'value': s.pk, 'label': '%s - %s' % (s.sigla, s.nome), 'origin': 'servico'} for s in setores] |
||||
|
|
||||
|
data = sorted(data, key=lambda d: d['label']) |
||||
|
|
||||
|
return JsonResponse(data, safe=False) |
||||
|
|
||||
|
@login_required |
||||
|
@require_POST |
||||
|
def muda_prioridade(request): |
||||
|
id_ocorrencia = request.POST.get('id_ocorrencia', None) |
||||
|
prioridade = request.POST.get('prioridade', None) |
||||
|
|
||||
|
if id_ocorrencia is None or prioridade is None: |
||||
|
return JsonResponse({'result': 'error', 'message': _(u'Erro nos parâmetros')}) |
||||
|
|
||||
|
if not any([int(prioridade) == p[0] for p in Ocorrencia.PRIORITY_CHOICES]): |
||||
|
return JsonResponse({'result': 'error', 'message': _(u'Valor de prioridade não aceito')}) |
||||
|
|
||||
|
try: |
||||
|
ocorrencia = Ocorrencia.objects.get(pk=id_ocorrencia) |
||||
|
except Exception as e: |
||||
|
return JsonResponse({'result': 'error', 'message': str(e)}) |
||||
|
|
||||
|
ocorrencia.prioridade = prioridade |
||||
|
ocorrencia.save() |
||||
|
|
||||
|
return JsonResponse({'result': 'success', 'message': _(u'Prioridade alterada')}) |
||||
|
|
||||
|
@login_required |
||||
|
def exclui_anexo(request): |
||||
|
anexo_id = request.GET.get('anexo_id', None) |
||||
|
|
||||
|
if anexo_id is None: |
||||
|
return JsonResponse({'result': 'error', 'message': _(u'Erro nos parâmetros')}) |
||||
|
|
||||
|
try: |
||||
|
anexo = Anexo.objects.get(pk=anexo_id) |
||||
|
except Exception as e: |
||||
|
return JsonResponse({'result': 'error', 'message': str(e)}) |
||||
|
|
||||
|
ocorrencia = anexo.ocorrencia |
||||
|
anexo.delete() |
||||
|
|
||||
|
link_label = (ungettext('%s arquivo anexo', '%s arquivos anexos', ocorrencia.anexo_set.count()) % |
||||
|
(ocorrencia.anexo_set.count(),)) |
||||
|
|
||||
|
painel = render_to_string('ocorrencias/anexos_snippet.html', {'ocorrencia': ocorrencia}, |
||||
|
context_instance=RequestContext(request)) |
||||
|
|
||||
|
return JsonResponse({'result': 'success', 'message': _(u'Anexo %s excluído com sucesso' % (anexo_id,)), |
||||
|
'link_label': link_label, 'anexos_panel': painel}) |
||||
|
|
||||
|
@login_required |
||||
|
def inclui_anexo(request): |
||||
|
if request.method == 'POST': |
||||
|
form = AnexoForm(request.POST, request.FILES) |
||||
|
if form.is_valid(): |
||||
|
anexo = form.save() |
||||
|
return HttpResponse('<script type="text/javascript">opener.dismissAddAnexoPopup(window, "%s");</script>' % |
||||
|
escape(anexo.ocorrencia_id)) |
||||
|
else: |
||||
|
ocorrencia = form.instance.ocorrencia |
||||
|
else: |
||||
|
ocorrencia_id = request.GET.get('ocorrencia_id', None) |
||||
|
ocorrencia = get_object_or_404(Ocorrencia, pk=ocorrencia_id) |
||||
|
form = AnexoForm(instance=Anexo(ocorrencia=ocorrencia)) |
||||
|
return render(request, 'ocorrencias/anexo_form.html', |
||||
|
{'form': form, 'ocorrencia': ocorrencia, 'is_popup': True}) |
||||
|
|
||||
|
@login_required |
||||
|
def anexo_snippet(request): |
||||
|
ocorrencia_id = request.GET.get('ocorrencia_id', None) |
||||
|
ocorrencia = get_object_or_404(Ocorrencia, pk=ocorrencia_id) |
||||
|
return render(request, 'ocorrencias/anexos_snippet.html', {'ocorrencia': ocorrencia}) |
||||
|
|
||||
|
@login_required |
||||
|
@require_POST |
||||
|
def inclui_comentario(request): |
||||
|
form = ComentarioForm(request.POST) |
||||
|
if form.is_valid(): |
||||
|
comentario = form.save(commit=False) |
||||
|
comentario.usuario = Servidor.objects.get(user=request.user) |
||||
|
comentario.save() |
||||
|
ocorrencia = comentario.ocorrencia |
||||
|
form = ComentarioForm() |
||||
|
else: |
||||
|
ocorrencia = form.instance.ocorrencia |
||||
|
|
||||
|
painel = render_to_string('ocorrencias/ocorrencia_snippet.html', {'ocorrencia': ocorrencia, |
||||
|
'comentario_form': form,}, context_instance=RequestContext(request)) |
||||
|
|
||||
|
return JsonResponse({'ocorrencia_id': ocorrencia.id, 'ocorrencia_panel': painel}) |
||||
|
|
||||
|
@login_required |
||||
|
@require_POST |
||||
|
def inclui_ocorrencia(request): |
||||
|
form = OcorrenciaForm(request.POST) |
||||
|
|
||||
|
data = {} |
||||
|
|
||||
|
if form.is_valid(): |
||||
|
ocorrencia = form.save(commit=False) |
||||
|
ocorrencia.servidor_registro = Servidor.objects.get(user=request.user) |
||||
|
ocorrencia.save() |
||||
|
form = OcorrenciaForm() |
||||
|
data['result'] = 'success' |
||||
|
data['ocorrencia_panel'] = render_to_string('ocorrencias/ocorrencia_snippet.html', |
||||
|
{'ocorrencia': ocorrencia, 'comentario_form': ComentarioForm(), |
||||
|
'PRIORITY_CHOICES': Ocorrencia.PRIORITY_CHOICES}, |
||||
|
context_instance=RequestContext(request)) |
||||
|
else: |
||||
|
data['result'] = 'error' |
||||
|
|
||||
|
data['ocorrencia_form'] = render_to_string('ocorrencias/ocorrencia_form.html', |
||||
|
{'ocorrencia_form': form}, |
||||
|
context_instance=RequestContext(request)) |
||||
|
|
||||
|
return JsonResponse(data) |