From 57c120afbbfc30b854fa7b7c13f101cb81dbc412 Mon Sep 17 00:00:00 2001 From: Arthur Gerbaud Date: Wed, 17 Aug 2016 15:42:13 +0200 Subject: [PATCH] added set of Note forms, fixed new note on 'suivi:details' view --- maraudes/forms.py | 12 ++------ maraudes/views.py | 2 +- notes/forms.py | 75 ++++++++++++++++++++++++++++++----------------- notes/mixins.py | 31 ++++++++++---------- suivi/views.py | 10 ++++--- 5 files changed, 73 insertions(+), 57 deletions(-) diff --git a/maraudes/forms.py b/maraudes/forms.py index a7b8a3f..42c5903 100644 --- a/maraudes/forms.py +++ b/maraudes/forms.py @@ -1,6 +1,6 @@ from django import forms from django.forms import inlineformset_factory -from notes.forms import NoteForm +from notes.forms import SimpleNoteForm # Models from .models import Maraude, Rencontre from .notes import Observation, Signalement @@ -24,15 +24,9 @@ class RencontreForm(forms.ModelForm): fields = ['lieu', 'heure_debut', 'duree'] -class SignalementForm(NoteForm): - - class Meta: - model = Signalement - fields = ['source', 'created_date', 'created_time', 'sujet', 'text'] - ObservationInlineFormSet = inlineformset_factory( Rencontre, Observation, - form=NoteForm, + form=SimpleNoteForm, extra = 1, ) @@ -44,7 +38,7 @@ RencontreInlineFormSet = inlineformset_factory( ObservationInlineFormSetNoExtra = inlineformset_factory( Rencontre, Observation, - form = NoteForm, + form = SimpleNoteForm, extra = 0 ) diff --git a/maraudes/views.py b/maraudes/views.py index 25e1717..2a1fbe5 100644 --- a/maraudes/views.py +++ b/maraudes/views.py @@ -18,7 +18,7 @@ from django import forms from django.forms import inlineformset_factory, modelformset_factory, modelform_factory from django.forms.extras import widgets from django_select2.forms import Select2Widget -from .forms import ( RencontreForm, RencontreInlineFormSet, SignalementForm, +from .forms import ( RencontreForm, RencontreInlineFormSet, ObservationInlineFormSet, ObservationInlineFormSetNoExtra, MaraudeAutoDateForm, MonthSelectForm, ) diff --git a/notes/forms.py b/notes/forms.py index 68ebb48..e983e60 100644 --- a/notes/forms.py +++ b/notes/forms.py @@ -1,66 +1,87 @@ from .models import Note +from utilisateurs.models import Professionnel + from django import forms from django.utils import timezone from django_select2.forms import Select2Widget from django.forms import Textarea -class NoteForm(forms.ModelForm): + +class NoteForm(forms.ModelForm): + """ Generic Note form """ class Meta: model = Note - fields = ['sujet', 'text'] + fields = ['sujet', 'text', 'created_by', 'created_date', 'created_time'] widgets = { 'sujet': Select2Widget(), 'text': Textarea(attrs={'rows':4}), } - def save(self, *args, **kwargs): - # Get data for extra fields of Note - - return super().save(*args, **kwargs) -class UserNoteForm(forms.ModelForm): +class SimpleNoteForm(forms.ModelForm): + """ Simple note with only 'sujet' and 'text' fields. - class Meta: - model = Note + Usefull with children of 'Note' that defines all 'note_*' + special methods. + """ + class Meta(NoteForm.Meta): + fields = ['sujet', 'text'] + + + +class UserNoteForm(NoteForm): + """ Form that sets 'created_by' with current user id. + This requires 'request' object at initialization + """ + class Meta(NoteForm.Meta): fields = ['sujet', 'text', 'created_date', 'created_time'] - def __init__(self, *args, **kwargs): + def __init__(self, request, **kwargs): + args = [] + if request.POST: + args += (request.POST, request.FILES) super().__init__(*args, **kwargs) + try: + self.author = Professionnel.objects.get(pk=request.user.pk) + except Professionnel.DoesNotExist: + msg = "%s should not have been initiated with '%s' user" % (self, request.user) + raise RuntimeError(msg) def save(self, commit=True): instance = super().save(commit=False) - instance.created_by = None #TODO: Get user with needed Class + instance.created_by = self.author if commit: instance.save() return instance -class NoteAutoDateForm(UserNoteForm): +class UserAutoDateNoteForm(UserNoteForm): + """ Form that automatically sets 'date' and 'time' to save time """ class Meta(UserNoteForm.Meta): - model = Note - fields = ['text'] - widgets = { - 'text': Textarea(attrs={'rows':4, 'placeholder': "Texte"}), - } - - def __init__(self, request, **kwargs): - self.sujet = kwargs.pop('sujet') - self.pk = kwargs.pop('pk') - self.user = request.user - args = [] - if request.POST: - args = (request.POST, request.FILES) - super().__init__(*args) + fields = ['sujet', 'text'] def save(self, commit=True): instance = super().save(commit=False) - instance.sujet = self.sujet instance.created_date = timezone.now().date() instance.created_time = timezone.now().time() if commit: instance.save() return instance +class AutoNoteForm(UserAutoDateNoteForm): + class Meta(UserAutoDateNoteForm.Meta): + fields = ['text'] + def __init__(self, request, **kwargs): + self.sujet = kwargs.pop('sujet') + super().__init__(request, **kwargs) + + def save(self, commit=True): + print('Saving : ', self, 'with', self.sujet) + inst = super().save(commit=False) + inst.sujet = self.sujet + if commit: + inst.save() + return inst diff --git a/notes/mixins.py b/notes/mixins.py index e986336..1622a39 100644 --- a/notes/mixins.py +++ b/notes/mixins.py @@ -1,33 +1,32 @@ +from django.views.generic.edit import FormMixin, ProcessFormView +from django.shortcuts import redirect -from .forms import NoteAutoDateForm +from .forms import * -class NoteFormMixin(object): +class SujetNoteFormMixin(object): - form = None - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.form_class = NoteAutoDateForm + form_class = AutoNoteForm + def get_form(self, request, **kwargs): + # Should add test to ensure this instance class is + # has SingleObjectMixin set with Sujet model ?? + return self.form_class( + self.request, + sujet=self.get_object() + ) def dispatch(self, request, **kwargs): - self.form = self.get_form(request, **kwargs) + self.form = self.get_form(request) return super().dispatch(request, **kwargs) def post(self, request, **kwargs): - print('post:', self.form) if self.form.is_valid(): self.form.save() + return redirect(self.get_success_url()) return self.get(request, **kwargs) - def get_form(self, request, **kwargs): - kwargs['sujet'] = self.get_object() - return NoteAutoDateForm( - request, - **kwargs - ) - def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['note_form'] = self.form return context + diff --git a/suivi/views.py b/suivi/views.py index a3d207e..d7bab5c 100644 --- a/suivi/views.py +++ b/suivi/views.py @@ -1,4 +1,4 @@ -from django.shortcuts import render +from django.shortcuts import render, reverse from django.views import generic from website import decorators as website @@ -25,10 +25,10 @@ class IndexView(generic.TemplateView): template_name = "suivi/index.html" -from notes.mixins import NoteFormMixin +from notes.mixins import SujetNoteFormMixin @webpage -class SuiviSujetView(NoteFormMixin, generic.DetailView): +class SuiviSujetView(SujetNoteFormMixin, generic.DetailView): class PageInfo: title = "Sujet - {{sujet}}" header = "{{sujet}}" @@ -39,7 +39,9 @@ class SuiviSujetView(NoteFormMixin, generic.DetailView): context_object_name = "sujet" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.app_menu.insert(0, "sujets/menu_sujet.html") + self.insert_menu("sujets/menu_sujet.html") + def get_success_url(self): + return reverse('suivi:details', kwargs={'pk': self.get_object().pk}) def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) context['notes'] = self.object.notes.by_date(reverse=True)