add note form to maraudes dashboard, minor cleanups
This commit is contained in:
@@ -1,9 +1,8 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import *
|
from .models import Lieu, Rencontre, Maraude, Planning
|
||||||
from .notes import Observation
|
from .notes import Observation
|
||||||
|
|
||||||
|
|
||||||
# Basic registration
|
# Basic registration
|
||||||
admin.site.register(Lieu)
|
admin.site.register(Lieu)
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
|
import calendar
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import gettext
|
from django.utils.translation import gettext
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django_select2.forms import Select2Widget
|
from django_select2.forms import Select2Widget
|
||||||
from notes.forms import UserNoteForm, SimpleNoteForm
|
from notes.forms import UserNoteForm, SimpleNoteForm
|
||||||
from notes.models import Sujet, GENRE_CHOICES
|
from notes.models import Note, Sujet, GENRE_CHOICES
|
||||||
from .models import *
|
from .models import Maraude, Rencontre
|
||||||
from .notes import *
|
from .notes import Observation, Appel, Signalement
|
||||||
|
|
||||||
|
|
||||||
MONTHS = [
|
MONTHS = [
|
||||||
@@ -69,6 +70,12 @@ class MonthSelectForm(forms.Form):
|
|||||||
self.fields['year'].initial = year
|
self.fields['year'].initial = year
|
||||||
|
|
||||||
|
|
||||||
|
class NoteForm(UserNoteForm):
|
||||||
|
class Meta(UserNoteForm.Meta):
|
||||||
|
model = Note
|
||||||
|
fields = ['sujet', 'text']
|
||||||
|
|
||||||
|
|
||||||
class AppelForm(UserNoteForm):
|
class AppelForm(UserNoteForm):
|
||||||
class Meta(UserNoteForm.Meta):
|
class Meta(UserNoteForm.Meta):
|
||||||
model = Appel
|
model = Appel
|
||||||
|
|||||||
@@ -128,9 +128,6 @@ class Maraude(models.Model):
|
|||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Maraude"
|
verbose_name = "Maraude"
|
||||||
ordering = ['date']
|
ordering = ['date']
|
||||||
permissions = (
|
|
||||||
('view_maraudes', "Accès à l'application 'maraudes'"),
|
|
||||||
)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '%(dayname)s %(day)i %(month)s' % {
|
return '%(dayname)s %(day)i %(month)s' % {
|
||||||
@@ -141,9 +138,7 @@ class Maraude(models.Model):
|
|||||||
|
|
||||||
def est_terminee(self):
|
def est_terminee(self):
|
||||||
""" Indique si la maraude est considérée comme terminée """
|
""" Indique si la maraude est considérée comme terminée """
|
||||||
if self.heure_fin is not None:
|
return self.heure_fin is not None
|
||||||
return True
|
|
||||||
return False
|
|
||||||
est_terminee.admin_order_field = 'date'
|
est_terminee.admin_order_field = 'date'
|
||||||
est_terminee.boolean = True
|
est_terminee.boolean = True
|
||||||
est_terminee.short_description = 'Terminée ?'
|
est_terminee.short_description = 'Terminée ?'
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from notes.models import Note
|
from notes.models import Note
|
||||||
|
|
||||||
|
|
||||||
# Extends 'notes' module
|
# Extends 'notes' module
|
||||||
|
|
||||||
|
|
||||||
class Observation(Note):
|
class Observation(Note):
|
||||||
""" Note dans le cadre d'une rencontre """
|
""" Note dans le cadre d'une rencontre """
|
||||||
|
|
||||||
rencontre = models.ForeignKey('maraudes.Rencontre',
|
rencontre = models.ForeignKey(
|
||||||
models.CASCADE,
|
'maraudes.Rencontre',
|
||||||
related_name="observations")
|
models.CASCADE,
|
||||||
|
related_name="observations")
|
||||||
|
|
||||||
# Note attributes proxies
|
# Note attributes proxies
|
||||||
def note_author(self): return self.rencontre.maraude.referent
|
def note_author(self): return self.rencontre.maraude.referent
|
||||||
@@ -21,7 +20,7 @@ class Observation(Note):
|
|||||||
|
|
||||||
def note_labels(self): return [self.rencontre.lieu, self.rencontre.heure_debut]
|
def note_labels(self): return [self.rencontre.lieu, self.rencontre.heure_debut]
|
||||||
|
|
||||||
def note_bg_colors(self): return "info", "info"
|
def note_bg_colors(self): return "info", "dark"
|
||||||
|
|
||||||
|
|
||||||
class Appel(Note):
|
class Appel(Note):
|
||||||
@@ -37,7 +36,9 @@ class Appel(Note):
|
|||||||
|
|
||||||
class Signalement(Note):
|
class Signalement(Note):
|
||||||
|
|
||||||
source = models.ForeignKey("utilisateurs.Organisme", on_delete=models.CASCADE)
|
source = models.ForeignKey(
|
||||||
|
"utilisateurs.Organisme",
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
def note_labels(self):
|
def note_labels(self):
|
||||||
return [self.source, self.created_by]
|
return [self.source, self.created_by]
|
||||||
|
|||||||
@@ -93,7 +93,9 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body tab-content">
|
<div class="card-body tab-content">
|
||||||
<div class="tab-pane fade" id="noteNote"><div class="card card-body">Note</div></div>
|
<div class="tab-pane fade" id="noteNote" role="tabpanel">
|
||||||
|
{% include "notes/form_note_inner.html" with form=note_form %}
|
||||||
|
</div>
|
||||||
<div class="tab-pane fade show active" id="noteAppel" role="tabpanel">
|
<div class="tab-pane fade show active" id="noteAppel" role="tabpanel">
|
||||||
{% include "notes/form_appel_inner.html" with form=appel_form %}
|
{% include "notes/form_appel_inner.html" with form=appel_form %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
# Maraudes URLconf
|
# Maraudes URLconf
|
||||||
|
|
||||||
from django.conf.urls import url
|
from django.urls import path
|
||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
app_name = "maraudes"
|
app_name = "maraudes"
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', views.IndexView.as_view(), name="index"),
|
path('', views.IndexView.as_view(), name="index"),
|
||||||
url(r'^compte-rendu$', views.redirect_to_current_compterendu, name="cr-link"),
|
path('compte-rendu', views.redirect_to_current_compterendu, name="cr-link"),
|
||||||
url(r'^planning/$', views.PlanningView.as_view(), name="planning"),
|
path('planning/', views.PlanningView.as_view(), name="planning"),
|
||||||
url(r'^lieu/create/$', views.LieuCreateView.as_view(), name="lieu-create"),
|
path('lieu/create/', views.LieuCreateView.as_view(), name="lieu-create"),
|
||||||
url(r'^(?P<pk>[0-9]+)/create/$', views.CompteRenduCreateView.as_view(), name="create"),
|
path('<int:pk>/create/', views.CompteRenduCreateView.as_view(), name="create"),
|
||||||
url(r'^(?P<pk>[0-9]+)/finalize/$', views.FinalizeView.as_view(), name="finalize"),
|
path('<int:pk>/finalize/', views.FinalizeView.as_view(), name="finalize"),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from .notes import Signalement
|
|||||||
from .forms import (RencontreForm,
|
from .forms import (RencontreForm,
|
||||||
ObservationInlineFormSet,
|
ObservationInlineFormSet,
|
||||||
MaraudeHiddenDateForm, MonthSelectForm,
|
MaraudeHiddenDateForm, MonthSelectForm,
|
||||||
AppelForm, SignalementForm,
|
NoteForm, AppelForm, SignalementForm,
|
||||||
SendMailForm)
|
SendMailForm)
|
||||||
from notes.mixins import NoteFormMixin
|
from notes.mixins import NoteFormMixin
|
||||||
|
|
||||||
@@ -64,6 +64,7 @@ class IndexView(NoteFormMixin, MaraudeurMixin, generic.TemplateView):
|
|||||||
|
|
||||||
# NoteFormMixin
|
# NoteFormMixin
|
||||||
forms = {
|
forms = {
|
||||||
|
'note': NoteForm,
|
||||||
'appel': AppelForm,
|
'appel': AppelForm,
|
||||||
'signalement': SignalementForm,
|
'signalement': SignalementForm,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,10 @@
|
|||||||
{% bootstrap_field form.created_time size=sz form_group_class=grp_cls layout=layout %}
|
{% bootstrap_field form.created_time size=sz form_group_class=grp_cls layout=layout %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
</div>
|
</div>
|
||||||
{% bootstrap_field form.entrant size=sz%}
|
<div class="custom-control custom-checkbox">
|
||||||
|
<input type="checkbox" name="entrant" class="custom-control-input" id="id_entrant">
|
||||||
|
<label class="custom-control-label" for="id_entrant">Appel entrant ?</label>
|
||||||
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
{% bootstrap_field form.sujet show_label=False %}
|
{% bootstrap_field form.sujet show_label=False %}
|
||||||
{% bootstrap_field form.text show_label=False %}
|
{% bootstrap_field form.text show_label=False %}
|
||||||
|
|||||||
10
notes/templates/notes/form_note_inner.html
Normal file
10
notes/templates/notes/form_note_inner.html
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% load bootstrap4 %}
|
||||||
|
<form action="" method="POST">{% csrf_token %}
|
||||||
|
{% bootstrap_field form.sujet show_label=False %}
|
||||||
|
{% bootstrap_field form.text show_label=False %}
|
||||||
|
<div class="ml-auto">
|
||||||
|
{% bootstrap_button "Ajouter la note" button_type="submit" button_class="btn-primary btn-sm btn-block" %}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{{ form.media.js }}{{ form.media.css }}
|
||||||
|
|
||||||
6
urls.py
6
urls.py
@@ -1,8 +1,8 @@
|
|||||||
from django.conf.urls import url, include
|
from django.urls import path, include
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from website import urls as website_urls
|
from website import urls as website_urls
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
url(r'^', include(website_urls)),
|
path('', include(website_urls)),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ else:
|
|||||||
try:
|
try:
|
||||||
assert(isinstance(settings.MARAUDEURS.get('organisme'), dict))
|
assert(isinstance(settings.MARAUDEURS.get('organisme'), dict))
|
||||||
except:
|
except:
|
||||||
raise ImproperlyConfigured("'organisme' key of MARAUDEURS settings is not a dict !")
|
raise ImproperlyConfigured(
|
||||||
|
"'organisme' key of MARAUDEURS settings is not a dict !")
|
||||||
|
|
||||||
|
|
||||||
def get_email_suffix(organisme):
|
def get_email_suffix(organisme):
|
||||||
@@ -25,7 +26,6 @@ def get_email_suffix(organisme):
|
|||||||
return organisme.email.split("@")[1]
|
return organisme.email.split("@")[1]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Organisme(models.Model):
|
class Organisme(models.Model):
|
||||||
""" Organisme : Association, Entreprise, Service public, ..."""
|
""" Organisme : Association, Entreprise, Service public, ..."""
|
||||||
|
|
||||||
@@ -43,10 +43,10 @@ class Organisme(models.Model):
|
|||||||
|
|
||||||
class Professionnel(User):
|
class Professionnel(User):
|
||||||
""" Professionnel d'un organisme """
|
""" Professionnel d'un organisme """
|
||||||
organisme = models.ForeignKey(Organisme,
|
organisme = models.ForeignKey(
|
||||||
models.CASCADE,
|
Organisme,
|
||||||
related_name="professionnels",
|
on_delete=models.CASCADE,
|
||||||
)
|
related_name="professionnels")
|
||||||
|
|
||||||
def make_username(self):
|
def make_username(self):
|
||||||
""" Build the username for this Professionel instance. Must be overriden."""
|
""" Build the username for this Professionel instance. Must be overriden."""
|
||||||
|
|||||||
Reference in New Issue
Block a user