added set of Note forms, fixed new note on 'suivi:details' view

This commit is contained in:
Arthur Gerbaud
2016-08-17 15:42:13 +02:00
parent 91079e1358
commit 57c120afbb
5 changed files with 73 additions and 57 deletions

View File

@@ -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
)

View File

@@ -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, )

View File

@@ -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

View File

@@ -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

View File

@@ -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)