diff --git a/maraudes/notes.py b/maraudes/notes.py
index 598532b..9da364f 100644
--- a/maraudes/notes.py
+++ b/maraudes/notes.py
@@ -20,7 +20,15 @@ class Observation(Note):
def __str__(self):
return "%s" % self.sujet
- def save(self, *args, **kwargs):
- if not self.created_date:
- self.created_date = self.rencontre.date
- return super().save(*args, **kwargs)
+ def get_date(self):
+ """ Enforce value of created_date """
+ return self.rencontre.date
+
+ def get_labels(self):
+ return [self.rencontre.lieu, self.rencontre.heure_debut]
+
+ def get_bg_colors(self):
+ return ("success", "info")
+
+
+
diff --git a/notes/models.py b/notes/models.py
index 6e150a6..44a165b 100644
--- a/notes/models.py
+++ b/notes/models.py
@@ -3,6 +3,15 @@ from django.utils.html import format_html
class Note(models.Model):
""" Note relative à un sujet.
+
+ Peut être utilisée comme classe parente.
+ Il faut alors définir les méthodes :
+ - get_header, get_small
+ - get_date
+ - get_labels
+ - get_bg_color
+ Les valeurs retournée sont utilisée par les templatetages 'notes'
+
"""
sujet = models.ForeignKey(
@@ -18,33 +27,15 @@ class Note(models.Model):
)
created_date = models.DateField('Crée le', blank=True, null=True)
- def as_table(self):
- html = format_html(
-"
| {} {}\
-{} | \
-\n
|---|
| {} |
",
- self.sujet,
- self.created_date,
- self.created_by,
- self.text
- )
- return html
- def as_inline_table(self):
- html = format_html(
-"| {} {} \n\
-{} | \n\
-
|---|
| {} |
",
- self.subclass.__qualname__,
- self.created_date,
- self.created_by,
- self.text
- )
- return html
+ def save(self, *args, **kwargs):
+ if not self.created_date: # Retrieve from child class instance
+ self.created_date = self.cast().get_date()
+ return super().save(*args, **kwargs)
def _get_child_and_subclass(self):
- self._child_instance = None
- self._subclass = None
+ self._child_instance = self
+ self._subclass = self.__class__
for f in self._meta.get_fields():
if f.is_relation and f.one_to_one:
self._child_instance = getattr(self, f.name)
@@ -64,3 +55,26 @@ class Note(models.Model):
def __str__(self):
return "%s of %s" % (self.subclass.__qualname__, self.created_by)
+
+ ## Attributes used by 'notes' template tags
+ # bg_color : background color of header
+ # labels : list of strings to put in labels
+ def cached_attr(name):
+ """ Cached property set on return value of 'get_ATTR' method on
+ child instance.
+ """
+ private_name = '_%s' % name
+ def getter(self):
+ if not hasattr(self, private_name):
+ setattr(self,
+ private_name,
+ # Call *child instance* method
+ getattr(self.cast(), 'get_%s' % name)()
+ )
+ return getattr(self, private_name)
+ return getter
+
+ bg_colors = property( cached_attr('bg_colors'),
+ doc="background color of header")
+ labels = property( cached_attr('labels'),
+ doc="list of string to display as labels")
diff --git a/notes/templatetags/notes.py b/notes/templatetags/notes.py
new file mode 100644
index 0000000..cb08999
--- /dev/null
+++ b/notes/templatetags/notes.py
@@ -0,0 +1,17 @@
+from notes.models import Note
+
+from django import template
+
+register = template.Library()
+
+@register.inclusion_tag("notes/table_inline.html")
+def inline_table(note):
+ bg_color, bg_label_color = note.bg_colors
+ return {
+ 'header': note.created_date,
+ 'small': note.subclass.__qualname__,
+ 'bg_color': bg_color or "default",
+ 'bg_label_color': bg_label_color or "info",
+ 'labels': note.labels,
+ 'text': note.text,
+ }