diff --git a/sigi/apps/diagnosticos/forms.py b/sigi/apps/diagnosticos/forms.py index 3c5ace0..90ecf66 100644 --- a/sigi/apps/diagnosticos/forms.py +++ b/sigi/apps/diagnosticos/forms.py @@ -1,5 +1,72 @@ +# -*- coding: utf8 -*- + +from copy import deepcopy + from models import Diagnostico from eav.forms import BaseDynamicEntityForm + class DiagnosticoForm(BaseDynamicEntityForm): + """Classe responsável por contruir o formulário, + vinculando ao modelo Diagnostico + """ model = Diagnostico + + +class DiagnosticoMobileForm(BaseDynamicEntityForm): + """Classe responsável por construir o formulário + para ser usado no ambiente mobile, a partir do + do modelo Diagnostico, como também organizar sua + estrutura via categorias. + """ + class Meta: + model = Diagnostico + + def __init__(self, data=None, category=None, *args, **kwargs): + super(BaseDynamicEntityForm, self).__init__(data, *args, **kwargs) + self._build_dynamics_fields(category) + + def _build_dynamics_fields(self, category): + """Método da classe ``BaseDynamicEntityForm`` sobrescrita, + para que as perguntas sejam agrupadas dentro das suas + categorias. + """ + # Caso seja as duas primeiras categorias, utilize + # os campos do modelo + if category in (0, 1, ): + self.fields = deepcopy(self.base_fields) + else: + self.field = dict() + + # Se determinada pergunta é da categoria pesquisada, + # então, gere o campo no formulário. + for schema in self.instance.get_schemata(): + if not schema.categoria_id == int(category): + continue + + defaults = { + 'label': schema.title.capitalize(), + 'required': schema.required, + 'help_text': schema.help_text, + } + + datatype = schema.datatype + if datatype == schema.TYPE_MANY: + choices = getattr(self.instance, schema.name) + defaults.update({'queryset': schema.get_choices(), + 'initial': [x.pk for x in choices]}) + + extra = self.FIELD_EXTRA.get(datatype, {}) + if hasattr(extra, '__call__'): + extra = extra(schema) + defaults.update(extra) + + MappedField = self.FIELD_CLASSES[datatype] + self.fields[schema.name] = MappedField(**defaults) + + # fill initial data (if attribute was already defined) + value = getattr(self.instance, schema.name) + + # m2m is already done above + if value and not datatype == schema.TYPE_MANY: + self.initial[schema.name] = value diff --git a/sigi/apps/diagnosticos/models.py b/sigi/apps/diagnosticos/models.py index 6aa11b0..975bcb2 100644 --- a/sigi/apps/diagnosticos/models.py +++ b/sigi/apps/diagnosticos/models.py @@ -32,6 +32,7 @@ class Diagnostico(BaseEntity): null=True, blank=True ) + status = models.BooleanField(u'status do diagnóstico', default=False) responsavel = models.ForeignKey('servidores.Servidor', verbose_name=u'responsável') class Meta: @@ -61,7 +62,7 @@ class Pergunta(BaseSchema): Uma pergunta tem o nome e o tipo da resposta """ - categoria = models.ForeignKey(Categoria) + categoria = models.ForeignKey(Categoria, related_name='perguntas') class Meta: ordering = ('title',) diff --git a/sigi/apps/diagnosticos/urls.py b/sigi/apps/diagnosticos/urls.py index cbfd7a3..4cb3ae6 100644 --- a/sigi/apps/diagnosticos/urls.py +++ b/sigi/apps/diagnosticos/urls.py @@ -2,5 +2,14 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('', + # Lista de Diagnósticos url(r'^$', 'sigi.apps.diagnosticos.views.lista', name='lista_diagnosticos'), + + # Lista de Categorias + url(r'^(?P\d+)/categorias/$', 'sigi.apps.diagnosticos.views.categorias', name='lista_categorias'), + + # Detalhes da Categoria + url(r'^(?P\d+)/categorias/(?P\d+)/$', + 'sigi.apps.diagnosticos.views.categoria_detalhes', + name='detalhes_categoria'), ) diff --git a/sigi/apps/diagnosticos/views.py b/sigi/apps/diagnosticos/views.py index 47db345..8b83861 100644 --- a/sigi/apps/diagnosticos/views.py +++ b/sigi/apps/diagnosticos/views.py @@ -3,7 +3,8 @@ from django.shortcuts import render_to_response from django.template import RequestContext -from sigi.apps.diagnosticos.models import Diagnostico +from sigi.apps.diagnosticos.models import Diagnostico, Categoria +from sigi.apps.diagnosticos.forms import DiagnosticoMobileForm def lista(request): @@ -17,3 +18,35 @@ def lista(request): context = RequestContext(request, {'diagnosticos': diagnosticos}) return render_to_response('diagnosticos/diagnosticos_list.html', context) + + +def categorias(request, id_diagnostico): + """Consulta as categorias do diagnostico selecionado + a partir da sua identificação + """ + categorias = Categoria.objects.all() + + context = RequestContext(request, {'categorias': categorias, + 'diagnostico': id_diagnostico}) + return render_to_response('diagnosticos/diagnosticos_categorias_list.html', + context) + + +def categoria_detalhes(request, id_diagnostico, id_categoria): + """Captura as perguntas da categoria + selecionada. + """ + try: + diagnostico = Diagnostico.objects.get(pk=id_diagnostico) + categoria = Categoria.objects.get(pk=id_categoria) + except Diagnostico.DoesNotExist, Categoria.DoesNotExist: + context = RequestContext(request) + return render_to_response('mobile/404.html', {}) + + # Criando o formulário e passando o diagnóstico selecionado + # para ser editado pelo form. + form = DiagnosticoMobileForm(instance=diagnostico, category=id_categoria) + + context = RequestContext(request, {'form': form, 'categoria': categoria}) + return render_to_response('diagnosticos/diagnosticos_categorias_form.html', + context) diff --git a/sigi/templates/diagnosticos/diagnosticos_categorias_form.html b/sigi/templates/diagnosticos/diagnosticos_categorias_form.html new file mode 100644 index 0000000..466a261 --- /dev/null +++ b/sigi/templates/diagnosticos/diagnosticos_categorias_form.html @@ -0,0 +1,33 @@ +{% extends "base_mobile.html" %} + +{% block cabecalho %} +

{{ categoria.nome }}

+ Voltar +{% endblock cabecalho %} + +{% block corpo %} + {% if form %} +
+ {% for field in form %} +
+ + {{ field }} +
+ {% endfor %} +
+ {% else %} +

Nenhuma existem perguntas para essa categoria.

+ {% endif %} +{% endblock corpo %} + +{% block rodape %} +
+
+ +
+
+{% endblock rodape %} diff --git a/sigi/templates/diagnosticos/diagnosticos_categorias_list.html b/sigi/templates/diagnosticos/diagnosticos_categorias_list.html new file mode 100644 index 0000000..0d58bd0 --- /dev/null +++ b/sigi/templates/diagnosticos/diagnosticos_categorias_list.html @@ -0,0 +1,32 @@ +{% extends "base_mobile.html" %} + +{% block cabecalho %} +

Categorias

+ Voltar +{% endblock cabecalho %} + +{% block corpo %} + {% if categorias %} + + {% else %} +

Nenhuma categoria existente.

+ {% endif %} +{% endblock corpo %} + +{% block rodape %} +
+
+ +
+
+{% endblock rodape %} diff --git a/sigi/templates/diagnosticos/diagnosticos_list.html b/sigi/templates/diagnosticos/diagnosticos_list.html index 96a1069..0f63dc9 100644 --- a/sigi/templates/diagnosticos/diagnosticos_list.html +++ b/sigi/templates/diagnosticos/diagnosticos_list.html @@ -2,16 +2,15 @@ {% block cabecalho %}

Diagnósticos

- Sair + Sair {% endblock cabecalho %} {% block corpo %} {% if diagnosticos %}