mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-22 02:36:02 +02:00
wip
This commit is contained in:
parent
1b6e6debf6
commit
948afab166
7 changed files with 109 additions and 17 deletions
|
@ -178,6 +178,11 @@ urlpatterns = [
|
||||||
views.DomainAddUserView.as_view(),
|
views.DomainAddUserView.as_view(),
|
||||||
name="domain-users-add",
|
name="domain-users-add",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"user-profile",
|
||||||
|
views.UserProfileView.as_view(),
|
||||||
|
name="user-profile",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"invitation/<int:pk>/delete",
|
"invitation/<int:pk>/delete",
|
||||||
views.DomainInvitationDeleteView.as_view(http_method_names=["post"]),
|
views.DomainInvitationDeleteView.as_view(http_method_names=["post"]),
|
||||||
|
|
|
@ -158,8 +158,11 @@
|
||||||
</li>
|
</li>
|
||||||
<li class="usa-nav__primary-item display-flex flex-align-center margin-left-2">
|
<li class="usa-nav__primary-item display-flex flex-align-center margin-left-2">
|
||||||
<span class="text-base"> | </span>
|
<span class="text-base"> | </span>
|
||||||
<a href="{% url 'logout' %}"><span class="text-primary">Sign out</span></a>
|
<a href="{% url 'user-profile' %}"><span class="text-primary">Your profile</span></a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="usa-nav__primary-item display-flex flex-align-center margin-left-2">
|
||||||
|
<span class="text-base"> | </span>
|
||||||
|
<a href="{% url 'logout' %}"><span class="text-primary">Sign out</span></a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="{% url 'login' %}"><span>Sign in</span></a>
|
<a href="{% url 'login' %}"><span>Sign in</span></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -3,24 +3,35 @@
|
||||||
{% block title %}
|
{% block title %}
|
||||||
Edit your User Profile |
|
Edit your User Profile |
|
||||||
{% endblock title %}
|
{% endblock title %}
|
||||||
|
{% load static url_helpers %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<main id="main-content" class="grid-container">
|
<main id="main-content" class="grid-container">
|
||||||
|
<div class="grid-col desktop:grid-offset-2 desktop:grid-col-8">
|
||||||
|
<a href="{% url 'home' %}" class="breadcrumb__back">
|
||||||
|
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img">
|
||||||
|
<use xlink:href="{% static 'img/sprite.svg' %}#arrow_back"></use>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<p class="margin-left-05 margin-top-0 margin-bottom-0 line-height-sans-1">
|
||||||
|
Back to manage your domains
|
||||||
|
</p>
|
||||||
|
</a>
|
||||||
|
<h1>Your profile</h1>
|
||||||
|
<p>We require that you maintain accurate contact information. The details you provide will only be used to support the administration of .gov and won’t be made public.</p>
|
||||||
|
<h2>Contact information</h2>
|
||||||
|
<p>Review the details below and update any required information. Note that editing this information won’t affect your Login.gov account information.</p>
|
||||||
|
{% include "includes/required_fields.html" %}
|
||||||
|
|
||||||
<form class="usa-form usa-form--large" method="post" enctype="multipart/form-data">
|
<form class="usa-form usa-form--large" method="post" enctype="multipart/form-data">
|
||||||
<fieldset class="usa-fieldset">
|
<fieldset class="usa-fieldset">
|
||||||
<legend class="usa-legend usa-legend--large">Your profile</legend>
|
<legend class="usa-legend usa-legend--large">Your profile</legend>
|
||||||
<p>
|
|
||||||
Required fields are marked with an asterisk (<abbr
|
|
||||||
title="required"
|
|
||||||
class="usa-hint usa-hint--required"
|
|
||||||
>*</abbr>).
|
|
||||||
</p>
|
|
||||||
{% for field in profile_form %}
|
{% for field in profile_form %}
|
||||||
<label class="usa-label" for="id_{{ field.name }}">{{ field.label }}</label>
|
<label class="usa-label" for="id_{{ field.name }}">{{ field.label }}</label>
|
||||||
{{ field }}
|
{{ field }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<button type="submit" class="usa-button usa-button--big">Save Changes</button>
|
<button type="submit" class="usa-button">Save</button>
|
||||||
</form>
|
</form>
|
||||||
</main>
|
</main>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
|
@ -14,5 +14,6 @@ from .domain import (
|
||||||
DomainInvitationDeleteView,
|
DomainInvitationDeleteView,
|
||||||
DomainDeleteUserView,
|
DomainDeleteUserView,
|
||||||
)
|
)
|
||||||
|
from .user_profile import UserProfileView
|
||||||
from .health import *
|
from .health import *
|
||||||
from .index import *
|
from .index import *
|
||||||
|
|
36
src/registrar/views/user_profile.py
Normal file
36
src/registrar/views/user_profile.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
"""Views for a User Profile.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from django.contrib import messages
|
||||||
|
from django.contrib.messages.views import SuccessMessageMixin
|
||||||
|
from django.db import IntegrityError
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.shortcuts import redirect
|
||||||
|
from django.urls import reverse
|
||||||
|
from django.views.generic.edit import FormMixin
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from registrar.models import (
|
||||||
|
User,
|
||||||
|
)
|
||||||
|
from registrar.views.utility.permission_views import UserProfilePermissionView
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfileView(UserProfilePermissionView):
|
||||||
|
"""
|
||||||
|
Base View for the Domain. Handles getting and setting the domain
|
||||||
|
in session cache on GETs. Also provides methods for getting
|
||||||
|
and setting the domain in cache
|
||||||
|
"""
|
||||||
|
|
||||||
|
template_name = "profile.html"
|
||||||
|
|
||||||
|
# Override get_object to return the logged-in user
|
||||||
|
def get_object(self, queryset=None):
|
||||||
|
return self.request.user # Returns the logged-in user
|
|
@ -382,3 +382,18 @@ class DomainInvitationPermission(PermissionsLoginMixin):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfilePermission(PermissionsLoginMixin):
|
||||||
|
"""Permission mixin that redirects to user profile if user
|
||||||
|
has access, otherwise 403"""
|
||||||
|
|
||||||
|
def has_permission(self):
|
||||||
|
"""Check if this user has access.
|
||||||
|
|
||||||
|
If the user is authenticated, they have access
|
||||||
|
"""
|
||||||
|
if not self.request.user.is_authenticated:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
|
|
||||||
import abc # abstract base class
|
import abc # abstract base class
|
||||||
|
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
from django.views.generic import DetailView, DeleteView, TemplateView
|
from django.views.generic import DetailView, DeleteView, TemplateView
|
||||||
from registrar.models import Domain, DomainRequest, DomainInvitation
|
from registrar.models import Domain, DomainRequest, DomainInvitation, User
|
||||||
from registrar.models.user_domain_role import UserDomainRole
|
from registrar.models.user_domain_role import UserDomainRole
|
||||||
|
|
||||||
from .mixins import (
|
from .mixins import (
|
||||||
|
@ -13,6 +14,7 @@ from .mixins import (
|
||||||
DomainInvitationPermission,
|
DomainInvitationPermission,
|
||||||
DomainRequestWizardPermission,
|
DomainRequestWizardPermission,
|
||||||
UserDeleteDomainRolePermission,
|
UserDeleteDomainRolePermission,
|
||||||
|
UserProfilePermission,
|
||||||
)
|
)
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -142,3 +144,22 @@ class UserDomainRolePermissionDeleteView(UserDeleteDomainRolePermission, DeleteV
|
||||||
|
|
||||||
# variable name in template context for the model object
|
# variable name in template context for the model object
|
||||||
context_object_name = "userdomainrole"
|
context_object_name = "userdomainrole"
|
||||||
|
|
||||||
|
|
||||||
|
class UserProfilePermissionView(UserProfilePermission, DetailView, abc.ABC):
|
||||||
|
"""Abstract base view for user profile view that enforces permissions.
|
||||||
|
|
||||||
|
This abstract view cannot be instantiated. Actual views must specify
|
||||||
|
`template_name`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# DetailView property for what model this is viewing
|
||||||
|
model = get_user_model()
|
||||||
|
# variable name in template context for the model object
|
||||||
|
context_object_name = "user"
|
||||||
|
|
||||||
|
# Abstract property enforces NotImplementedError on an attribute.
|
||||||
|
@property
|
||||||
|
@abc.abstractmethod
|
||||||
|
def template_name(self):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue