Navbar (#31)
* started workin on 'navbar' module * changed bootstrap theme to bootswatch/Simplex * big work on navbar logic * starting creating menus using navbar * converted app views to new Wepage decorator, updated navbar * reimplemented DernieresMaraudes as a dropdown instead of ContextMixin * reorganised static files, minor code cleanups * turned Link.href into lazy-evaluated property * collapsed 'navbar' module into 'website', dynamic building of ApplicationMenu subclasses * minor cleanup * blah blah blah * added way to add admin/non-admin links * minor style change : red border for active page instead of all dropdowns * deleted file * prepare adding removing menu templates files, being replaced by code * essayé de généraliser le code pour les modaux bootstrap, non testé git status * more preparation and thinking on navbar app_menus logic... * added LinkManager and DropdownManager, getting closer... * small fix in DropdownManager.__get__ * boosted up work: keep it simple so it can be merged fast, major layout changes * added month filter on maraudes:liste * added 'as_icon' filter to display boolean/null values as bootstrap icons * remove inactive user from planning selection * removed all unused 'menu' templates * set up django_select2 to use static files * small fix after review
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
import datetime
|
||||
import calendar
|
||||
from django.utils import timezone
|
||||
from django.utils.functional import cached_property
|
||||
from django.contrib import messages
|
||||
from django.shortcuts import render, redirect
|
||||
# Views
|
||||
@@ -22,56 +21,14 @@ from .forms import ( RencontreForm, RencontreInlineFormSet,
|
||||
ObservationInlineFormSet, ObservationInlineFormSetNoExtra,
|
||||
MaraudeAutoDateForm, MonthSelectForm, )
|
||||
|
||||
from utilisateurs.models import Maraudeur
|
||||
|
||||
from website import decorators as website
|
||||
maraudes = website.app_config(
|
||||
name="maraudes",
|
||||
groups=[Maraudeur],
|
||||
menu=["maraudes/menu/dernieres_maraudes.html"],
|
||||
admin_menu=["maraudes/menu/admin_menu.html"],
|
||||
ajax=False,
|
||||
)
|
||||
compte_rendu = website.app_config(
|
||||
name="maraudes",
|
||||
groups=[Maraudeur],
|
||||
menu=["compte_rendu/menu/creation.html"],
|
||||
ajax=False,
|
||||
)
|
||||
maraudes_ajax = website.app_config(
|
||||
name="maraudes",
|
||||
groups=[Maraudeur],
|
||||
ajax=True,
|
||||
)
|
||||
|
||||
from django.core.mail import send_mail
|
||||
|
||||
class DerniereMaraudeMixin(object):
|
||||
count = 5
|
||||
@cached_property
|
||||
def dernieres_maraudes(self):
|
||||
""" Renvoie la liste des 'Maraude' passées et terminées """
|
||||
return Maraude.objects.get_past().filter(
|
||||
heure_fin__isnull=False
|
||||
).order_by(
|
||||
'-date'
|
||||
)[:self.count]
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['dernieres_maraudes'] = self.dernieres_maraudes
|
||||
return context
|
||||
from .apps import maraudes
|
||||
|
||||
|
||||
@maraudes.using(title=('La Maraude', 'Tableau de bord'))
|
||||
class IndexView(generic.TemplateView):
|
||||
|
||||
@maraudes
|
||||
class IndexView(DerniereMaraudeMixin, generic.TemplateView):
|
||||
|
||||
class PageInfo:
|
||||
title = "Maraude - Tableau de bord"
|
||||
header = "La Maraude"
|
||||
header_small = "Tableau de bord"
|
||||
# TemplateView
|
||||
template_name = "maraudes/index.html"
|
||||
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
@@ -101,48 +58,44 @@ class IndexView(DerniereMaraudeMixin, generic.TemplateView):
|
||||
return Maraude.objects.next
|
||||
|
||||
## MARAUDES
|
||||
@maraudes
|
||||
class MaraudeDetailsView(DerniereMaraudeMixin, generic.DetailView):
|
||||
@maraudes.using(title=('{{maraude.date}}', 'compte-rendu'))
|
||||
class MaraudeDetailsView(generic.DetailView):
|
||||
""" Vue détaillé d'un compte-rendu de maraude """
|
||||
|
||||
model = CompteRendu
|
||||
context_object_name = "maraude"
|
||||
template_name = "maraudes/details.html"
|
||||
|
||||
# Template
|
||||
class PageInfo:
|
||||
title = "Maraude - {{maraude.date}}"
|
||||
header = "{{maraude.date}}"
|
||||
header_small = "{{maraude.referent}} & {{maraude.binome}}"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['notes'] = self.object.get_observations()
|
||||
return context
|
||||
|
||||
|
||||
|
||||
@maraudes
|
||||
class MaraudeListView(DerniereMaraudeMixin, generic.ListView):
|
||||
@maraudes.using(title=('Liste des maraudes',))
|
||||
class MaraudeListView(generic.ListView):
|
||||
""" Vue de la liste des compte-rendus de maraude """
|
||||
|
||||
model = CompteRendu
|
||||
template_name = "maraudes/liste.html"
|
||||
paginate_by = 30
|
||||
|
||||
class PageInfo:
|
||||
title = "Maraude - Liste des maraudes"
|
||||
header = "Liste des maraudes"
|
||||
|
||||
def get_queryset(self):
|
||||
today = datetime.date.today()
|
||||
return super().get_queryset().filter(
|
||||
date__lte=timezone.localtime(timezone.now()).date()
|
||||
current_date = timezone.localtime(timezone.now()).date()
|
||||
qs = super().get_queryset().filter(
|
||||
date__lte=current_date
|
||||
).order_by('-date')
|
||||
|
||||
filtre = self.request.GET.get('filter', None)
|
||||
if filtre == "month-only":
|
||||
return qs.filter(date__month=current_date.month)
|
||||
#Other cases...
|
||||
else:
|
||||
return qs
|
||||
|
||||
|
||||
## COMPTE-RENDU DE MARAUDE
|
||||
@compte_rendu
|
||||
@maraudes.using(title=('{{maraude.date}}', 'rédaction'))
|
||||
class CompteRenduCreateView(generic.DetailView):
|
||||
""" Vue pour la création d'un compte-rendu de maraude """
|
||||
|
||||
@@ -153,11 +106,6 @@ class CompteRenduCreateView(generic.DetailView):
|
||||
form = None
|
||||
inline_formset = None
|
||||
|
||||
class PageInfo:
|
||||
title = "{{maraude}} - Compte-rendu"
|
||||
header = "{{maraude.date}}"
|
||||
header_small = "écriture du compte-rendu"
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
#WARNING: Overrides app_menu and replace it
|
||||
@@ -180,11 +128,8 @@ class CompteRenduCreateView(generic.DetailView):
|
||||
# Add text to some mails ? Transmission, message à un référent, etc...
|
||||
# Send mail to Maraudeurs
|
||||
_from = maraude.referent.email
|
||||
exclude = (maraude.referent, maraude.binome)
|
||||
recipients = []
|
||||
for m in Maraudeur.objects.all():
|
||||
if not m in exclude:
|
||||
recipients.append(m.email)
|
||||
# Shall select only Maraudeur where 'is_active' is True !
|
||||
recipients = [m for m in Maraudeur.objects.all() if m not in (maraude.referent, maraude.binome)]
|
||||
objet = "Compte-rendu de maraude : %s" % maraude.date
|
||||
message = "Sujets rencontrés : ..." #TODO: Mail content
|
||||
send_mail(objet, message, _from, recipients)
|
||||
@@ -245,7 +190,7 @@ class CompteRenduCreateView(generic.DetailView):
|
||||
|
||||
|
||||
|
||||
@compte_rendu
|
||||
@maraudes.using(title=('{{maraude.date}}', 'mise à jour'))
|
||||
class CompteRenduUpdateView(generic.DetailView):
|
||||
""" Vue pour mettre à jour le compte-rendu de la maraude """
|
||||
|
||||
@@ -253,11 +198,6 @@ class CompteRenduUpdateView(generic.DetailView):
|
||||
context_object_name = "maraude"
|
||||
template_name = "compte_rendu/compterendu_update.html"
|
||||
|
||||
class PageInfo:
|
||||
title = "{{maraude}} - Compte-rendu"
|
||||
header = "{{maraude.date}}"
|
||||
header_small = "compte-rendu"
|
||||
|
||||
base_formset = None
|
||||
inline_formsets = []
|
||||
rencontres_queryset = None
|
||||
@@ -311,17 +251,12 @@ class CompteRenduUpdateView(generic.DetailView):
|
||||
|
||||
|
||||
## PLANNING
|
||||
@maraudes
|
||||
@maraudes.using(title=('Planning',))
|
||||
class PlanningView(generic.TemplateView):
|
||||
""" Display and edit the planning of next Maraudes """
|
||||
|
||||
template_name = "planning/planning.html"
|
||||
|
||||
class PageInfo:
|
||||
title = "Planning"
|
||||
header = "Planning"
|
||||
header_small = "{{month}} {{year}}" #TODO: does not parse extra context
|
||||
|
||||
def _parse_request(self):
|
||||
self.current_date = datetime.date.today()
|
||||
try: self.month = int(self.request.GET['month'])
|
||||
@@ -381,18 +316,13 @@ class PlanningView(generic.TemplateView):
|
||||
|
||||
## LIEU
|
||||
|
||||
@maraudes_ajax
|
||||
@maraudes.using(ajax=True)
|
||||
class LieuCreateView(generic.edit.CreateView):
|
||||
model = Lieu
|
||||
template_name = "maraudes/lieu_create.html"
|
||||
fields = "__all__"
|
||||
success_url = "/maraudes/"
|
||||
|
||||
class PageInfo:
|
||||
pass
|
||||
|
||||
permissions = ['maraudes.add_lieu']
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
if 'next' in self.request.POST:
|
||||
self.success_url = self.request.POST["next"]
|
||||
|
||||
Reference in New Issue
Block a user