better integration of notes, templates clean up

This commit is contained in:
Arthur Gerbaud
2016-08-06 19:28:15 +02:00
parent b3ca132a73
commit aefeb2e349
12 changed files with 101 additions and 63 deletions

View File

@@ -20,15 +20,19 @@ class Observation(Note):
def __str__(self): def __str__(self):
return "%s" % self.sujet return "%s" % self.sujet
def get_date(self): def note_date(self):
""" Enforce value of created_date """ """ Enforce value of created_date """
return self.rencontre.date return self.rencontre.date
def get_labels(self): def note_time(self):
""" Enforce value of created_time """
return self.rencontre.heure_debut
def note_labels(self):
return [self.rencontre.lieu, self.rencontre.heure_debut] return [self.rencontre.lieu, self.rencontre.heure_debut]
def get_bg_colors(self): def note_bg_colors(self):
return ("success", "info") return ("info", "info")

View File

@@ -1,29 +1,16 @@
{% load notes %}
<div class="panel panel-primary"> <div class="panel panel-primary">
<!-- Default panel contents --> <!-- Default panel contents -->
<div class="panel-heading"><h3 class="panel-title">Compte-Rendu</h3> <div class="panel-heading">
</div> <h3 class="panel-title">{{ maraude.binome }} & {{ maraude.referent }}
<div class="panel-body"> <span class="pull-right"><span class="label pull-right">Rencontres : {{ maraude.rencontre_count}}</span></span></h3>
<p class="bg-info">Maraudeurs: {{ maraude.binome.first_name }}, {{ maraude.referent.first_name }}</p>
{% if maraude.est_terminee %}<p>Terminée à {{ maraude.heure_fin}} </p>
<p>{{maraude.rencontre_count}} rencontres</p>
{% else %}
{% endif %}
</div> </div>
<table class="table table-bordered table-striped"> <table class="table table-bordered table-striped">
{% for rencontre, observations in maraude %} {% for note in notes %}
<tr> {% inline_table note header="sujet" %}
<th>{{ rencontre.lieu }}</th>
<th>{{ rencontre.heure_debut }}</th>
<th style="text-align:right" width="150">Durée: {{ rencontre.duree }}min</th>
</tr>
{% for observation in observations %}
<tr><td>{{ observation.sujet }}</td><td colspan="2"> {{ observation.note }}</td>
</tr>
{% endfor %}
{% endfor %} {% endfor %}
</table> </table>
{% if user.is_superuser and maraude.est_terminee %}<div class="panel-footer"> {% if user.is_superuser and maraude.est_terminee %}<div class="panel-footer text-right">
<a class="btn btn-primary" href="{% url 'maraudes:update' maraude.pk %}">Modifier</a> <a class="btn btn-sm btn-default" href="{% url 'maraudes:update' maraude.pk %}">Modifier</a>
</div>{%endif%} </div>{%endif%}
</div> </div>

View File

@@ -1,20 +1,23 @@
{% load bootstrap3 %} {% load bootstrap3 %}
<form method="post" action="{% url 'maraudes:update' maraude.pk %}?continue=True"> <form method="post" action="{% url 'maraudes:update' maraude.pk %}?continue=True">
{% csrf_token %} {% csrf_token %}
{{ base_formset.management_form }} {{ base_formset.management_form }}
{% for form, inline_formset in forms %} <div class="col-md-12 text-center well">
<div class="col-md-6 col-sd-12"> <div class="btn-group">
<div class="panel panel-default">
<div class="panel-heading text-right">
{% bootstrap_field form.DELETE field_class="col-md-1"%}
<button type="submit" class="btn btn-sm btn-success" formaction="{% url 'maraudes:update' maraude.pk %}?continue=False"> <button type="submit" class="btn btn-sm btn-success" formaction="{% url 'maraudes:update' maraude.pk %}?continue=False">
{% bootstrap_icon "refresh" %} Mettre à jour</button> {% bootstrap_icon "refresh" %} Mettre à jour</button>
{% bootstrap_button "Enregistrer et quitter" button_type="submit" button_class="btn-primary btn-sm" icon="ok-circle" %} {% bootstrap_button "Enregistrer et quitter" button_type="submit" button_class="btn-primary btn-sm" icon="ok-circle" %}
</div> </div>
</div>
{% for form, inline_formset in forms %}
<div class="col-md-6 col-sd-12">
<div class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
{% include "compte_rendu/compterendu_form.html" %} {% include "compte_rendu/compterendu_form.html" %}
</div> </div>
<div class="panel-footer text-right">
{% bootstrap_field form.DELETE %}
</div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

View File

@@ -1,6 +1,9 @@
<div class="col-md-6">
{% if maraude.est_terminee %} {% if maraude.est_terminee %}
{% include "compte_rendu/compterendu.html" with maraude=compte_rendu %} {% include "compte_rendu/compterendu.html" with maraude=compte_rendu %}
{% else %} {% else %}
{% if user.is_superuser %}<a class="btn btn-primary" href="{% url 'maraudes:create' maraude.pk %}">Écrire le compte-rendu</a> {% if user.is_superuser %}<a class="btn btn-primary" href="{% url 'maraudes:create' maraude.pk %}">Écrire le compte-rendu</a>
{% else %} <p class="alert alert-info">Le compte-rendu n'a pas encore été écrit</p>{% endif %} {% else %} <p class="alert alert-info">Le compte-rendu n'a pas encore été écrit</p>{% endif %}
{% endif %} {% endif %}
</div>
{% include 'maraudes/panel_dernieres_maraudes.html' %}

View File

@@ -15,21 +15,7 @@
</div> </div>
</div> </div>
{% if dernieres_maraudes %}<div class="col-md-6" id="dernieres-maraudes"> {% include 'maraudes/panel_dernieres_maraudes.html' %}
<div class="panel panel-default">
<div class="panel-heading">
<p>Dernières maraudes
<span class="pull-right"><a href="{% url 'maraudes:liste' %}" class="btn btn-primary btn-sm">Aller à la liste</a></span></p>
</div>
<div class="list-group">
{% for maraude in dernieres_maraudes %}
<a href="{% url 'maraudes:details' maraude.pk %}" class="list-group-item">
<strong>{{ maraude }}</strong> <small>{{maraude.binome}} & {{maraude.referent}}</small>
</a>
{% endfor %}
</div>
</div>
</div>{% endif %}
{% if user.is_superuser %}<div class="col-md-6" id="administration"> {% if user.is_superuser %}<div class="col-md-6" id="administration">
<div class="panel panel-danger"> <div class="panel panel-danger">

View File

@@ -0,0 +1,16 @@
{% if dernieres_maraudes %}
<div class="col-md-6" id="dernieres-maraudes">
<div class="panel panel-default">
<div class="panel-heading">
<p>Dernières maraudes
<span class="pull-right"><a href="{% url 'maraudes:liste' %}" class="btn btn-primary btn-sm">Aller à la liste</a></span></p>
</div>
<div class="list-group">
{% for maraude in dernieres_maraudes %}
<a href="{% url 'maraudes:details' maraude.pk %}" class="list-group-item">
<strong>{{ maraude }}</strong> <small>{{maraude.binome}} & {{maraude.referent}}</small>
</a>
{% endfor %}
</div>
</div>
</div>{% endif %}

View File

@@ -12,6 +12,7 @@ from .models import ( Maraude, Maraudeur,
Rencontre, Lieu, Rencontre, Lieu,
Planning, ) Planning, )
from .compte_rendu import CompteRendu from .compte_rendu import CompteRendu
from notes.models import Note
# Forms # Forms
from django import forms from django import forms
from django.forms import inlineformset_factory, modelformset_factory, modelform_factory from django.forms import inlineformset_factory, modelformset_factory, modelform_factory
@@ -29,11 +30,7 @@ class MaraudesView(views.WebsiteProtectedMixin):
permissions = ['maraudes.view_maraudes'] permissions = ['maraudes.view_maraudes']
class IndexView(MaraudesView, generic.TemplateView): class DerniereMaraudeMixin(object):
header = "La Maraude"
header_small = "Tableau de bord"
template_name = "maraudes/index.html"
count = 5 count = 5
@cached_property @cached_property
def dernieres_maraudes(self): def dernieres_maraudes(self):
@@ -49,9 +46,16 @@ class IndexView(MaraudesView, generic.TemplateView):
context['dernieres_maraudes'] = self.dernieres_maraudes context['dernieres_maraudes'] = self.dernieres_maraudes
return context return context
class IndexView(MaraudesView, DerniereMaraudeMixin, generic.TemplateView):
header = "La Maraude"
header_small = "Tableau de bord"
template_name = "maraudes/index.html"
## MARAUDES ## MARAUDES
class MaraudeDetailsView(MaraudesView, generic.DetailView): class MaraudeDetailsView(MaraudesView, DerniereMaraudeMixin, generic.DetailView):
model = Maraude model = Maraude
context_object_name = "maraude" context_object_name = "maraude"
template_name = "maraudes/details.html" template_name = "maraudes/details.html"
@@ -62,6 +66,11 @@ class MaraudeDetailsView(MaraudesView, generic.DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['notes'] = Note.objects.get_queryset().filter(
created_date=self.object.date
).order_by(
'created_time'
)
context['compte_rendu'] = CompteRendu.objects.get(pk=self.object.pk) context['compte_rendu'] = CompteRendu.objects.get(pk=self.object.pk)
return context return context

9
notes/managers.py Normal file
View File

@@ -0,0 +1,9 @@
from django.db.models import Manager
class NoteManager(Manager):
def by_date(self):
return self.get_queryset().order_by('created_date')
def by_time(self):
return self.get_queryset().order_by('created_time')

View File

@@ -1,6 +1,8 @@
from django.db import models from django.db import models
from django.utils.html import format_html from django.utils.html import format_html
from . import managers
class Note(models.Model): class Note(models.Model):
""" Note relative à un sujet. """ Note relative à un sujet.
@@ -13,6 +15,8 @@ class Note(models.Model):
""" """
objects = managers.NoteManager()
sujet = models.ForeignKey( sujet = models.ForeignKey(
'sujets.Sujet', 'sujets.Sujet',
related_name="notes", related_name="notes",
@@ -25,11 +29,12 @@ class Note(models.Model):
null=True null=True
) )
created_date = models.DateField('Crée le', blank=True, null=True) created_date = models.DateField('Crée le', blank=True, null=True)
created_time = models.TimeField('Heure', blank=True, null=True)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.created_date: # Retrieve from child class instance child_instance = self.cast()
self.created_date = self.cast().get_date() self.created_date = child_instance.note_date()
self.created_time = child_instance.note_time()
return super().save(*args, **kwargs) return super().save(*args, **kwargs)
def _get_child_class_and_instance(self): def _get_child_class_and_instance(self):
@@ -68,7 +73,7 @@ class Note(models.Model):
setattr(self, setattr(self,
private_name, private_name,
# Call *child instance* method # Call *child instance* method
getattr(self.cast(), 'get_%s' % name)() getattr(self.cast(), 'note_%s' % name)()
) )
return getattr(self, private_name) return getattr(self, private_name)
return getter return getter

View File

@@ -3,7 +3,7 @@
<strong>{{header}}</strong> <small>{{small}}</small> <strong>{{header}}</strong> <small>{{small}}</small>
<span class="pull-right"> <span class="pull-right">
{% for label in labels %} {% for label in labels %}
<span class="label label-info">{{label}}</span> <span class="label label-{{bg_label_color}}">{{label}}</span>
{% endfor %}</span> {% endfor %}</span>
</th> </th>
</tr> </tr>

View File

@@ -5,10 +5,21 @@ from django import template
register = template.Library() register = template.Library()
@register.inclusion_tag("notes/table_inline.html") @register.inclusion_tag("notes/table_inline.html")
def inline_table(note): def inline_table(note, header=None):
bg_color, bg_label_color = note.bg_colors bg_color, bg_label_color = note.bg_colors
if not header:
header = "date"
if not header in ['sujet', 'date']:
raise ValueError('header must be "sujet" or "date"')
if header == "date":
header_field = "created_date"
elif header == "sujet":
header_field = "sujet"
return { return {
'header': note.created_date, 'header': getattr(note, header_field),
'small': note.child_class.__qualname__, 'small': note.child_class.__qualname__,
'bg_color': bg_color or "default", 'bg_color': bg_color or "default",
'bg_label_color': bg_label_color or "info", 'bg_label_color': bg_label_color or "info",

View File

@@ -1,8 +1,13 @@
{% load notes %} {% load notes %}
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-primary">
<div class="panel-heading"><h3 class="panel-title">Notes
<span class="pull-right"><span class="label">Total : {{ notes.count }}</span></span></h3>
</div>
<table class="table table-striped table-bordered"> <table class="table table-striped table-bordered">
{% for note in notes %} {% for note in notes %}
{% inline_table note %} {% inline_table note %}
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
</div>