added SignalementForm, updated NoteFormMixin, various fixes
This commit is contained in:
@@ -2,7 +2,6 @@ from .models import Note
|
|||||||
from utilisateurs.models import Professionnel
|
from utilisateurs.models import Professionnel
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.utils import timezone
|
|
||||||
from django_select2.forms import Select2Widget
|
from django_select2.forms import Select2Widget
|
||||||
from django.forms import Textarea
|
from django.forms import Textarea
|
||||||
|
|
||||||
@@ -33,7 +32,8 @@ class SimpleNoteForm(forms.ModelForm):
|
|||||||
|
|
||||||
class UserNoteForm(NoteForm):
|
class UserNoteForm(NoteForm):
|
||||||
""" Form that sets 'created_by' with current user id.
|
""" Form that sets 'created_by' with current user id.
|
||||||
This requires 'request' object at initialization
|
|
||||||
|
It requires 'request' object at initialization
|
||||||
"""
|
"""
|
||||||
class Meta(NoteForm.Meta):
|
class Meta(NoteForm.Meta):
|
||||||
fields = ['sujet', 'text', 'created_date', 'created_time']
|
fields = ['sujet', 'text', 'created_date', 'created_time']
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
from django.views.generic.edit import FormMixin, ProcessFormView
|
from django.views.generic.edit import FormMixin
|
||||||
from django.shortcuts import redirect
|
|
||||||
|
|
||||||
from .forms import *
|
from .forms import *
|
||||||
|
|
||||||
@@ -7,24 +6,37 @@ class NoteFormMixin(FormMixin):
|
|||||||
|
|
||||||
form_class = None
|
form_class = None
|
||||||
|
|
||||||
def get_form(self):
|
forms = None
|
||||||
|
|
||||||
|
def get_form(self, prefix, form_class=None):
|
||||||
# Should add test to ensure this instance class is
|
# Should add test to ensure this instance class is
|
||||||
# has SingleObjectMixin set with Sujet model ??
|
# has SingleObjectMixin set with Sujet model ??
|
||||||
kwargs = self.get_form_kwargs()
|
kwargs = self.get_form_kwargs()
|
||||||
return self.form_class(
|
kwargs['prefix'] = prefix
|
||||||
|
if not form_class:
|
||||||
|
form_class = self.forms[prefix]
|
||||||
|
try:
|
||||||
|
form = form_class(
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
except TypeError: #Forms that requires request
|
||||||
|
form = form_class(
|
||||||
self.request,
|
self.request,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
|
return form
|
||||||
|
|
||||||
def post(self, request, **kwargs):
|
def post(self, request, **kwargs):
|
||||||
form = self.get_form()
|
for prefix in self.forms.keys():
|
||||||
|
form = self.get_form(prefix)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
form.save()
|
||||||
return self.form_valid(form)
|
return self.form_valid(form)
|
||||||
return self.form_invalid(form)
|
return self.form_invalid(form)
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super(FormMixin, self).get_context_data(**kwargs)
|
||||||
context['note_form'] = self.get_form()
|
for prefix in self.forms.keys():
|
||||||
|
context['%s_form' % prefix] = self.get_form(prefix)
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|||||||
@@ -49,11 +49,11 @@ class Note(models.Model):
|
|||||||
|
|
||||||
def note_date(self):
|
def note_date(self):
|
||||||
""" Default 'created_date' value. Child may override this method. """
|
""" Default 'created_date' value. Child may override this method. """
|
||||||
return timezone.now().date()
|
return timezone.localtime(timezone.now()).date()
|
||||||
|
|
||||||
def note_time(self):
|
def note_time(self):
|
||||||
""" Default 'created_time' value. Child may override this method. """
|
""" Default 'created_time' value. Child may override this method. """
|
||||||
return timezone.now().time()
|
return timezone.localtime(timezone.now()).time()
|
||||||
|
|
||||||
def note_bg_colors(self):
|
def note_bg_colors(self):
|
||||||
""" Returns (header background color, labels color).
|
""" Returns (header background color, labels color).
|
||||||
|
|||||||
@@ -1,10 +1,40 @@
|
|||||||
from .notes import *
|
from .notes import *
|
||||||
from notes.forms import *
|
from notes.forms import *
|
||||||
|
from sujets.models import Sujet, GENRE_CHOICES
|
||||||
from django.utils import timezone
|
from django import forms
|
||||||
|
|
||||||
class AppelForm(UserNoteForm):
|
class AppelForm(UserNoteForm):
|
||||||
|
|
||||||
class Meta(UserNoteForm.Meta):
|
class Meta(UserNoteForm.Meta):
|
||||||
model = Appel
|
model = Appel
|
||||||
fields = ['sujet', 'text', 'entrant', 'created_date', 'created_time']
|
fields = ['sujet', 'text', 'entrant', 'created_date', 'created_time']
|
||||||
|
|
||||||
|
class SignalementForm(UserNoteForm):
|
||||||
|
|
||||||
|
nom = forms.CharField(64, required=False)
|
||||||
|
prenom = forms.CharField(64, required=False)
|
||||||
|
age = forms.IntegerField(required=False)
|
||||||
|
genre = forms.ChoiceField(choices=GENRE_CHOICES)
|
||||||
|
|
||||||
|
class Meta(UserNoteForm.Meta):
|
||||||
|
model = Signalement
|
||||||
|
fields = ['text', 'source', 'created_date', 'created_time']
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
super().clean()
|
||||||
|
if not self.cleaned_data['nom'] and not self.cleaned_data['prenom']:
|
||||||
|
self.add_error('nom', '')
|
||||||
|
self.add_error('prenom', '')
|
||||||
|
raise forms.ValidationError("Entrez au moins un nom ou prénom")
|
||||||
|
|
||||||
|
def save(self, commit=True):
|
||||||
|
sujet = Sujet.objects.create(
|
||||||
|
nom=self.cleaned_data['nom'],
|
||||||
|
prenom=self.cleaned_data['prenom'],
|
||||||
|
genre=self.cleaned_data['genre'],
|
||||||
|
age=self.cleaned_data['age']
|
||||||
|
)
|
||||||
|
instance = super().save(commit=False)
|
||||||
|
instance.sujet = sujet
|
||||||
|
if commit:
|
||||||
|
instance.save()
|
||||||
|
return instance
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ class Appel(Note):
|
|||||||
|
|
||||||
class Signalement(Note):
|
class Signalement(Note):
|
||||||
|
|
||||||
source = models.CharField('Source', max_length=128)
|
source = models.ForeignKey("utilisateurs.Organisme")
|
||||||
|
|
||||||
def note_labels(self): return [self.source]
|
def note_labels(self): return [self.source, self.created_by]
|
||||||
def note_bg_colors(self): return ('warning', 'alert')
|
def note_bg_colors(self): return ('warning', 'info')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
<div class="panel panel-primary">
|
<div class="panel panel-primary">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<h4 class="panel-title">Enregistrer un appel</h4>
|
<h4 class="panel-title">Enregistrer un appel</h4>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
|
{{ form.media.js }}{{ form.media.css }}
|
||||||
<form action="" method="POST">{% csrf_token %}
|
<form action="" method="POST">{% csrf_token %}
|
||||||
{% with "inline" as layout %}
|
{% with "inline" as layout %}
|
||||||
<div class="form-group form-{{layout}} well col-md-10 col-md-offset-2">
|
<div class="form-group form-{{layout}} well col-md-10 col-md-offset-2">
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
<div class="col-md-6 col-md-offset-6">
|
<div class="col-md-6">
|
||||||
{% include "suivi/appel_form.html" %}
|
{% include "suivi/signalement_form.html" with form=signalement_form %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
{% include "suivi/appel_form.html" with form=appel_form %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
<li class="dropdown app-menu"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Sujets<b class="caret"></b></a>
|
<li class="app-menu">
|
||||||
<ul class="dropdown-menu">
|
<a href="{% url 'sujets:liste' %}">Liste des sujets
|
||||||
<li><a href="{% url 'sujets:liste' %}">{% bootstrap_icon "list" %} Liste complète</a></li>
|
<span class="pull-right">{% bootstrap_icon "list" %}</span></a>
|
||||||
|
</li>
|
||||||
{% if user.is_superuser %}{% load bootstrap3 %}
|
{% if user.is_superuser %}{% load bootstrap3 %}
|
||||||
<li class="dropdown-header">Administration</li>
|
<li class="dropdown app-menu">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
Administration <b class="caret"></b>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
<li><a href="{% url 'sujets:create' %}">{% bootstrap_icon "plus" %} Nouveau sujet</a></li>
|
<li><a href="{% url 'sujets:create' %}">{% bootstrap_icon "plus" %} Nouveau sujet</a></li>
|
||||||
<li><a href="{% url 'admin:app_list' app_label='sujets' %}">
|
<li><a href="{% url 'admin:app_list' app_label='sujets' %}">
|
||||||
{% bootstrap_icon "wrench" %} Gérer les sujets</a></li>
|
{% bootstrap_icon "wrench" %} Gérer les sujets</a></li>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from django.shortcuts import render, reverse
|
from django.shortcuts import render, reverse
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from sujets.models import Sujet
|
from sujets.models import Sujet
|
||||||
from .forms import *
|
from .forms import *
|
||||||
@@ -22,13 +23,16 @@ class IndexView(NoteFormMixin, generic.TemplateView):
|
|||||||
header = "Suivi"
|
header = "Suivi"
|
||||||
header_small = "Tableau de bord"
|
header_small = "Tableau de bord"
|
||||||
#NoteFormMixin
|
#NoteFormMixin
|
||||||
form_class = AppelForm
|
forms = {
|
||||||
|
'appel': AppelForm,
|
||||||
|
'signalement': SignalementForm,
|
||||||
|
}
|
||||||
success_url = "/suivi/"
|
success_url = "/suivi/"
|
||||||
#FormView
|
#FormView
|
||||||
template_name = "suivi/index.html"
|
template_name = "suivi/index.html"
|
||||||
def get_initial(self):
|
def get_initial(self):
|
||||||
return {'created_date': timezone.now().date(),
|
return {'created_date': timezone.localtime(timezone.now()).date(),
|
||||||
'created_time': timezone.now().time()}
|
'created_time': timezone.localtime(timezone.now()).time()}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -40,7 +44,9 @@ class SuiviSujetView(NoteFormMixin, generic.DetailView):
|
|||||||
header = "{{sujet}}"
|
header = "{{sujet}}"
|
||||||
header_small = "suivi"
|
header_small = "suivi"
|
||||||
#NoteFormMixin
|
#NoteFormMixin
|
||||||
form_class = AutoNoteForm
|
forms = {
|
||||||
|
'note': AutoNoteForm,
|
||||||
|
}
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
return reverse('suivi:details', kwargs={'pk': self.get_object().pk})
|
return reverse('suivi:details', kwargs={'pk': self.get_object().pk})
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
|
|||||||
@@ -53,6 +53,13 @@ RESSOURCES_CHOICES = (
|
|||||||
# - Personne
|
# - Personne
|
||||||
# - Sujet
|
# - Sujet
|
||||||
|
|
||||||
|
HOMME = 'M'
|
||||||
|
FEMME = 'Mme'
|
||||||
|
GENRE_CHOICES = (
|
||||||
|
(HOMME, 'Homme'),
|
||||||
|
(FEMME, 'Femme'),
|
||||||
|
)
|
||||||
|
|
||||||
class Personne(models.Model):
|
class Personne(models.Model):
|
||||||
""" Modèle de base d'une personne
|
""" Modèle de base d'une personne
|
||||||
- genre
|
- genre
|
||||||
@@ -60,12 +67,6 @@ class Personne(models.Model):
|
|||||||
- prénom
|
- prénom
|
||||||
"""
|
"""
|
||||||
|
|
||||||
HOMME = 'M'
|
|
||||||
FEMME = 'Mme'
|
|
||||||
GENRE_CHOICES = (
|
|
||||||
(HOMME, 'Homme'),
|
|
||||||
(FEMME, 'Femme'),
|
|
||||||
)
|
|
||||||
genre = models.CharField(max_length=3,
|
genre = models.CharField(max_length=3,
|
||||||
choices=GENRE_CHOICES,
|
choices=GENRE_CHOICES,
|
||||||
default=HOMME)
|
default=HOMME)
|
||||||
|
|||||||
@@ -18,3 +18,7 @@ class MaraudeurAdmin(admin.ModelAdmin):
|
|||||||
@admin.register(ReferentMaraude)
|
@admin.register(ReferentMaraude)
|
||||||
class ReferentMaraudeAdmin(admin.ModelAdmin):
|
class ReferentMaraudeAdmin(admin.ModelAdmin):
|
||||||
fields = ['maraudeur']
|
fields = ['maraudeur']
|
||||||
|
|
||||||
|
@admin.register(Organisme)
|
||||||
|
class OrganismeAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ class Organisme(models.Model):
|
|||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Organisme"
|
verbose_name = "Organisme"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.nom
|
||||||
|
|
||||||
class Professionnel(User):
|
class Professionnel(User):
|
||||||
""" Professionnel d'un organisme """
|
""" Professionnel d'un organisme """
|
||||||
|
|||||||
Reference in New Issue
Block a user