Commit 64baa185 by Etienne Freiss

Merge branch 'evolution_bdm' of…

Merge branch 'evolution_bdm' of https://gl.cooperatic.fr/cooperatic-foodcoops/third-party into ticket_1330
parents ee354959 9305e1ab
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -44,13 +44,114 @@ default_msettings = {'msg_accueil': {'title': 'Message borne accueil',
'class': 'link',
'sort_order': 6
},
'request_form_link': {
'title': 'Faire une demande au Bureau Des Membres',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 7
},
'late_service_form_link': {
'title': 'Retard à mon service ou oubli validation',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 8
},
'change_template_form_link': {
'title': 'Demande de changement de créneau',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 9
},
#TODO vérifier le nom d'un "binome"
'associated_subscribe_form_link': {
'title': 'Demande de création de binôme',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 10
},
#TODO vérifier le nom d'un "binome"
'associated_unsubscribe_form_link': {
'title': 'Se désolidariser de son binôme',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 11
},
'template_unsubscribe_form_link': {
'title': 'Se désinscrire de son créneau',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 12
},
'change_email_form_link': {
'title': 'Changer d\'adresse mail',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 13
},
'coop_unsubscribe_form_link': {
'title': 'Demande de démission de la coopérative et/ou de remboursement de mes parts sociales',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 14
},
'sick_leave_form_link': {
'title': 'Demande de congé maladie ou parental',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 15
},
'underage_subscribe_form_link': {
'title': 'Demande de création d’un compte mineur rattaché',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 16
},
'helper_subscribe_form_link': {
'title': 'Rejoindre la Brigade Solidaire',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 17
},
'helper_unsubscribe_form_link': {
'title': 'Se désinscrire de la brigade solidaire',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 18
},
'covid_form_link': {
'title': 'J\'ai le Covid-19 !',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 19
},
'covid_end_form_link': {
'title': 'Fin d\'exemption: reprise de mes services',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 20
},
'member_cant_have_delay_form_link': {
'title': 'Lien vers le formulaire pour les membres n\'ayant pas rattrapé leur service après 6 mois',
'type': 'text',
'value': '',
'class': 'link',
'sort_order': 7
'sort_order': 21
}
}
def config(request):
......@@ -244,7 +345,7 @@ def get_makeups_members(request):
return JsonResponse({ 'res' : res })
def update_members_makeups(request):
""" Met à jour les rattrapages des membres passés dans la requête """
""" Décrémente les rattrapages des membres passés dans la requête """
res = {}
is_connected_user = CagetteUser.are_credentials_ok(request)
if is_connected_user is True:
......
#faqBDM {
font-size: 1.8rem;
}
#faqBDM .block {
width: 100%;
}
.info_slots_shifts {
margin: 2rem 0;
}
.grp_text{
margin-top: 25px;
}
.param {margin-bottom: 15px;}
.param label {font-weight: bold;}
input.link {min-width: 50em;}
.submit_button {margin-bottom: 10px;}
/* Style the buttons that are used to open and close the accordion panel */
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
text-align: left;
border: none;
outline: none;
transition: 0.4s;
}
/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
.active, .accordion:hover {
background-color: #ccc;
}
/* Style the accordion panel. Note: hidden by default */
.panel {
padding: 0 18px;
padding-bottom: 10px;
background-color: white;
display: none;
overflow: hidden;
border-left: 1px solid #E5E5E5;
border-right: 1px solid #E5E5E5;
border-bottom: 1px solid #E5E5E5;
border-bottom-left-radius: 15px;
border-bottom-right-radius: 15px;
}
button.accordion::after {
content: '\002B';
color: #777;
font-weight: bold;
float: right;
margin-left: 5px;
}
button.accordion.active::after {
content: "\2212";
}
.btn_faq{
white-space: normal;
border-radius: 5px;
margin-top: 3px;
padding-right: 25px;
display: flex;
align-items: flex-end;
}
.full_width{
width: 100%;
}
.faq_link_button_area {
margin-top: 10px;
height: 100%;
}
.faq_link_button {
white-space: normal;
border-radius: 5px;
}
.faq_link_button:hover {
color: #fff;
text-decoration: none;
}
.faq_intro_texts {
margin-bottom: 30px;
}
\ No newline at end of file
......@@ -17,12 +17,28 @@
padding: 1.5rem 0;
}
@media screen and (min-width: 351px) and (max-width: 435px) {
.my_info_line {
font-size: 80%;
padding: 2vw 0;
}
}
@media screen and (max-width: 350px) {
.my_info_line {
font-size: 3.5vw;
padding: 2vw 0;
}
}
.my_info_line_left {
width: 50%;
text-align: right;
padding-right: 2rem;
font-weight: bold;
}
.my_info_line_right {
width: 50%;
padding-left: 2rem;
......@@ -94,6 +110,4 @@
#my_info .member_shift_name_area {
align-items: flex-start;
}
}
\ No newline at end of file
}
......@@ -6,6 +6,12 @@ body {
margin: 35px 0 30px 0;
}
@media screen and (max-width: 435px) {
.page_title {
margin: 4vw 0 3vw 0;
}
}
/* -- Tiles */
.tiles_container {
......@@ -48,6 +54,7 @@ body {
font-size: 2.4rem;
padding: 2rem 0;
width: 80%;
word-break: break-all;
}
.tile_content {
......@@ -59,7 +66,11 @@ body {
}
#home_tile_services_exchange .tile_content {
justify-content: center;
height: 100%;
flex-direction: column;
align-items: center;
text-align: center;
}
......@@ -146,6 +157,7 @@ body {
}
#member_status_action {
display: flex;
margin-bottom: 20px;
}
@media screen and (max-width: 992px) {
......@@ -163,13 +175,22 @@ body {
.unsuscribed_form_link {
display: none;
text-decoration: none;
font-size: 1.5rem;
font-size: 1.7rem;
word-break: normal;
}
.unsuscribed_form_link:hover {
text-decoration: none;
}
@media (max-width: 435px) {
.unsuscribed_form_link {
font-size: 90%;
line-height: 7vw;
}
}
.member_status_up_to_date,
.member_status_exempted {
color: #5cb85c;
......@@ -327,4 +348,4 @@ body {
.shop_message_content {
width: 90%;
}
}
\ No newline at end of file
}
function init_faq() {
$("#unsuscribe_form_link_btn").prop("href", unsuscribe_form_link);
$("#unsuscribe_form_link_btn2").prop("href", unsuscribe_form_link);
$("#change_template_form_link_btn").prop("href", change_template_form_link);
$("#template_unsubscribe_form_link_btn").prop("href", template_unsubscribe_form_link);
$("#late_service_form_link_btn").prop("href", late_service_form_link);
$("#sick_leave_form_link_btn").prop("href", sick_leave_form_link);
$("#associated_subscribe_form_link_btn").prop("href", associated_subscribe_form_link);
$("#associated_unsubscribe_form_link_btn").prop("href", associated_unsubscribe_form_link);
$("#covid_form_link_btn").prop("href", covid_form_link);
$("#covid_end_form_link_btn").prop("href", covid_end_form_link);
$("#underage_subscribe_form_link_btn").prop("href", underage_subscribe_form_link);
$("#change_email_form_link_btn").prop("href", change_email_form_link);
$("#coop_unsubscribe_form_link_btn").prop("href", coop_unsubscribe_form_link);
$("#helper_subscribe_form_link_btn").prop("href", helper_subscribe_form_link);
$("#helper_unsubscribe_form_link_btn").prop("href", helper_unsubscribe_form_link);
$("#request_form_link_btn2").prop("href", request_form_link);
$("#request_form_link_btn").prop("href", request_form_link);
}
$(document).on('click', '.accordion', function() {
/* Toggle between adding and removing the "active" class,
to highlight the button that controls the panel */
this.classList.toggle("active");
/* Toggle between hiding and showing the active panel */
var panel = this.nextElementSibling;
if (panel.style.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
$("#shift_exchange_btn").on("click", () => {
goto('echange-de-services');
});
});
\ No newline at end of file
......@@ -36,6 +36,13 @@ $(document).ready(function() {
}
toggleHeader();
});
$('#nav_faq').on('click', (e) => {
e.preventDefault();
if (current_location !== "faq") {
goto('faq');
}
toggleHeader();
});
$('#nav_shifts_exchange').on('click', (e) => {
e.preventDefault();
if (current_location !== "shifts_exchange") {
......
......@@ -55,7 +55,7 @@ function load_partner_shifts(partner_id) {
/* - Navigation */
/**
* @param {String} page home | mes-infos | mes-services | echange-de-services
* @param {String} page home | mes-infos | mes-services | echange-de-services | faq
*/
function goto(page) {
if (window.location.pathname === base_location) {
......@@ -68,6 +68,10 @@ function goto(page) {
/**
* Define which html content to load from server depending on the window location
*
* WARNING: For the routing system to work,
* public urls (those the users will see & navigate to) must be different than the server urls used to fetch resources
* (ex: public url: /members_space/mes-info ; server url: /members_space/my_info)
*/
function update_dom() {
$(".nav_item").removeClass('active');
......@@ -84,6 +88,10 @@ function update_dom() {
current_location = "my_shifts";
$("#main_content").load("/members_space/my_shifts", update_content);
$("#nav_my_shifts").addClass("active");
} else if (window.location.pathname === base_location + "faq") {
current_location = "faq";
$("#main_content").load("/members_space/faqBDM", update_content);
$("#nav_faq").addClass("active");
} else if (window.location.pathname === base_location + "echange-de-services") {
current_location = "shifts_exchange";
$("#main_content").load("/members_space/shifts_exchange", update_content);
......@@ -108,6 +116,9 @@ function update_content() {
case 'my_shifts':
init_my_shifts();
break;
case 'faq':
init_faq();
break;
case 'shifts_exchange':
init_shifts_exchange();
break;
......
......@@ -5,11 +5,12 @@ from . import views
urlpatterns = [
url(r'^$', views.index),
url(r'^homepage$', views.home),
url(r'^homepage$', views.home), # These endpoints must be different than in-app url
url(r'^my_info$', views.my_info),
url(r'^my_shifts$', views.my_shifts),
url(r'^shifts_exchange$', views.shifts_exchange),
url(r'^faqBDM$', views.faqBDM),
url(r'^no_content$', views.no_content),
url(r'^get_shifts_history$', views.get_shifts_history),
url('/*$', views.index),
url('/*$', views.index), # Urls unknown from the server will redirect to index
]
......@@ -130,7 +130,20 @@ def index(request, exception=None):
context['abcd_calendar_link'] = ( msettings['abcd_calendar_link']['value']
if 'abcd_calendar_link' in msettings
else '')
context['request_form_link'] = msettings['request_form_link']['value'] if 'request_form_link' in msettings else ''
context['late_service_form_link'] = msettings['late_service_form_link']['value'] if 'late_service_form_link' in msettings else ''
context['change_template_form_link'] = msettings['change_template_form_link']['value'] if 'change_template_form_link' in msettings else ''
context['associated_subscribe_form_link'] = msettings['associated_subscribe_form_link']['value'] if 'associated_subscribe_form_link' in msettings else ''
context['associated_unsubscribe_form_link'] = msettings['associated_unsubscribe_form_link']['value'] if 'associated_unsubscribe_form_link' in msettings else ''
context['template_unsubscribe_form_link'] = msettings['template_unsubscribe_form_link']['value'] if 'template_unsubscribe_form_link' in msettings else ''
context['change_email_form_link'] = msettings['change_email_form_link']['value'] if 'change_email_form_link' in msettings else ''
context['coop_unsubscribe_form_link'] = msettings['coop_unsubscribe_form_link']['value'] if 'coop_unsubscribe_form_link' in msettings else ''
context['sick_leave_form_link'] = msettings['sick_leave_form_link']['value'] if 'sick_leave_form_link' in msettings else ''
context['underage_subscribe_form_link'] = msettings['underage_subscribe_form_link']['value'] if 'underage_subscribe_form_link' in msettings else ''
context['helper_subscribe_form_link'] = msettings['helper_subscribe_form_link']['value'] if 'helper_subscribe_form_link' in msettings else ''
context['helper_unsubscribe_form_link'] = msettings['helper_unsubscribe_form_link']['value'] if 'helper_unsubscribe_form_link' in msettings else ''
context['covid_form_link'] = msettings['covid_form_link']['value'] if 'covid_form_link' in msettings else ''
context['covid_end_form_link'] = msettings['covid_end_form_link']['value'] if 'covid_end_form_link' in msettings else ''
else:
# may arrive when switching database without cleaning cookie
return redirect('/website/deconnect')
......@@ -138,6 +151,12 @@ def index(request, exception=None):
return _get_response_according_to_credentials(request, credentials, context, template)
def home(request):
"""
Endpoint the front-end will call to load the "home" page.
Consequently, the front-end url should be unknown from the server so the user is redirected to the index,
then the front-end index will call this endpoint to load the home page
"""
template = loader.get_template('members_space/home.html')
context = {
'title': 'Espace Membres',
......@@ -151,6 +170,7 @@ def home(request):
return HttpResponse(template.render(context, request))
def my_info(request):
""" Endpoint the front-end will call to load the "My info" page. """
template = loader.get_template('members_space/my_info.html')
context = {
'title': 'Mes Infos',
......@@ -158,6 +178,7 @@ def my_info(request):
return HttpResponse(template.render(context, request))
def my_shifts(request):
""" Endpoint the front-end will call to load the "My shifts" page. """
template = loader.get_template('members_space/my_shifts.html')
context = {
'title': 'Mes Services',
......@@ -165,13 +186,25 @@ def my_shifts(request):
return HttpResponse(template.render(context, request))
def shifts_exchange(request):
""" Endpoint the front-end will call to load the "Shifts exchange" page. """
template = loader.get_template('members_space/shifts_exchange.html')
context = {
'title': 'Échange de Services',
}
return HttpResponse(template.render(context, request))
def faqBDM(request):
template = loader.get_template('members_space/faq.html')
context = {
'title': 'foire aux questions',
}
msettings = MConfig.get_settings('members')
return HttpResponse(template.render(context, request))
def no_content(request):
""" Endpoint the front-end will call to load the "No content" page. """
template = loader.get_template('members_space/no_content.html')
context = {
'title': 'Contenu non trouvé',
......
......@@ -133,7 +133,6 @@ function get_module_settings() {
})
if (added_elts.length > 0) {
submit_btn.prependTo(main_content);
submit_btn.clone().appendTo(main_content);
}
submit_btn.click(save_module_settings);
quill_containers.forEach(function(params){
......
......@@ -119,14 +119,20 @@ def get_list_shift_calendar(request, partner_id):
event["id"] = value['id']
smax = int(value['seats_available']) + int(value['seats_reserved'])
company_code = getattr(settings, 'COMPANY_CODE', '')
title_prefix = ''
if len(value['address_id']) == 2 and ',' in value['address_id'][1]:
title_prefix = str(value['address_id'][1]).split(",")[1] + " -- "
if company_code != "lacagette" and len(value['address_id']) == 2 and ',' in value['address_id'][1]:
title_prefix = str(value['address_id'][1]).split(",")[1] + " --"
elif company_code == "lacagette":
title_prefix = " -- "
event["title"] = title_prefix + str(value['seats_reserved']) + "/" + str(smax)
event["start"] = dateIsoUTC(value['date_begin_tz'])
event["end"] = dateIsoUTC(value['date_begin_tz'])
datetime_object = datetime.datetime.strptime(value['date_end_tz'], "%Y-%m-%d %H:%M:%S") - datetime.timedelta(minutes=15)
event["end"] = dateIsoUTC(datetime_object.strftime("%Y-%m-%d %H:%M:%S"))
if len(l) > 0:
if use_new_members_space is True:
......
<div id="faqBDM" class=" mt-3">
<div class="page_title txtcenter">
<h1>
J'ai un problème ou une demande
</h1>
</div>
<div class="tiles_container">
<div class="tile full_width_tile">
<div class="tile_content">
<div class="block">
<div class="faq_intro_texts">
<p>Je rencontre un problème ou j'ai une demande concernant mon statut de membre :</p>
<ul>
<li>
Je clique sur l'onglet qui correspond à ma demande puis je remplis le formulaire adéquat.
</li>
<li>
Un·e coopérateur·rice du Bureau Des Membres répondra à ma demande dès que possible.
</li>
</ul>
<div class="info_slots_shifts">
<p><i class="fas fa-exclamation-circle"></i> Créneau/service c'est quoi la différence?</p>
<p>Un créneau, c'est une plage récurrente, par exemple, tous les jeudi de semaine A de 13h30 à 16h30.</p>
<p>Un service, c'est une plage horaire en particulier, par exemple le jeudi 28 novembre de 13h30 à 16h30.</p>
</div>
</div>
<div class="param">
<button type="button" class="accordion btn_faq">
<span class="full_width">000 Gestion de mon créneau: réinscription, changement, désinscription temporaire (absence de moyenne ou longue durée)</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h3><b>Créneau/service c'est quoi la différence?</b></h3>
<p>
Un créneau, c'est une plage récurrente, par exemple, tous les jeudi de semaine A de 13h30 à 16h30.<br/>
Un service, c'est une plage horaire en particulier, par exemple le jeudi 28 novembre de 13h30 à 16h30.
</p>
</div>
<div class="grp_text">
<h3><b>Se réinscrire à un créneau:</b></h3>
<p>
Si tu es désinscrit.e parce que tu as manqué des services sans faire tes rattrapages il faut te réinscrire à un créneau. Il te faudra tout de même faire tes rattrapages avant d'être à jour de tes services.<br/>
<b>ATTENTION:</b> si tu es en binôme c'est avec le nom du.de la titulaire qu'il faut remplir le formulaire.
</p>
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="unsuscribe_form_link_btn"
>
Réinscription à un crénau
</a>
</div>
</div>
<div class="grp_text">
<h3><b>Changer de créneau:</b></h3>
<p>
Si ton créneau ne te convient plus tu peux demander à le changer.<br/>
<b>ATTENTION:</b> si tu es en binôme c'est avec le nom du.de la titulaire qu'il faut remplir le formulaire.
</p>
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="change_template_form_link_btn"
>
Changement de crénau
</a>
</div>
</div>
<div class="grp_text">
<h3><b>Se désinscrire de son créneau:</b></h3>
<p>
- Si tu as prévu de t'absenter de Montpellier ou que tu vas rencontrer une période durant laquelle tu ne pourras pas faire tes services tu peux te désinscrire de ton créneau. A ton retour il te faudra remplir le formulaire "réinscription à un créneau".<br/>
- Si tu ne souhaites plus participer à la coopérative mais que tu ne souhaites pas démissionner tout de suite, notamment car tu souhaites attendre que la part sociale prenne de la valeur pour te faire rembourser, tu dois te désinscrire de ton créneau. Au moment où tu souhaiteras démissionner il faudra remplir le formulaire du même nom. Tu ne pourras plus faire tes courses à la Cagette.<br/>
<b>ATTENTION:</b> si tu es en binôme et que l'autre personne souhaite continuer à participer il faut remplir le formulaire "se désolidariser de son binôme". Si tu es la personne titulaire du binôme l'autre personne devra remplir le formulaire "se réinscrire à un créneau".
</p>
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="template_unsubscribe_form_link_btn"
>
Se désinscrire de son crénau
</a>
</div>
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >001 Gestion de mes services: échanger son service, arrivé.e en retard à son service, demande de congés maladie ou parental</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h3><b>Créneau/service c'est quoi la différence?</b></h3>
<p>
Un créneau, c'est une plage récurrente, par exemple, tous les jeudi de semaine A de 13h30 à 16h30.<br/>
Un service, c'est une plage horaire en particulier, par exemple le jeudi 28 novembre de 13h30 à 16h30.
</p>
</div>
<div class="grp_text">
<h3><b>Échanger son service:</b></h3>
<p>
Si tu ne peux pas venir effectuer ton service à la date prévue il te faut l'échanger sur ton espace membre.<br/>
<b>ATTENTION:</b> si tu es en binôme c'est via l'espace membre du titulaire du binôme qu'il faut le faire.
</p>
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
type="button"
class="btn--primary faq_link_button"
id="shift_exchange_btn"
>
Échange de services
</a>
</div>
</div>
<div class="grp_text">
<h3><b>Arrivé.e en retard à son service ou oubli de valider son service</b></h3>
<p>
Tu es arrivé.e en retard à ton service. La borne Accueil est close ! (horreur, malheur, nuées de criquets...)<br/>
Ou tu as oublié de te valider en arrivant et le service n'apparait plus sur la borne... il y a 15mn pour valider après c'est fini!! Clique ci dessous afin de nous informer de ton retard, nous validerons ton service. Attention la prochaine fois, il est important d'être là au briefing pour se transmettre les infos et se répartir les tâches.
</p>
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="late_service_form_link_btn"
>
Retard à mon service
</a>
</div>
</div>
<div class="grp_text">
<h3><b>Demande de congé maladie ou parental</b></h3>
<p><b>
- Si tu t'absentes sur une période de 4 semaines autre que pour une raison de santé ou parentale il t'es demandé de déplacer ton service.<br/>
- Si tu t'absentes plus il te faut se désinscrire de ton créneau puis, à ton retour te réinscrire à un créneau . Pendant cette période de désinscription tu ne dois pas faire de service et tu ne peux pas pas faire tes courses.
</p></b>
<p></b></p>
</div>
<div class="grp_text">
<b><h3>Les congés maladie:</h3></b>
Les congés maladie peuvent être pris en cas d’impossibilité physique de réaliser son service pendant une longue durée qui prend en compte<b> minimum 2 services</b>. Si ton impossibilité est d'un mois il t'es demandé de déplacer ton service.<br />
En cas de rhume nous encourageons les coops à simplement déplacer leur service depuis l’espace membre. La coop a besoin de la participation de chacun.e !<br />
<b>ATTENTION:</b> Compte tenu de la facilité offerte par le statut de binôme, les personnes formant un binôme ne pourront pas<br />
bénéficier de congés maladie. Il sera alors possible de se désolidariser de son binôme en remplissant le formulaire adéquat sur l’espace membre afin d’en bénéficier.<br />
</div>
<div class="grp_text"><h3><b>Les congés parentaux</b></h3>
Lors de la naissance d’un enfant, les coops peuvent continuer de faire leur courses sans faire de services pendant 12 mois.<br />
Si les deux parents font partie de la coopérative, ils peuvent se partager leurs 12 mois comme il l’entendent. Il peuvent prendre par exemple 6 mois chacun.e en même temps ou 8 mois pour l'un.e puis 4 mois pour l'autre.<br />
<br />
Particularités: si les deux parents forment un binôme, i.elles ont alors accès à 6 mois de congé parental simultanément. S’ielles souhaitent répartir le congé différement il faut alors qu’ielles se débinomisent. Si l’un.e des deux parents est binôme avec un.e personne qui n’est pas l’autre parent, ielle doit se débinomiser pour bénéficier du congé parental.<br />
<br />
Quelque soit ta demande de congés merci de remplir le formulaire ci dessous:<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="sick_leave_form_link_btn"
>
Demande de congés
</a>
</div>
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width">002 Mon statut: Je suis suspendu.e ou désinscrit.e et je ne peux pas faire mes courses</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h2><b>Dans quel cas ?</b></h2>
Tu es suspendu.e si tu as raté un service et que tu ne l'a pas rattrapé dans les 4 semaines et même si tu as fait ton service suivant.<br />
Tu es désinscrit.e après avoir raté trois services d’affilée sans les rattraper. Tu es désinscrit.e de ton créneau afin d'y libérer une place.<br />
Attention, le binôme est un cas particulier où une des deux personnes est la titulaire et l'autre la suppléante dont le statut est &quot;désinscrit.e&quot;.<br />
<br/>
<h3><b>Que faire ? </b></h3>
</div>
<div class="grp_text">
<h3><b>Si tu es suspendu.e. :</b></h3>
Tu dois choisir un rattrapage.<br />
En attendant d'avoir effectué ton rattrapage, tu peux demander une extension qui te donne quatre semaines de délais pour rattraper ton absence, pendant lesquels tu peux faire des courses.<br />
Pour choisir tes rattrapages et demander une extension, rendez-vous dans l'Espace Membre à la rubrique Mes Services et mes points.<br />
<div class="faq_link_button_area">
<a
href="https://lacagette-coop.fr/?CompteurPoints?usp=sf_link"
target="_blank"
type="button"
class="btn--primary faq_link_button"
>
Mes services et mes points
</a>
</div>
</div>
<div class="grp_text">
<h3>Si tu es désinscrit.e :</h3>
Dans ce cas là, tu ne peux plus rien faire, ni t’inscrire à un rattrapage ni faire tes courses. il faut te réinscrire sur un créneau.<br />
Pour te réinscrire, il faut remplir le formulaire &quot;Se réinscrire sur un créneau&quot; et attendre qu'il soit traité. Dès que tu es réinscrit sur un créneau, n'oublie pas de t'inscrire à tes deux rattrapages.<br />
</div>
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="unsuscribe_form_link_btn2"
>
Réinscription à un crénau
</a>
</div>
<div class="grp_text">
Si tu ne comprends pas pourquoi tu es désinscrit.e ou suspendu.e, tu peux le signaler au bureau des membres pour qu'il règle ton problème. N'hésite pas à renseigner un maximum d'information sur ta situation pour nous aider à régler ton problème : <br />
</div>
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="request_form_link_btn2"
>
Faire une demande au BDM
</a>
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >003 Mon binôme: créer un binôme, se désolidariser de son binôme, changer de binôme</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h3><b>Créer un binôme</b></h3>
Afin de faciliter l’intégration de personnes qui ont des difficultés à rejoindre la Cagette et par mesure de solidarité : Chaque coopérateur·rice peut rattacher un·e autre coopérateur·rice. <br />
Cependant, La Cagette a besoin de forces vives pour pouvoir fonctionner correctement et il est nécessaire qu'un maximum de personnes soient présentes sur les créneaux. <h4><b>C'est pourquoi ce statut de binôme, qui doit rester exceptionnel, est réservé à des personnes qui rencontrent de grandes difficultés organisationnelles dans leur quotidien.</b></h4> Ces difficultés sont à évaluer par la personne concernée. Par exemple : les mères ou les pères célibataires avec enfants, les personnes ayant une charge de travail et /ou des conditions particulières de travail, les aidants, les personnes rencontrant des problèmes de santé... Ce statut est transitoire selon l’évolution des conditions de vie de la personne concernée.
<b>Comprendre le contexte du binôme : Titulaire du créneau et suppléant</b><br />
La procédure de création de binôme concerne deux membres, le titulaire et le suppléant.<br />
<b>Le titulaire </b>est le coopérateur qui va devenir responsable du binôme. Il est responsable de la réalisation des services. Par exemple, si le titulaire n’est pas à jour de ses services, les deux membres du binôme ne pourront plus faire leurs courses. C’est le titulaire qui doit faire la demande de binôme. C'est à partir de son espace membre que les services sont gérés.<br />
<b>Le suppléant</b> est la personne qui va se rattacher au compte du titulaire. Elle n’aura pas d’obligation de faire un service et pourra faire ses courses. Son statut est &quot;désinscrit&quot;, c'est normal. Lorsqu'ielle vient faire un service c'est au nom du de la titulaire du binôme. En revanche, lors du passage en caisse chaque membre du binôme doit donner son propre nom.<br />
Le titulaire et le suppléant peuvent s’organiser comme ils l’entendent pour remplir les obligations du titulaire. Ils peuvent faire un service sur deux ou se répartir l’année en deux semestres, ou bien encore, le titulaire peut faire tous les services et le suppléant aucun. Peu importe, ça les regarde.<br />
<b>Il existe 3 conditions pour créer un binôme :</b><br />
Les deux coopérateur.trice.s doivent justifier que leur situation nécessite un binôme.<br />
Les deux coopérateur.trice.s doivent avoir fait au moins 4 créneaux avant de pouvoir former un binôme,<br />
Les deux coopérateur.trice.s doivent être “à jour” pour former un binôme. Si l’un des membres n’est pas à jour, ses points négatifs peuvent être transférés à l’autre membre. Ainsi, une personne qui a 2 points d’avance peut rattacher à son compte une personne qui a -2 points à son compteur.<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="associated_subscribe_form_link_btn"
>
Création de binôme
</a>
</div>
</div>
<div class="grp_text">
<h3><b>Se désolidariser de son binôme</b></h3>
Si pour quelconque raison l&quot;une des deux personnes composant le binôme souhaite le désolidarisé il faut remplir le formulaire qui suit. Par défaut nous inscrirons la personne suppléante sur le même créneau que la personne titulaire. Si cela ne lui convient pas elle devra demander à changer de créneau.<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="associated_unsubscribe_form_link_btn"
>
Ce désolidariser de binôme
</a>
</div>
</div>
<div class="grp_text">
<h3><b>Changer de binôme</b></h3>
Si l'un.e des deux personne composant le binôme souhaite changer de binôme il faut faire les deux demandes l'une après l'autre.
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >004 Spécial Covid: Tu as la Covid ou tu es cas contact, fin d'exemption Covid</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h3><b>Tu as la Covid ou tu es cas contact que faire vis-à-vis de La Cagette ?</b></h3>
<br />
• Si tu as participé à un service merci de remplir ce formulaire, le comité Crise sanitaire se chargera de prévenir les personnes avec qui tu as pu être en contact. Si l'ARS te demande les noms des personnes tu peux les renvoyer vers l'adresse mail crisesanitaire@lacagette-coop.fr, le comité se chargera de leur transmettre les coordonnées des personnes concernées.<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="covid_form_link_btn"
>
J'ai le covid
</a>
</div>
</div>
<div class="grp_text">
<h3><b>Tu es cas contact que faire ?</b></h3>
Les recommandations de l'Agence Régionale de Santé sont les suivantes :<br />
• Si vous vivez seul•e :<br />
- Faites-vous tester 7 jours après le dernier contact avec la personne infectée, ne faites pas votre test trop tôt sinon il risque d'être négatif alors que vous pouvez être infecté•e<br />
- Isolez-vous et restez chez vous jusqu'au résultat du test.<br />
- Si le résultat du test est négatif et que vous n'avez pas de symptôme vous pouvez mettre fin à votre isolement.<br />
- Si le résultat du test est positif restez isolé·e 7 jours après la date du test.<br />
• Si vous vivez avec la personne malade :<br />
- Faites-vous tester au plus vite.<br />
- Isolez-vous et restez chez vous jusqu'au résultat du test.<br />
- Si le résultat du test est négatif restez isolé·e tant que la personne avec qui je vis est malade et pendant 7 jours après sa guérison, refaites un test 7 jours après sa guérison.<br />
- Si le résultat du test est positif restez isolé·e 7 jours après la date du test, une fois que vous n'avez plus de fièvre attendez 2 jours avant de mettre fin à votre isolement.<br />
</div>
<div class="grp_text">
<h3><b>Tu ne veux plus être exemptée pour raison Covid, tu souhaites reprendre ton service</b></h3>
Si tu bénéficies de l'exemption Covid mais que tu souhaites reprendre tes services merci de remplir ce formulaire. Tu seras alors réinscrite à ton créneau habituel. A bientôt
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="covid_end_form_link_btn"
>
Je souhaite reprendre mes services suite &agrave; une exemption Covid
</a>
</div>
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >005 Je veux que mes enfants puissent faire les courses à ma place</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h3><b>Dans quel cas ?</b></h3>
Les coops peuvent créer un compte de &quot;mineur rattaché&quot; à leurs enfants pour leur permettre d’aller faire les commissions.<br />
<h3></b>Comment faire ?</b></h3>
Rien de plus simple ! <br />
Il suffit de remplir ce formulaire<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="underage_subscribe_form_link_btn"
>
Cr&eacute;er un compte mineur rattach&eacute;
</a>
</div>
Le Bureau des Membres traitera la demande dès que possible ! <br />
Merci et bonne journée !
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >006 Je veux changer d'adresse mail</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h3><b>Dans quel cas ?</b></h3>
Il arrive qu’au moment de l’inscription, une adresse mail erronée soit saisie. <br />
Il se peut aussi qu’un membre change d’adresse mail.<br />
Or l'adresse mail est utilisée comme identifiant pour se connecter à notre espace membre. <br />
<h3><b>Comment faire ?</b></h2>
C’est très simple ! <br />
Il suffit de remplir ce formulaire<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="change_email_form_link_btn"
>
Changer d'adresse mail
</a>
</div>
Le Bureau des Membres traitera la demande dès que possible ! <br />
Merci et bonne journée !
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >007 Je veux quitter la coopérative</span>
</button>
<div class="input-container panel">
<div class="grp_text">
<h3><b>Dans quel cas ?</b></h3>
Les membres de La Cagette peuvent quitter la coopérative à tout moment, quel que soit le motif.<br />
En ce qui concerne tes parts sociales, tu peux en demander le remboursement. Par défaut, si tu démissionnes et que tu ne fais pas de demande de remboursement, le montant de tes parts sociales sera considéré comme un don à la Cagette. <br />
Cas particulier : <br />
Si tu as acheté plus de 10 parts sociales de la Cagette, tu peux demander le remboursement de tes parts sociales au-delà de 10, tout en restant coopérateur.rice. Pour cela, tu n’as qu’à remplir le formulaire de demande de remboursement ci-dessous.<br />
<br/><br>
<h3><b>Modalités de remboursement</b></h3>
<br>
<h3>Délais de remboursement</h3>
Ta demande de remboursement sera traitée lors de l’Assemblée Générale Ordinaire (AGO) qui statuera sur les comptes de l’exercice comptable au cours duquel ta demande a été faite (soit 4 à 5 mois après le 30 juin qui suit la demande). Après l'assemblée générale ordinaire annuelle, La Cagette pourra procéder au remboursement des anciens associés par virement. Toutefois certaines conditions particulières peuvent différer ce remboursement :<br />
Si le capital de la coopérative a baissé de manière significative au point de mettre en danger la trésorerie de l’entreprise et son fonctionnement dans les mois à venir, l’AGO peut différer le remboursement à l’année suivante en maintenant la valeur de remboursement qu’elle vient de définir. Ce report pourrait se répéter 4 fois selon la situation financière de l’entreprise. Le remboursement doit quoi qu’il en soit intervenir dans un délai de maximum 5 ans à compter de la date de la demande.<br />
<br>
<h3>Valeur de remboursement des parts sociales</h3>
La valeur nominale (d’émission) des parts sociales est fixe dans le temps (10€ la part), mais la valeur de remboursement des parts sociales, elle, varie en fonction des résultats économiques de l’entreprise. La Cagette étant une coopérative à but non lucratif, la valeur de la part ne pourra jamais excéder 10€, mais elle peut être moindre :<br />
La valeur de la part dépend du résultat cumulé de la coopérative depuis sa création. Pour ouvrir le supermarché, nous avons réalisé de gros investissements. Aujourd'hui encore, bien que nos résultats aient été positifs en 2019 et 2020, le résultat net cumulé de la coopérative est négatif. En 2018, nous avons remboursé à une valeur de 5,02€ la part. Puis en 2019, à 7,58€ et en 2020, à 7,82€. Nous espérons pouvoir bientôt pouvoir atteindre une valeur de remboursement de 10€ la part, mais nous ne pouvons pas nous engager sur une année ou une date précise. La valeur de remboursement ne peut pas être connue avant la clôture de l’exercice le 30 juin.<br />
La procédure de calcul de la valeur de remboursement de la part sociale à la Cagette résulte de l’application stricte de l’article 8 de la Loi de 1947 sur les sociétés coopératives. <br />
Si tu souhaites attendre que la part sociale prenne de la valeur avant de te faire rembourser, il faut geler ton compte et demander ta démission et ton remboursement plus tard. Pour cela il suffit de te désinscrire de ton créneau en remplissant le formulaire &quot;Se désinscrire de son créneau&quot; dans la rubrique “Gestion de mon créneau”. Tu resteras membre de la cagette, ton statut sera “désinscrit”, tu n’auras pas de service à faire, et ne pourras plus faire tes courses).<br />
<br><br>
<h3><b>Comment faire ?</b></h3>
C'est très simple : remplis ce formulaire pour obtenir par mail les documents de démission et/ou de demande de remboursement à nous renvoyer.<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="coop_unsubscribe_form_link_btn"
>
Se D&eacute;sinscrire de la coop&eacute;rative
</a>
</div>
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >008 Brigade Solidaire: s'inscrire ou se désinscrire de la brigade </span>
</button>
<div class="input-container panel">
<div class="grp_text">
Tu as du temps et tu souhaites soutenir davantage la Cagette, tu peux rejoindre la Brigade Solidaire. Remplis ce formulaire de contact et ensuite...Comment cela va-t-il fonctionner ?<br />
-&gt; Des membres du comité Crise Sanitaire vont te rappeler pour t'expliquer bien en détail le fonctionnement<br />
-&gt; Il faudra que tu t'inscrives comme d'habitude sur ton espace Membre pour faire un service<br />
-&gt; Tu rejoindras si tu le souhaites le groupe Whatsapp pour être prévenu·e des créneaux critiques<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="helper_subscribe_form_link_btn"
>
Inscription brigade solidaire
</a>
</div>
</div>
<div class="grp_text">
Tu n'as plus la possibilité de participer à la Brigade Solidaire. Merci de remplir le formulaire ci dessous afin que nous te réinscrivions sur ton ancien créneau. Attention si tu étais volant.e tu n'auras plus de créneau car le créneau volant n'existera plus à partir du 1er février 2021. Il te faudra te réinscrire à un créneau ABCD en remplissant le formulaire du même nom.<br />
Merci pour ton aide et ton investissement à la Cagette!!<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="helper_unsubscribe_form_link_btn"
>
D&eacute;sinscription brigade solidaire
</a>
</div>
</div>
</div>
<button type="button" class="accordion btn_faq">
<span class="full_width" >009 Faire une autre demande au BDM: seulement si les autres formulaires ne correspondent pas à ma demande </span>
</button>
<div class="input-container panel">
<div class="grp_text">
<br>
Nous avons créé des formulaires spécifiques pour la plupart des problèmes rencontrés par les membres. Changer de créneau, créer un binôme, ajouter un produit à la gamme, partir en vacances... <br />
Cela dit, nous en découvrons de nouveaux tous les jours.<br />
Si tu n'as pas su quel formulaire remplir, tu es au bon endroit. <br />
Vas-y dit nous tout !<br />
<div class="faq_link_button_area">
<a
href="javascript:void(0);"
target="_blank"
type="button"
class="btn--primary faq_link_button"
id="request_form_link_btn"
>
Faire une demande au BDM
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
......@@ -6,10 +6,12 @@
{% block content %}
<div class="topnav" id="topnav">
<a href="#" class="nav_item active" id="nav_home">Espace Membre</a>
<a href="#" class="nav_item" id="nav_my_info">Mes Infos</a>
<a href="#" class="nav_item" id="nav_my_shifts">Mes Services</a>
<a href="#" class="nav_item" id="nav_shifts_exchange">Échange de services</a>
<a href="javascript:void(0);" class="nav_item active" id="nav_home">Espace Membre</a>
<a href="javascript:void(0);" class="nav_item" id="nav_my_info">Mes Infos</a>
<a href="javascript:void(0);" class="nav_item" id="nav_my_shifts">Mes Services</a>
<a href="javascript:void(0);" class="nav_item" id="nav_shifts_exchange">Échange de services</a>
<a href="javascript:void(0);" class="nav_item" id="nav_faq">Problèmes & Demandes</a>
<a
href="javascript:void(0);"
target="_blank"
......@@ -18,6 +20,7 @@
>
Calendrier ABCD
</a>
{# Disconnection button must have this id (logic in all_common.js) #}
<a href="javascript:void(0);" id="deconnect">Déconnexion</a>
<a href="javascript:void(0);" class="icon" onclick="toggleHeader()">
......
......@@ -62,6 +62,9 @@
Échange de services
</div>
<div class="tile_content">
<div>
Un empêchement ? J'anticipe et déplace mes services jusqu'à 24h avant leur début !
</div>
<div class="home_link_button_area">
<button type="button" class="btn--primary home_link_button" id="go_to_shifts_calendar">
Accéder au calendrier d'échange de services
......
......@@ -4,9 +4,10 @@
{% block additionnal_css %}
<link rel="stylesheet" href="{% static 'css/datatables/jquery.dataTables.css' %}">
<link rel="stylesheet" href="{% static 'css/datatables/responsive.dataTables.min.css' %}">
<link rel="stylesheet" href="{% static 'fullcalendar-5.9.0/lib/main.min.css' %}"></script>
<link rel="stylesheet" href="{% static 'fullcalendar-5.9.0/lib/main.min.css' %}">
<link rel="stylesheet" href="{% static "css/members-space.css" %}?v=">
<link rel="stylesheet" href="{% static "css/members-space-my-shifts.css" %}?v=">
<link rel="stylesheet" href="{% static "css/members-space-faq.css" %}?v=">
<link rel="stylesheet" href="{% static "css/members-space-my-info.css" %}?v=">
<link rel="stylesheet" href="{% static "css/members-space-shifts-exchange.css" %}?v=">
{% endblock %}
......@@ -56,9 +57,9 @@
<div id="calendar_explaination_template">
<h4>Légende du calendrier</h4>
<a class="example-event fc-daygrid-event fc-daygrid-block-event fc-h-event fc-event fc-event-start fc-event-end fc-event-future shift_booked"><div class="fc-event-main"><div class="fc-event-main-frame"><div class="fc-event-time">06:00</div><div class="fc-event-title-container"><div class="fc-event-title fc-sticky"> Clemenceau -- 9/12</div></div></div></div></a>
<p>Un service colorié en noir : je suis déjà inscrit à ce service.</p>
<a class="example-event fc-daygrid-event fc-daygrid-block-event fc-h-event fc-event fc-event-start fc-event-end fc-event-future shift_less_alf"><div class="fc-event-main"><div class="fc-event-main-frame"><div class="fc-event-time">10:45</div><div class="fc-event-title-container"><div class="fc-event-title fc-sticky"> Clemenceau -- 3/12</div></div></div></div></a>
<a class="example-event fc-daygrid-event fc-daygrid-block-event fc-h-event fc-event fc-event-start fc-event-end fc-event-future shift_booked"><div class="fc-event-main"><div class="fc-event-main-frame"><div class="fc-event-time">06:00</div><div class="fc-event-title-container"><div class="fc-event-title fc-sticky">&nbsp;-- 9/12</div></div></div></div></a>
<p>Un service colorié en noir : je suis déjà inscrit.e à ce service.</p>
<a class="example-event fc-daygrid-event fc-daygrid-block-event fc-h-event fc-event fc-event-start fc-event-end fc-event-future shift_less_alf"><div class="fc-event-main"><div class="fc-event-main-frame"><div class="fc-event-time">10:45</div><div class="fc-event-title-container"><div class="fc-event-title fc-sticky">&nbsp;-- 3/12</div></div></div></div></a>
<p>Un service colorié en bleu : je peux m'inscrire à ce service.</p>
<p>3/12 <i class="arrow_explanation_numbers fas fa-arrow-right"></i> il y a déjà 3 places réservées à ce service sur 12 disponibles.
<b>Plus le chiffre de gauche est petit, plus on a besoin de coopérateurs.rices à ce service !</b></p>
......@@ -76,6 +77,20 @@
var app_env = '{{app_env}}';
var forms_link = '{{forms_link}}';
var unsuscribe_form_link = '{{unsuscribe_form_link}}';
var request_form_link = '{{request_form_link}}';
var late_service_form_link = '{{late_service_form_link}}';
var change_template_form_link = '{{change_template_form_link}}';
var associated_subscribe_form_link = '{{associated_subscribe_form_link}}';
var associated_unsubscribe_form_link = '{{associated_unsubscribe_form_link}}';
var template_unsubscribe_form_link = '{{template_unsubscribe_form_link}}';
var change_email_form_link = '{{change_email_form_link}}';
var coop_unsubscribe_form_link = '{{coop_unsubscribe_form_link}}';
var sick_leave_form_link = '{{sick_leave_form_link}}';
var underage_subscribe_form_link = '{{underage_subscribe_form_link}}';
var helper_subscribe_form_link = '{{helper_subscribe_form_link}}';
var helper_unsubscribe_form_link = '{{helper_unsubscribe_form_link}}';
var covid_form_link = '{{covid_form_link}}';
var covid_end_form_link = '{{covid_end_form_link}}';
var member_cant_have_delay_form_link = '{{member_cant_have_delay_form_link}}';
var abcd_calendar_link = "{{abcd_calendar_link}}"
var days_to_hide = "{{daysToHide}}"
......@@ -108,6 +123,7 @@
<script src="{% static "js/members-space-home.js" %}?v="></script>
<script src="{% static "js/members-space-my-info.js" %}?v="></script>
<script src="{% static "js/members-space-my-shifts.js" %}?v="></script>
<script src="{% static "js/members-space-faq.js" %}?v="></script>
<script src="{% static "js/members-space-shifts-exchange.js" %}?v="></script>
<script src="{% static "js/members-space.js" %}?v="></script>
{% endblock %}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment