better integration of notes, templates clean up
This commit is contained in:
@@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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' %}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
16
maraudes/templates/maraudes/panel_dernieres_maraudes.html
Normal file
16
maraudes/templates/maraudes/panel_dernieres_maraudes.html
Normal 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 %}
|
||||||
@@ -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
9
notes/managers.py
Normal 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')
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user