msp: use all graphical and html resources from MSP
- 3 new views: link management, unlinking confirmation, unlinking done. - corrections to close-popup-redirect.html to work with URL passed through template variables and not the query string
This commit is contained in:
parent
55eb3dbaad
commit
74159aaf51
|
@ -50,6 +50,10 @@ class AppSettings(object):
|
|||
def client_credentials(self):
|
||||
return self._setting('CLIENT_CREDENTIALS', ())
|
||||
|
||||
@property
|
||||
def more_url(self):
|
||||
return self._setting('MORE_URL', 'https://mon.service-public.fr/')
|
||||
|
||||
|
||||
app_settings = AppSettings('MSP_')
|
||||
app_settings.__name__ = __name__
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
#msp-linking {
|
||||
margin: 0px 100px;
|
||||
}
|
||||
|
||||
.msp{
|
||||
margin:0 auto 0 auto;
|
||||
text-align:left;
|
||||
|
@ -7,6 +11,9 @@
|
|||
color:#2B2A91;
|
||||
font-family:arial, verdana, sans-serif;
|
||||
}
|
||||
.msp.connecting {
|
||||
width: 35em;
|
||||
}
|
||||
.msp *{
|
||||
font-family:arial, verdana, sans-serif;
|
||||
font-size:100%;
|
||||
|
@ -337,4 +344,4 @@
|
|||
.msp_esp_logos li{
|
||||
display:inline;
|
||||
margin:0 8px 0 3px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
|
||||
}
|
||||
var next = getParameterByName('next');
|
||||
window.opener.location.href = next || '/';
|
||||
window.opener.location.href = {% if redirect_to %}"{{ redirect_to }}" {% else %}next || '/'{% endif %};
|
||||
window.close();
|
||||
</script>
|
||||
</head>
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
{% extends "base.html"%}
|
||||
{% load sekizai_tags %}
|
||||
{% load staticfiles %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% addtoblock "css" %}<link rel="stylesheet" type="text/css" href="{% static 'msp/css/screen.msp.css' %}"></link>{% endaddtoblock %}
|
||||
{% addtoblock "js" %}<script type="text/javascript" src="{% static "msp/js/domready.js" %}"></script>{% endaddtoblock %}
|
||||
{% addtoblock "js" %}<script type="text/javascript" src="{% static "msp/js/oauth.js" %}"></script>{% endaddtoblock %}
|
||||
<div id="msp-confirm-unlink">
|
||||
<div class="msp">
|
||||
<div class="cadre">
|
||||
<div class="bordure">
|
||||
<h1>Gestion des liaisons : confirmation de suppression</h1>
|
||||
<p>
|
||||
<small><a href="{{ done }}" class="roll">Retour</a></small>
|
||||
</p>
|
||||
<div class="contenu">
|
||||
<div class="barre">
|
||||
<p><strong> Attention, vous allez supprimer votre (ou vos) liaison(s) entre votre compte Partenaire et mon.service-public.fr. </strong></p>
|
||||
|
||||
<p><strong> Supprimer la totalité des liaisons ne supprime ni votre compte mon.service-public.fr ni votre compte sur le site PARTENAIRE.<br />
|
||||
Si vous confirmez cette action, il ne vous sera plus possible d’accéder aux fonctionnalités de mon.service-public à partir de votre compte PARTENAIRE. </strong></p>
|
||||
<p>
|
||||
Confirmez-vous cette action ?
|
||||
</p>
|
||||
</div>
|
||||
<div class="m30">
|
||||
<p class="mb20">
|
||||
<a href="{% url 'msp-unlink' %}?next={{ next|urlencode }}{% if popup %}&popup=1{% endif %}" class="marges user {% if popup %}js-oauth-popup{% endif %}">Confirmer suppression</a>
|
||||
<a href="{{ next }}" class="marges user bis">Annuler</a>
|
||||
</p>
|
||||
<br class="cb" />
|
||||
<br class="cb" />
|
||||
<p>
|
||||
Une fois les liaisons supprimées, mon.service-public.fr n’a plus aucune connaissance de vos liaisons avec votre compte PARTENAIRE et vice versa. Il n'est alors plus possible de suivre vos démarches PARTENAIRE depuis mon.Service-Public.fr ni même de naviguer entre les deux sites sans réauthentification.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span class="retablir"><br /></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -10,7 +10,7 @@ Emprunté sur caf.fr
|
|||
{% endcomment %}
|
||||
|
||||
{% if 'nomsp' not in request.GET %}
|
||||
<div class="msp">
|
||||
<div class="msp connecting">
|
||||
<div class="cadre">
|
||||
<div class="bordure">
|
||||
<div class="marges">
|
||||
|
@ -21,11 +21,11 @@ Emprunté sur caf.fr
|
|||
<p>
|
||||
<strong class="fz">
|
||||
Nouveau : connectez-vous avec
|
||||
<img src="img/mon_service-public.fr_petit.png" width="100" height="25" alt="mon.service-public.fr" />
|
||||
<img src="{% static "msp/img/mon_service-public.fr_petit.png" %}" width="100" height="25" alt="mon.service-public.fr" />
|
||||
</strong>
|
||||
</p>
|
||||
<p class="lien">
|
||||
<a href="https://mon.service-public.fr/portail/app/cms/public/a_propos_du_site" target="_blank" class="roll">En savoir plus</a>
|
||||
<a href="{% url "msp-more-redirect" %}" target="_blank" class="roll">En savoir plus</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
{% extends "base.html"%}
|
||||
{% load sekizai_tags %}
|
||||
{% load staticfiles %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% addtoblock "css" %}<link rel="stylesheet" type="text/css" href="{% static 'msp/css/screen.msp.css' %}"></link>{% endaddtoblock %}
|
||||
<div id="msp-link-management">
|
||||
<div class="msp">
|
||||
<div class="cadre">
|
||||
<div class="bordure">
|
||||
<h1>Gestion des liaisons avec mon.service-public.fr</h1>
|
||||
<p>
|
||||
<small><a href="{{ next }}" class="roll">Retour</a></small>
|
||||
</p>
|
||||
<div class="contenu">
|
||||
<p>
|
||||
<strong>Sur cette page, vous pouvez :</strong>
|
||||
</p>
|
||||
<ul>
|
||||
<!-- <li><strong>Activer ou désactiver le suivi de vos démarches sur mon.service-public.fr</strong></li> -->
|
||||
<li><strong>Supprimer les liaisons vers mon.service-public.fr</strong></li>
|
||||
</ul>
|
||||
|
||||
<!-- <div class="important">
|
||||
<p>
|
||||
Comment recevoir mes documents et informations sur mon.service-public.fr ?
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
En activant le suivi des démarches sur mon.service-public.fr, vous autorisez Partenaire.fr à envoyer des informations et des documents administratifs sur votre compte mon.service-public.fr . Ces informations sont ensuite accessibles depuis le bloc partenaire de mon.service-public.fr et les documents sont consultables dans votre espace confidentiel.
|
||||
</p>
|
||||
<p>
|
||||
<em>Actuellement, le suivi des démarches n’est pas activé</em>
|
||||
</p>
|
||||
<p>
|
||||
<a href="#" class="marges user">Activer le suivi des démarches</a>
|
||||
<img src="img/mon_service-public.fr.png" width="125" height="30" alt="mon.service-public.fr" />
|
||||
</p> -->
|
||||
<div class="important">
|
||||
<p>
|
||||
Comment supprimer toutes les liaisons entre Partenaire.fr et mon.service-public.fr ?
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
Supprimer la totalité des liaisons ne supprime ni votre compte mon.service-public.fr ni votre compte sur le site PARTENAIRE.
|
||||
</p>
|
||||
<p>
|
||||
Une fois les liaisons supprimées, mon.service-public.fr n’aura aucune connaissance de vos comptes PARTENAIRE, et vice versa. Il ne sera alors plus possible de suivre vos démarches PARTENAIRE depuis mon.service-public.fr ni même de naviguer entre les deux sites sans ré-authentification.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="{% url "msp-confirm-unlink" %}?next={{ next }}" class="marges user">Supprimer toutes les liaisons</a>
|
||||
<img src="{% static "msp/img/mon_service-public.fr.png" %}" width="125" height="30" alt="mon.service-public.fr" />
|
||||
</p>
|
||||
</div>
|
||||
<div class="menu">
|
||||
<div class="encart">
|
||||
<div class="bordure">
|
||||
<h2>Qu’est-ce que mon.service-public.fr ?</h2>
|
||||
<p> Simplifiez votre relation avec les services publics, accédez à une information adaptée à votre cas personnel, réalisez et suivez vos démarches administratives en ligne. </p>
|
||||
<p class="centrer">
|
||||
<img src="{% static "msp/img/mon_service-public.fr.png" %}" width="125" height="30" alt="mon.service-public.fr" />
|
||||
</p>
|
||||
<p class="lien">
|
||||
<a href="https://mon.service-public.fr/portail/app/cms/public/a_propos_du_site" class="roll" target="_blank">En savoir plus</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="retablir"><br /></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -2,89 +2,43 @@
|
|||
{% load sekizai_tags %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% addtoblock "css" %}<link rel="stylesheet" type="text/css" href="{% static 'msp/css/msp.css' %}"></link>{% endaddtoblock %}
|
||||
{% addtoblock "css" %}<link rel="stylesheet" type="text/css" href="{% static 'msp/css/screen.msp.css' %}"></link>{% endaddtoblock %}
|
||||
{% addtoblock "js" %}<script type="text/javascript" src="{% static "msp/js/domready.js" %}"></script>{% endaddtoblock %}
|
||||
{% addtoblock "js" %}<script type="text/javascript" src="{% static "msp/js/oauth.js" %}"></script>{% endaddtoblock %}
|
||||
|
||||
<div id="msp-linking">
|
||||
{% if user.is_authenticated and user.mspaccount and user.mspaccount.refresh_token %}
|
||||
<div class="msp">
|
||||
<div class="cadre">
|
||||
<div class="bordure">
|
||||
<h1>Gestion des liaisons avec mon.service-public.fr</h1>
|
||||
<p>
|
||||
<small><a href="#" class="roll">Retour</a></small>
|
||||
</p>
|
||||
<div class="contenu">
|
||||
<p>
|
||||
<strong>Sur cette page, vous pouvez :</strong>
|
||||
</p>
|
||||
<ul>
|
||||
<!-- <li><strong>Activer ou désactiver le suivi de vos démarches sur mon.service-public.fr</strong></li> -->
|
||||
<li><strong>Supprimer les liaisons vers mon.service-public.fr</strong></li>
|
||||
</ul>
|
||||
<!--
|
||||
<div class="important">
|
||||
<p>
|
||||
Comment recevoir mes documents et informations sur mon.service-public.fr ?
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
En activant le suivi des démarches sur mon.service-public.fr, vous autorisez Partenaire.fr à envoyer des informations et des documents administratifs sur votre compte mon.service-public.fr . Ces informations sont ensuite accessibles depuis le bloc partenaire de mon.service-public.fr et les documents sont consultables dans votre espace confidentiel.
|
||||
</p>
|
||||
<p>
|
||||
<em>Actuellement, le suivi des démarches n’est pas activé</em>
|
||||
</p>
|
||||
<p>
|
||||
<a href="#" class="marges user">Activer le suivi des démarches</a>
|
||||
<img src="img/mon_service-public.fr.png" width="125" height="30" alt="mon.service-public.fr" />
|
||||
</p>
|
||||
-->
|
||||
<div class="important">
|
||||
<p>
|
||||
Comment supprimer toutes les liaisons entre Partenaire.fr et mon.service-public.fr ?
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
Supprimer la totalité des liaisons ne supprime ni votre compte mon.service-public.fr ni votre compte sur le site PARTENAIRE.
|
||||
</p>
|
||||
<p>
|
||||
Une fois les liaisons supprimées, mon.service-public.fr n’aura aucune connaissance de vos comptes PARTENAIRE, et vice versa. Il ne sera alors plus possible de suivre vos démarches PARTENAIRE depuis mon.service-public.fr ni même de naviguer entre les deux sites sans ré-authentification.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="{% url 'msp-unlink' %}?next={{ request.get_full_path }}{% if popup %}&popup=1{% endif %}" data-agc="{{ user.mspaccount.agc }}" class="{% if popup %}js-oauth-popup{% endif %} marges user">Supprimer toutes les liaisons</a>
|
||||
<img src="img/mon_service-public.fr.png" width="125" height="30" alt="mon.service-public.fr" />
|
||||
</p>
|
||||
</div>
|
||||
<div class="menu">
|
||||
<div class="encart">
|
||||
<div class="bordure">
|
||||
<h2>Qu’est-ce que mon.service-public.fr ?</h2>
|
||||
<p> Simplifiez votre relation avec les services publics, accédez à une information adaptée à votre cas personnel, réalisez et suivez vos démarches administratives en ligne. </p>
|
||||
<p class="centrer">
|
||||
<img src="img/mon_service-public.fr.png" width="125" height="30" alt="mon.service-public.fr" />
|
||||
</p>
|
||||
<p class="lien">
|
||||
<a href="https://mon.service-public.fr/portail/app/cms/public/a_propos_du_site" target="_blank" class="roll">En savoir plus</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="retablir"><br /></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="msp">
|
||||
<div class="cadre">
|
||||
<p class="centrer">
|
||||
<img src="img/toutes_vos_demarches.png" width="140" height="35" alt="Vous êtes actuellement en connexion avec" />
|
||||
<img src="img/mon_service-public.fr.png" width="125" height="30" alt="mon.service-public.fr" />
|
||||
<img src="{% static "msp/img/toutes_vos_demarches.png" %}" width="140" height="35" alt="Vous êtes actuellement en connexion avec" />
|
||||
<img src="{% static "msp/img/mon_service-public.fr.png" %}" width="125" height="30" alt="mon.Service-Public.fr" />
|
||||
</p>
|
||||
<ul class="fond">
|
||||
<li class="picto">
|
||||
<p class="lien">
|
||||
<a href="{% url "msp-more-redirect" %}" target="_blank" class="roll">En savoir plus</a>
|
||||
</p>
|
||||
</li>
|
||||
<li class="picto utilisateur">
|
||||
<p class="lien">
|
||||
<a href="{% url "msp-link-management" %}?next={{ request.get_full_path|urlencode }}" class="roll">Gérer mes liaisons</a>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="msp" style="width: 300px">
|
||||
<div class="cadre">
|
||||
<p class="centrer">
|
||||
<img src="{% static "msp/img/toutes_vos_demarches.png" %}" width="140" height="35" alt="Vous êtes actuellement en connexion avec" />
|
||||
<img src="{% static "msp/img/mon_service-public.fr.png" %}" width="125" height="30" alt="mon.service-public.fr" />
|
||||
</p>
|
||||
<ul class="fond">
|
||||
<li class="picto">
|
||||
<p class="lien">
|
||||
<a href="https://mon.service-public.fr/portail/app/cms/public/a_propos_du_site" target="_blank" class="roll">En savoir plus</a>
|
||||
<a href="{% url "msp-more-redirect" %}" target="_blank" class="roll">En savoir plus</a>
|
||||
</p>
|
||||
</li>
|
||||
<li class="picto utilisateur">
|
||||
|
@ -96,4 +50,5 @@
|
|||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
{% extends "base.html"%}
|
||||
{% load sekizai_tags %}
|
||||
{% load staticfiles %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% addtoblock "css" %}<link rel="stylesheet" type="text/css" href="{% static 'msp/css/screen.msp.css' %}"></link>{% endaddtoblock %}
|
||||
<div class="msp">
|
||||
<div class="cadre">
|
||||
<div class="bordure">
|
||||
<h1>Liaisons supprimées !</h1>
|
||||
<p>
|
||||
<small><a href="{{ next }}" class="roll">Retour</a></small>
|
||||
</p>
|
||||
<div class="contenu">
|
||||
<div class="barre">
|
||||
<p>
|
||||
Votre demande de suppression de toutes les liaisons entre votre compte PARTENAIRE et mon.Service-Public.fr a bien été prise en compte.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="menu">
|
||||
|
||||
</div>
|
||||
<span class="retablir"><br /></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -1,12 +1,16 @@
|
|||
from django.conf.urls import patterns, include, url
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('msp.views',
|
||||
url(r'^login/$', 'login', name='msp-login'),
|
||||
url(r'^link/$', 'link', name='msp-link'),
|
||||
url(r'^login-or-link/$', 'login_or_link', name='msp-login-or-link'),
|
||||
url(r'^unlink/$', 'unlink', name='msp-unlink'),
|
||||
url(r'^link-management/$', 'link_management', name='msp-link-management'),
|
||||
url(r'^link-management/unlink/confirm/$', 'confirm_unlink', name='msp-confirm-unlink'),
|
||||
url(r'^link-management/unlink/done/$', 'unlink_done', name='msp-unlink-done'),
|
||||
url(r'^link-management/unlink/$', 'unlink', name='msp-unlink'),
|
||||
url(r'^authorize/$', 'authorize', name='msp-authorize'),
|
||||
url(r'^access_token/$', 'access_token', name='msp-access-token'),
|
||||
url(r'^documents/$', 'documents', name='msp-documents'),
|
||||
url(r'^documents/(?P<doc_id>[^/]*)/$', 'document', name='msp-document'),
|
||||
url(r'^more/$', 'more_redirect', name='msp-more-redirect'),
|
||||
)
|
||||
|
|
|
@ -9,13 +9,14 @@ import json
|
|||
|
||||
from requests_oauthlib import OAuth2Session
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.views.generic import View
|
||||
from django.views.generic import View, RedirectView
|
||||
from django.views.generic.base import TemplateView
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from django.contrib.auth import authenticate, login as auth_login, REDIRECT_FIELD_NAME
|
||||
from django.contrib.auth.views import redirect_to_login
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib.auth.decorators import login_required, user_passes_test
|
||||
from django.contrib import messages
|
||||
from django.shortcuts import resolve_url, render
|
||||
from django.utils.translation import ugettext as _
|
||||
|
@ -24,8 +25,16 @@ from django.conf import settings
|
|||
from django.core.cache import InvalidCacheBackendError, get_cache
|
||||
from django.views.decorators.clickjacking import xframe_options_exempt
|
||||
|
||||
from . import app_settings
|
||||
from . import models
|
||||
from . import app_settings, models
|
||||
|
||||
def user_has_mspaccount(user):
|
||||
'''Return True if user a link to MSP'''
|
||||
try:
|
||||
return user.mspaccount is not None
|
||||
except models.MspAccount.DoesNotExist:
|
||||
return False
|
||||
|
||||
mspaccount_required = user_passes_test(user_has_mspaccount, '/')
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -202,15 +211,20 @@ class UnlinkView(PopupViewMixin, MspOAuthSessionViewMixin, TemplateView):
|
|||
|
||||
def get(self, request, *args, **kwargs):
|
||||
qs = models.MspAccount.objects.filter(user=request.user)
|
||||
count = qs.count()
|
||||
result = self.api_call('app/rest/agc', method='delete')
|
||||
if result.status_code // 100 == 2:
|
||||
qs.delete()
|
||||
if count:
|
||||
messages.info(request, _('msp link was deleted'))
|
||||
logger.debug('%d msp link deleted', count)
|
||||
if qs.exists():
|
||||
result = self.api_call('app/rest/agc', method='delete')
|
||||
if result.status_code // 100 == 2:
|
||||
qs.delete()
|
||||
logger.debug('all link deleted for %r', request.user)
|
||||
next_url = self.redirect_to(request, *args, **kwargs)
|
||||
msp_unlink_url = reverse('msp-unlink-done')
|
||||
next_url = '{0}?{1}'.format(msp_unlink_url,
|
||||
urllib.urlencode({REDIRECT_FIELD_NAME: next_url}))
|
||||
return self.redirect(request, next_url=next_url)
|
||||
else:
|
||||
logger.debug('error when deleting msp link %r', result.content)
|
||||
else:
|
||||
logger.debug('error when deleting msp link %r', result.content)
|
||||
logger.debug('no msp account exist doing nothing')
|
||||
return self.redirect(request)
|
||||
|
||||
unlink = login_required(UnlinkView.as_view())
|
||||
|
@ -413,3 +427,40 @@ class LoginOrLinkView(PopupViewMixin, MspOAuthSessionViewMixin, View):
|
|||
|
||||
|
||||
login_or_link = LoginOrLinkView.as_view()
|
||||
|
||||
class TemplateWithNextUrlView(TemplateView):
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super(TemplateWithNextUrlView, self).get_context_data(**kwargs)
|
||||
ctx['next'] = self.request.GET.get('next') or \
|
||||
getattr(settings, 'LOGIN_REDIRECT_URL', '/')
|
||||
return ctx
|
||||
|
||||
class LinkManagementView(TemplateWithNextUrlView):
|
||||
template_name = 'msp/link_management.html'
|
||||
|
||||
link_management = mspaccount_required(LinkManagementView.as_view())
|
||||
link_management = login_required(link_management)
|
||||
|
||||
class ConfirmUnlinkView(TemplateWithNextUrlView):
|
||||
template_name = 'msp/confirm_unlink.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super(ConfirmUnlinkView, self).get_context_data(**kwargs)
|
||||
ctx['popup'] = True
|
||||
return ctx
|
||||
|
||||
confirm_unlink = mspaccount_required(ConfirmUnlinkView.as_view())
|
||||
confirm_unlink = login_required(confirm_unlink)
|
||||
|
||||
|
||||
class UnlinkDoneView(TemplateWithNextUrlView):
|
||||
template_name = 'msp/unlink_done.html'
|
||||
|
||||
unlink_done = UnlinkDoneView.as_view()
|
||||
|
||||
class MoreRedirectView(RedirectView):
|
||||
def get_redirect_url(self, *args, **kwargs):
|
||||
return app_settings.more_url
|
||||
|
||||
more_redirect = MoreRedirectView.as_view()
|
||||
|
||||
|
|
Reference in New Issue