Update Apps Optionnelles - navbar

master
grizzly 6 years ago
parent
commit
7070df246b
  1. 60
      Dev-Documentation/Apps-Optionnelles.md

60
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.
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_<onglet>`:
`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 %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><i class="fa fa-users"></i> {% trans "Users" %}<span class="caret"></span></a>
<ul class="dropdown-menu">
{% can_view_app users %}
<li><a href="{% url 'users:index' %}"><i class="fa fa-user"></i> {% trans "Manage the users" %}</a></li>
<li><a href="{% url 'users:index-clubs' %}"><i class="fa fa-users"></i> {% trans "Manage the clubs" %}</a></li>
{% acl_end %}
{% can_view_app machines %}
<li><a href="{% url 'machines:index' %}"><i class="fa fa-desktop"></i> {% trans "Manage the machines" %}</a></li>
{% acl_end %}
{% can_view_app cotisations %}
<li><a href="{% url 'cotisations:index' %}"><i class="fa fa-eur"></i> {% trans "Manage the subscriptions" %}</a></li>
{% acl_end %}
{% for template in optionnal_templates_navbar_list%}
{{ template }}
{% endfor %}
</ul>
</li>
```
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_<onglet>`.
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 %}
<li><a href="{% url 'tickets:aff-tickets' %}"><i class="fa fa-ticket"></i>{% trans "Tickets" %}</a></li>
```
Loading…
Cancel
Save