Mr Duhaz 1 سال پیش
والد
کامیت
83137458bc

+ 66 - 0
core/.gitignore

@@ -27,3 +27,69 @@ migrations/__pycache__/0012_page_p_menu_est_parent.cpython-312.pyc
 migrations/__pycache__/0013_alter_page_p_menu_parent.cpython-312.pyc
 migrations/__pycache__/0014_fichier.cpython-312.pyc
 migrations/__pycache__/0015_auto_20240119_1346.cpython-312.pyc
+migrations/__pycache__/__init__.cpython-39.pyc
+migrations/__pycache__/0001_initial.cpython-39.pyc
+migrations/__pycache__/0002_auto_20220422_0914.cpython-39.pyc
+migrations/__pycache__/0003_data.cpython-39.pyc
+migrations/__pycache__/0004_auto_20221121_1234.cpython-39.pyc
+migrations/__pycache__/0005_page_p_menu_stack.cpython-39.pyc
+migrations/__pycache__/0006_speed_dial.cpython-39.pyc
+migrations/__pycache__/0007_auto_20231201_1455.cpython-39.pyc
+migrations/__pycache__/0008_speed_dial_sd_icone.cpython-39.pyc
+migrations/__pycache__/0009_speed_dial_sd_color.cpython-39.pyc
+migrations/__pycache__/0010_auto_20231222_1114.cpython-39.pyc
+migrations/__pycache__/0011_alter_page_p_menu_parent.cpython-39.pyc
+migrations/__pycache__/0012_page_p_menu_est_parent.cpython-39.pyc
+migrations/__pycache__/0013_alter_page_p_menu_parent.cpython-39.pyc
+migrations/__pycache__/0014_fichier.cpython-39.pyc
+migrations/__pycache__/0015_auto_20240119_1346.cpython-39.pyc
+__pycache__/__init__.cpython-39.pyc
+__pycache__/admin.cpython-39.pyc
+__pycache__/apps.cpython-39.pyc
+__pycache__/models.cpython-39.pyc
+__pycache__/views.cpython-39.pyc
+<<<<<<< HEAD
+<<<<<<< HEAD
+=======
+=======
+>>>>>>> 280cb3b4f2e2036cecc83affff6c522c979dfaf1
+migrations/__pycache__/__init__.cpython-39.pyc
+migrations/__pycache__/0001_initial.cpython-39.pyc
+migrations/__pycache__/0002_auto_20220422_0914.cpython-39.pyc
+migrations/__pycache__/0003_data.cpython-39.pyc
+migrations/__pycache__/0004_auto_20221121_1234.cpython-39.pyc
+migrations/__pycache__/0005_page_p_menu_stack.cpython-39.pyc
+migrations/__pycache__/0006_speed_dial.cpython-39.pyc
+migrations/__pycache__/0007_auto_20231201_1455.cpython-39.pyc
+migrations/__pycache__/0008_speed_dial_sd_icone.cpython-39.pyc
+migrations/__pycache__/0009_speed_dial_sd_color.cpython-39.pyc
+migrations/__pycache__/0010_auto_20231222_1114.cpython-39.pyc
+migrations/__pycache__/0011_alter_page_p_menu_parent.cpython-39.pyc
+migrations/__pycache__/0012_page_p_menu_est_parent.cpython-39.pyc
+migrations/__pycache__/0013_alter_page_p_menu_parent.cpython-39.pyc
+migrations/__pycache__/0014_fichier.cpython-39.pyc
+migrations/__pycache__/0015_auto_20240119_1346.cpython-39.pyc
+__pycache__/__init__.cpython-39.pyc
+__pycache__/admin.cpython-39.pyc
+__pycache__/apps.cpython-39.pyc
+__pycache__/models.cpython-39.pyc
+__pycache__/views.cpython-39.pyc
+<<<<<<< HEAD
+>>>>>>> f006307a6dc26bb0bf0f207c1b2da5a603ceef6b
+=======
+>>>>>>> 280cb3b4f2e2036cecc83affff6c522c979dfaf1
+migrations/__pycache__/0016_groupe.cpython-312.pyc
+migrations/__pycache__/0017_groupe_g_description.cpython-312.pyc
+migrations/__pycache__/0018_speed_dial_sd_groupe.cpython-312.pyc
+migrations/__pycache__/0019_alter_speed_dial_sd_groupe.cpython-312.pyc
+migrations/__pycache__/0020_alter_speed_dial_sd_titre.cpython-312.pyc
+migrations/__pycache__/0021_auto_20240423_1338.cpython-312.pyc
+migrations/__pycache__/0016_groupe.cpython-39.pyc
+migrations/__pycache__/0017_groupe_g_description.cpython-39.pyc
+migrations/__pycache__/0018_speed_dial_sd_groupe.cpython-39.pyc
+migrations/__pycache__/0019_alter_speed_dial_sd_groupe.cpython-39.pyc
+migrations/__pycache__/0020_alter_speed_dial_sd_titre.cpython-39.pyc
+migrations/__pycache__/0021_auto_20240423_1338.cpython-39.pyc
+migrations/__pycache__/0022_page_p_proteger.cpython-39.pyc
+migrations/__pycache__/0022_page_p_proteger.cpython-312.pyc
+migrations/__pycache__/0023_auto_20240723_1757.cpython-312.pyc

+ 7 - 1
core/admin.py

@@ -38,7 +38,7 @@ admin.site.register(Page, Page_Admin)
 
 class Speed_Dial_Admin(admin.ModelAdmin):
 	pass
-	list_display = ('sd_titre', 'sd_adresse', 'sd_icone', 'sd_color', 'sd_poid')
+	list_display = ('sd_titre', 'sd_adresse' ,'sd_groupe', 'sd_icone', 'sd_color', 'sd_poid')
 	actions = [bt_sd_poid_plus, bt_sd_poid_moin]
 admin.site.register(Speed_Dial, Speed_Dial_Admin)
 
@@ -48,6 +48,12 @@ class Data_Admin(admin.ModelAdmin):
 	list_display = ('d_titre', 'd_titre_slugify', 'd_type', 'd_variable',)
 admin.site.register(Data, Data_Admin)
 
+class Groupe_Admin(admin.ModelAdmin):
+	pass
+	exclude = ('g_nom_slugify',)
+	list_display = ('g_nom', 'g_description')
+admin.site.register(Groupe, Groupe_Admin)
+
 class Contact_Admin(admin.ModelAdmin):
 	pass
 	list_display = ('c_type', 'c_name', 'c_email', 'c_description', 'c_statut',)

+ 25 - 0
core/migrations/0016_groupe.py

@@ -0,0 +1,25 @@
+# Generated by Django 3.2.23 on 2024-04-22 13:24
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0015_auto_20240119_1346'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Groupe',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('g_nom', models.CharField(max_length=128, unique=True, verbose_name='Nom du groupe')),
+                ('g_nom_slugify', models.CharField(blank=True, editable=False, max_length=128, verbose_name='Nom Slugify')),
+            ],
+            options={
+                'verbose_name': 'Groupe',
+                'verbose_name_plural': 'Groupes',
+            },
+        ),
+    ]

+ 18 - 0
core/migrations/0017_groupe_g_description.py

@@ -0,0 +1,18 @@
+# Generated by Django 3.2.23 on 2024-04-22 13:29
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0016_groupe'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='groupe',
+            name='g_description',
+            field=models.TextField(blank=True, verbose_name='Description'),
+        ),
+    ]

+ 19 - 0
core/migrations/0018_speed_dial_sd_groupe.py

@@ -0,0 +1,19 @@
+# Generated by Django 3.2.23 on 2024-04-22 13:34
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0017_groupe_g_description'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='speed_dial',
+            name='sd_groupe',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='core.speed_dial', verbose_name='Groupe'),
+        ),
+    ]

+ 19 - 0
core/migrations/0019_alter_speed_dial_sd_groupe.py

@@ -0,0 +1,19 @@
+# Generated by Django 3.2.23 on 2024-04-22 13:36
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0018_speed_dial_sd_groupe'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='speed_dial',
+            name='sd_groupe',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='core.groupe', verbose_name='Groupe'),
+        ),
+    ]

+ 18 - 0
core/migrations/0020_alter_speed_dial_sd_titre.py

@@ -0,0 +1,18 @@
+# Generated by Django 3.2.23 on 2024-04-23 09:43
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0019_alter_speed_dial_sd_groupe'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='speed_dial',
+            name='sd_titre',
+            field=models.CharField(max_length=128, verbose_name='Titre'),
+        ),
+    ]

+ 23 - 0
core/migrations/0021_auto_20240423_1338.py

@@ -0,0 +1,23 @@
+# Generated by Django 3.2.23 on 2024-04-23 13:38
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0020_alter_speed_dial_sd_titre'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='page',
+            name='p_groupe',
+            field=models.BooleanField(default=False, verbose_name='Afficher les groupes'),
+        ),
+        migrations.AddField(
+            model_name='page',
+            name='p_speedial',
+            field=models.BooleanField(default=False, verbose_name='Afficher le Speedial'),
+        ),
+    ]

+ 18 - 0
core/migrations/0022_page_p_proteger.py

@@ -0,0 +1,18 @@
+# Generated by Django 3.2.23 on 2024-07-21 18:46
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0021_auto_20240423_1338'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='page',
+            name='p_proteger',
+            field=models.BooleanField(default=False, verbose_name='Disponible que si authentifier'),
+        ),
+    ]

+ 22 - 1
core/models.py

@@ -30,6 +30,23 @@ page_color = (
 	(u'white', u'Blanc'),
 )
 
+class Groupe (models.Model) : #group pour organisation
+	g_nom = models.CharField("Nom du groupe", max_length = 128, unique = True)
+	g_nom_slugify = models.CharField("Nom Slugify", max_length = 128, blank = True, editable = False)
+	g_description = models.TextField("Description", blank = True)
+
+	class Meta :
+		verbose_name = 'Groupe'
+		verbose_name_plural = 'Groupes'
+
+	def save(self, *args, **kwargs) :
+		self.g_nom_slugify = slugify(self.g_nom)
+		super(Groupe, self).save(*args, **kwargs)
+	def __unicode__(self):
+		return self.g_nom
+	def __str__(self):
+		return '%s' % (self.g_nom)
+
 class Data (models.Model) : #stocage de donnée dynamique
 	d_titre = models.CharField("Nom", max_length = 128, unique = True)
 	d_titre_slugify = models.CharField("Nom Slugify", max_length = 128, blank = True, editable = False)
@@ -82,7 +99,10 @@ class Page (models.Model) : #Architecture pour les pages static est dynamique
 	p_description = models.TextField("Description", blank = True)
 	p_contenu = models.TextField("Contenu", blank = True)
 	p_right = models.TextField("Contenu à droite", blank = True)
+	p_groupe = models.BooleanField("Afficher les groupes", default = False)
+	p_speedial = models.BooleanField("Afficher le Speedial", default = False)
 	p_publier = models.BooleanField("Publié", default = False)
+	p_proteger = models.BooleanField("Disponible que si authentifier", default = False)
 	p_see_title_and_des_in_templates = models.BooleanField("Description et titre visible dans les templates", default = True)
 
 	class Meta :
@@ -104,7 +124,8 @@ class Page (models.Model) : #Architecture pour les pages static est dynamique
 		return '%s' % (self.p_titre)
 	
 class Speed_Dial (models.Model) : # model pour génération de page SpeedDial
-	sd_titre = models.CharField("Titre", max_length = 128, unique = True)
+	sd_titre = models.CharField("Titre", max_length = 128)
+	sd_groupe = models.ForeignKey(Groupe,verbose_name="Groupe", blank = True, null = True, on_delete=models.PROTECT)
 	sd_icone = models.CharField("Code de l'icone", max_length = 64, blank = True)
 	sd_color = models.CharField("Couleur du cadre",choices=page_color, max_length=10, default='primary')
 	sd_adresse = models.CharField("Adresse", max_length = 256)

+ 22 - 22
core/templates/base.html

@@ -48,13 +48,13 @@
 			<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fas fa-bars" ></i> {{ p_menu_parent.grouper }}</a>
 				<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
 				{% for item in p_menu_parent.list|dictsortreversed:"p_menu_poid" %}
-					<a class="dropdown-item" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %}  href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
+					<a class="dropdown-item {% if item.p_proteger == True and user.is_authenticated %} {% elif item.p_proteger == False %} {% else %}disabled{% endif %}" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %} href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
 				{% endfor %}
 				</div>
 			</div>
 			{% else %}
 				{% for item in p_menu_parent.list %}
-					<li class="nav-item"><a class="nav-link" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %}  href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
+					<li class="nav-item"><a class="nav-link {% if item.p_proteger == True and user.is_authenticated %} {% elif item.p_proteger == False %} {% else %}disabled{% endif %}" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %} href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
 				{% endfor %}
 			{% endif %}
 		{% endfor %}
@@ -139,25 +139,25 @@
 		</div>
 		<div class="col-lg-3 p-lg-1 p-md-0 mb-sm-1">
 			{% if page.c_card_rp == 'True'%}<div class="card" style="background-color: rgba(250,250,250,0.88);" >{% endif %}
-				{% if page.c_includ_rp != 'None'%}{% include page.c_includ_rp %}{% endif %}
-				{% block right_panel %}
-				{% endblock %}
-				{% if not request.user.is_authenticated and page.p_right and not "account/" in request.path %}
-					<div class="card-body">
-						<h5 class="card-title"> Une Pub </h5>
-						<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
-						<!-- Pub-1 -->
-						<ins class="adsbygoogle"
-							style="display:block"
-							data-ad-client="ca-pub-0171697375250839"
-							data-ad-slot="9918621322"
-							data-ad-format="auto"
-							data-full-width-responsive="true">
-						</ins>
-						<script>
-							(adsbygoogle = window.adsbygoogle || []).push({});
-						</script>
-				{% endif %}
+			{% if page.c_includ_rp != 'None'%}{% include page.c_includ_rp %}{% endif %}
+			{% block right_panel %}
+			{% endblock %}
+			{% if not request.user.is_authenticated and page.p_right and not "account/" in request.path %}
+				<div class="card-body">
+					<h5 class="card-title"> Une Pub </h5>
+					<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
+					<!-- Pub-1 -->
+					<ins class="adsbygoogle"
+						style="display:block"
+						data-ad-client="ca-pub-0171697375250839"
+						data-ad-slot="9918621322"
+						data-ad-format="auto"
+						data-full-width-responsive="true">
+					</ins>
+					<script>
+						(adsbygoogle = window.adsbygoogle || []).push({});
+					</script>
+			{% endif %}
 			{% if page.c_card_rp != 'None'%}</div>{% endif %}
 		</div>
 	</div>
@@ -165,7 +165,7 @@
 </main>
 <footer class="footer mt-auto py-1 text-white" style="background-color: {{page.c_bgcolor}};">
 	<div class="container">
-		{{page.c_sitename}} - Jan. 2024
+		{{page.c_sitename}} - {{page.c_siteversion}}
 		{% if page.p_menu_pied %}
 		{% for item in page.p_menu_pied %}
 			<a class="link-light" href="{{item.p_adresse}}">{{item.p_titre}}</a>{% if not forloop.last %}, {% endif %}

+ 3 - 3
core/templates/base_no_card.html

@@ -50,13 +50,13 @@
 			<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fas fa-bars" ></i> {{ p_menu_parent.grouper }}</a>
 				<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
 				{% for item in p_menu_parent.list|dictsortreversed:"p_menu_poid" %}
-					<a class="dropdown-item" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %}  href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
+					<a class="dropdown-item {% if item.p_proteger == True and user.is_authenticated %} {% elif item.p_proteger == False %} {% else %}disabled{% endif %}" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %} href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
 				{% endfor %}
 				</div>
 			</div>
 			{% else %}
 				{% for item in p_menu_parent.list %}
-					<li class="nav-item"><a class="nav-link" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %}  href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
+					<li class="nav-item"><a class="nav-link {% if item.p_proteger == True and user.is_authenticated %} {% elif item.p_proteger == False %} {% else %}disabled{% endif %}" {%if item.p_type == "lien_ext" %}target="_blank"{% endif %} href="{{item.p_adresse}}">{% if item.p_icone %}<i class="{{item.p_icone}}" ></i> {% endif %}{{item.p_titre}}</a></li>
 				{% endfor %}
 			{% endif %}
 		{% endfor %}
@@ -168,7 +168,7 @@
 </main>
 <footer class="footer mt-auto py-1 text-white" style="background-color: {{page.c_bgcolor}};">
 	<div class="container">
-		{{page.c_sitename}} - Jan. 2024
+		{{page.c_sitename}} - {{page.c_siteversion}}
 		{% if page.p_menu_pied %}
 		{% for item in page.p_menu_pied %}
 			<a class="link-light" href="{{item.p_adresse}}">{{item.p_titre}}</a>{% if not forloop.last %}, {% endif %}

+ 9 - 1
core/templates/page.html

@@ -21,7 +21,7 @@
 				<div class="card bg-{{item.sd_color}}" style="padding: 1px;">
 					<div class="card-body d-flex flex-row" style=" background : white; opacity: 0.85;">
 						<div class="p-2"><a class="text-decoration-none" href="{{item.sd_adresse}}" target="_blank"><i class="{% if item.sd_icone != '' %}{{item.sd_icone }}{% else %}fas fa-external-link-square-alt{% endif %}"></i></a></div>
-						<div class="p-2 w-80" onmouseover="this.style.cursor='pointer';" onclick="bt_open_url('{{item.sd_adresse|escapejs}}')">{{item.sd_titre}}</div>
+						<div class="p-2 w-80" onmouseover="this.style.cursor='pointer';" onclick="bt_open_url('{{item.sd_adresse|escapejs}}')">{% if item.sd_groupe %}[{{ item.sd_groupe }}] {% endif %}{{item.sd_titre}}</div>
 					</div>
 				</div>
 			</div>
@@ -56,6 +56,14 @@
 			</form>
 	{% endif %}
 	{{page.p_right|safe}}
+	{% if page.groupe %}
+		<h4> <i class="fas fa-tags"></i> Les Groupes </h4>
+		<p class="card-text">
+		{% for grp in page.groupe %}
+			<a href="{{request.path}}?grp={{grp.g_nom_slugify}}" class="btn btn-dark mb-2" tabindex="-1" role="button" aria-disabled="true">{{grp.g_nom}}</a>
+		{% endfor %}
+		<a href="{{request.path}}" class="btn btn-dark mb-2" tabindex="-1" role="button" aria-disabled="true">Aucun</a>
+	{% endif %}
 </div>
 {% endif %}
 {% endblock %}

+ 36 - 4
core/views.py

@@ -27,11 +27,25 @@ def gen_menu(position):
 		menu = Page.objects.none()
 	return menu
 
-def gen_speeddial():
+def get_groupe():
 	try:
-		speeddial = Speed_Dial.objects.order_by('-sd_poid')
+		goupes = Groupe.objects.all()
 	except:
-		speeddial = Speed_Dial.objects.none()
+		goupes = Groupe.objects.none()
+	return goupes
+
+def gen_speeddial(grp):
+	print(grp)
+	if grp != None:
+		try:
+			speeddial = Speed_Dial.objects.filter(sd_groupe__g_nom_slugify = grp).order_by('-sd_poid')
+		except:
+			speeddial = Speed_Dial.objects.none()
+	else:
+		try:
+			speeddial = Speed_Dial.objects.order_by('-sd_poid')
+		except:
+			speeddial = Speed_Dial.objects.none()
 	return speeddial
 
 def get_data_value(name):
@@ -49,6 +63,11 @@ def get_data_value(name):
 			data.d_type = "txt"
 			data.d_variable = "far fa-clone"
 			data.save()
+		elif name == "site-version":
+			data.d_titre = name
+			data.d_type = "txt"
+			data.d_variable = "Jan. 2024"
+			data.save()
 		elif name == "background-color":
 			data.d_titre = name
 			data.d_type = "txt"
@@ -106,6 +125,7 @@ def gen_page_base():
 	page.p_see_title_and_des_in_templates = True
 
 	page.c_sitename = get_data_value('site-name')
+	page.c_siteversion = get_data_value('site-version')
 	page.c_sitelogo = get_data_value('site-logo')
 	page.c_bgcolor = get_data_value('background-color')
 	page.c_bgimage = get_data_value('background')
@@ -127,6 +147,9 @@ def gen_page_sys(p_titre_slugify):
 		page.p_titre = "404 ! Erreur sur la page demmandé"
 		page.p_icone = "fas fa-bug"
 
+	if page.p_groupe == True:
+		page.groupe = get_groupe()
+
 	page.p_menu_haut = gen_menu('haut')
 	page.p_menu_pied = gen_menu('pied')
 	page.p_meta_title = page.p_titre
@@ -146,8 +169,14 @@ def gen_page_sys(p_titre_slugify):
 
 def index(request):
 	page = gen_page_sys('bienvenus')
-	page.speeddial = gen_speeddial()
+	page.p_get_groupe = request.GET.get('grp')
 
+	if page.p_speedial == True:
+		try:
+			page.speeddial = gen_speeddial(page.p_get_groupe)
+		except:
+			page.speeddial = gen_speeddial(None)
+	
 	template = loader.get_template('page.html')
 	context = {
 		'page' : page,
@@ -160,6 +189,7 @@ def page(request, p_url):
 	template = loader.get_template('page.html')
 	try:
 		page = Page.objects.get(p_adresse = p_url)
+		
 		page.p_menu_haut = gen_menu('haut')
 		page.p_menu_pied = gen_menu('pied')
 		page.p_meta_title = page.p_titre
@@ -173,6 +203,8 @@ def page(request, p_url):
 		page = gen_page_base()
 		page.p_contenu = "<h1>Erreur la page demandé n'existe pas </h1>"
 
+	page.p_get_groupe = request.GET.get('grp')
+
 	context = {
 		'page' : page,
 	}