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, + }