diff --git a/Dev-Documentation/Apps-Optionnelles.md b/Dev-Documentation/Apps-Optionnelles.md index d74b548..7ee07d0 100644 --- a/Dev-Documentation/Apps-Optionnelles.md +++ b/Dev-Documentation/Apps-Optionnelles.md @@ -10,7 +10,7 @@ Pour activer une App optionelle il faut la rajouter dans le tupple `OPTIONNAL_AP Les vues cannonique sont des vues qui seront appellées par Re2o dans les pages correspondantes afin d'inclure l'application optionelles dans la page. Ces vues sont toutes contenues dans `App/views.py`. -** NOTE: **Les apps optionelles ne sont pas obligées de contenire toute les vues cannonique. Seule celles qui sont utile pour l'App doivent être présentent. +** NOTE: ** Les apps optionelles ne sont pas obligées de contenire toute les vues cannonique. Seule celles qui sont utile pour l'App doivent être présentent. Pour être valide, ces vues doivent **obligatoirement** renoyer une chaine de caractère. Cette chaine de caractère sera généralement un template généré à l'aide de la fonction `render_to_string` de `django.template.loader` @@ -67,4 +67,60 @@ def preferences(request): return render_to_string('tickets/preferences.html', context=context, request=request, using=None) ``` -Le template utilisé est `tickets/preferences.html` sur le même principe que pour le profil. \ No newline at end of file +Le template utilisé est `tickets/preferences.html` sur le même principe que pour le profil. + +### Navbar + +Ajouter un onglet dans la barre de navigation est plus complexe pour les Apps Optionnelles car cette barre n'est pas générée par une vue spécifique. Sans rentrer dans les détails, les fonctions définies dans `re2o/context_processor.py` fournissent des dictionnaires de context disponibles dans tous les templates. Un context processor spécifique est définit pour les apps optionnelles et appel les vues dans les apps portant le nom `navbar_`: + +`re2o/context_processor.py` +```python +def context_optionnal_apps(request): + """Fonction de context pour générer la navbar en fonction des + apps optionnels""" + optionnal_apps = [import_module(app) for app in OPTIONNAL_APPS] + optionnal_templates_navbar_list = [app.views.navbar_user(request) for app in optionnal_apps] + return {'optionnal_templates_navbar_list':optionnal_templates_navbar_list} +``` + +Ces variables sont accessibles par tous les templates mais ne sont utiles que dans `base.html` qui s'occupe de définir la navbar: + +`templates/base.html` +```html +{% can_view_any_app users machines cotisations %} + +``` + +Ce context processor ne s'occupe que des onglets de `users` mais sur le même principe on peut très facilement gérer les autres onglets de la navbar en appelant des vues au nom cannonique `navbar_`. + +La vue et le template sont très simple car aucune donnée n'est nécéssaire pour le template et qu'il est très court. Il est tentant de ne pas passer par un template et de renvoyer directement la ligne du template mais il faut utiliser un render pour gérer les liens et les traductions. + +`tickets/views.py` +```python +def navbar_user(request): + """Vue cannonique d'affichage des tickets dans la navbar""" + return render_to_string('tickets/navbar.html') +``` + +`tickets/templates/tickets/navbar.html` +```html +{% load i18n %} +
  • {% trans "Tickets" %}
  • +``` \ No newline at end of file