mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-27 21:16:28 +02:00
data loads now
This commit is contained in:
parent
7bd0b06e70
commit
d7fa9e8894
9 changed files with 154 additions and 66 deletions
|
@ -1872,17 +1872,17 @@ class MembersTable extends LoadTableBase {
|
||||||
loadTable(page, sortBy = this.currentSortBy, order = this.currentOrder, scroll = this.scrollToTable, status = this.currentStatus, searchTerm =this.currentSearchTerm, portfolio = this.portfolioValue) {
|
loadTable(page, sortBy = this.currentSortBy, order = this.currentOrder, scroll = this.scrollToTable, status = this.currentStatus, searchTerm =this.currentSearchTerm, portfolio = this.portfolioValue) {
|
||||||
|
|
||||||
// --------- SEARCH
|
// --------- SEARCH
|
||||||
// let searchParams = new URLSearchParams(
|
let searchParams = new URLSearchParams(
|
||||||
// {
|
{
|
||||||
// "page": page,
|
"page": page,
|
||||||
// "sort_by": sortBy,
|
"sort_by": sortBy,
|
||||||
// "order": order,
|
"order": order,
|
||||||
// "status": status,
|
"status": status,
|
||||||
// "search_term": searchTerm
|
"search_term": searchTerm
|
||||||
// }
|
}
|
||||||
// );
|
);
|
||||||
// if (portfolio)
|
if (portfolio)
|
||||||
// searchParams.append("portfolio", portfolio)
|
searchParams.append("portfolio", portfolio)
|
||||||
|
|
||||||
|
|
||||||
// --------- FETCH DATA
|
// --------- FETCH DATA
|
||||||
|
@ -1897,7 +1897,7 @@ class MembersTable extends LoadTableBase {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let url = `${baseUrlValue}?${searchParams.toString()}`
|
let url = `${baseUrlValue}?${searchParams.toString()}` //TODO: uncomment for search function
|
||||||
fetch(url)
|
fetch(url)
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
|
@ -1913,17 +1913,21 @@ class MembersTable extends LoadTableBase {
|
||||||
const memberList = document.querySelector('.members__table tbody');
|
const memberList = document.querySelector('.members__table tbody');
|
||||||
memberList.innerHTML = '';
|
memberList.innerHTML = '';
|
||||||
|
|
||||||
|
if (data.members)
|
||||||
|
{
|
||||||
data.members.forEach(member => {
|
data.members.forEach(member => {
|
||||||
// const actionUrl = domain.action_url;
|
// const actionUrl = domain.action_url;
|
||||||
|
const member_name = member.name;
|
||||||
|
const last_active = member.last_active;
|
||||||
|
|
||||||
const row = document.createElement('tr');
|
const row = document.createElement('tr');
|
||||||
|
|
||||||
row.innerHTML = `
|
row.innerHTML = `
|
||||||
<th scope="row" role="rowheader" data-label="member name">
|
<th scope="row" role="rowheader" data-label="member name">
|
||||||
TEMP -- member ID
|
${member_name}
|
||||||
</th>
|
</th>
|
||||||
<td data-sort-value="${member.id}" data-label="ID">
|
<td data-sort-value="${last_active}" data-label="name">
|
||||||
${member.id}
|
${last_active}
|
||||||
</td>
|
</td>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
@ -1939,6 +1943,26 @@ class MembersTable extends LoadTableBase {
|
||||||
|
|
||||||
memberList.appendChild(row);
|
memberList.appendChild(row);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//TODO: error message?
|
||||||
|
const row = document.createElement('tr');
|
||||||
|
row.innerHTML = `
|
||||||
|
<th scope="row" role="rowheader" data-label="member name">
|
||||||
|
ERROR
|
||||||
|
</th>
|
||||||
|
<td data-sort-value="test" data-label="name">
|
||||||
|
ERROR
|
||||||
|
</td>
|
||||||
|
`;
|
||||||
|
|
||||||
|
memberList.appendChild(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// initialize tool tips immediately after the associated DOM elements are added
|
// initialize tool tips immediately after the associated DOM elements are added
|
||||||
initializeTooltips();
|
initializeTooltips();
|
||||||
|
|
||||||
|
|
|
@ -22,18 +22,20 @@ from registrar.views.report_views import (
|
||||||
ExportDataTypeUser,
|
ExportDataTypeUser,
|
||||||
)
|
)
|
||||||
|
|
||||||
from registrar.views.domain_request import Step
|
# --jsons
|
||||||
from registrar.views.domain_requests_json import get_domain_requests_json
|
from registrar.views.domain_requests_json import get_domain_requests_json
|
||||||
from registrar.views.transfer_user import TransferUserView
|
from registrar.views.domains_json import get_domains_json
|
||||||
|
from registrar.views.portfolio_members_json import get_portfolio_members_json
|
||||||
from registrar.views.utility.api_views import (
|
from registrar.views.utility.api_views import (
|
||||||
get_senior_official_from_federal_agency_json,
|
get_senior_official_from_federal_agency_json,
|
||||||
get_federal_and_portfolio_types_from_federal_agency_json,
|
get_federal_and_portfolio_types_from_federal_agency_json,
|
||||||
)
|
)
|
||||||
from registrar.views.domains_json import get_domains_json
|
|
||||||
|
from registrar.views.domain_request import Step
|
||||||
|
from registrar.views.transfer_user import TransferUserView
|
||||||
from registrar.views.utility import always_404
|
from registrar.views.utility import always_404
|
||||||
from api.views import available, get_current_federal, get_current_full
|
from api.views import available, get_current_federal, get_current_full
|
||||||
|
|
||||||
|
|
||||||
DOMAIN_REQUEST_NAMESPACE = views.DomainRequestWizard.URL_NAMESPACE
|
DOMAIN_REQUEST_NAMESPACE = views.DomainRequestWizard.URL_NAMESPACE
|
||||||
domain_request_urls = [
|
domain_request_urls = [
|
||||||
path("", views.DomainRequestWizard.as_view(), name=""),
|
path("", views.DomainRequestWizard.as_view(), name=""),
|
||||||
|
@ -280,7 +282,7 @@ urlpatterns = [
|
||||||
),
|
),
|
||||||
path("get-domains-json/", get_domains_json, name="get_domains_json"),
|
path("get-domains-json/", get_domains_json, name="get_domains_json"),
|
||||||
path("get-domain-requests-json/", get_domain_requests_json, name="get_domain_requests_json"),
|
path("get-domain-requests-json/", get_domain_requests_json, name="get_domain_requests_json"),
|
||||||
path("get-portfolio-members-json/", get_domains_json, name="get_portfolio_members_json"),
|
path("get-portfolio-members-json/", get_portfolio_members_json, name="get_portfolio_members_json"),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Djangooidc strips out context data from that context, so we define a custom error
|
# Djangooidc strips out context data from that context, so we define a custom error
|
||||||
|
|
|
@ -68,6 +68,9 @@ class Command(BaseCommand):
|
||||||
if parse_domains or both:
|
if parse_domains or both:
|
||||||
self.handle_portfolio_domains(portfolio, federal_agency)
|
self.handle_portfolio_domains(portfolio, federal_agency)
|
||||||
|
|
||||||
|
if parse_domains or both:
|
||||||
|
self.handle_portfolio_members(portfolio, federal_agency)
|
||||||
|
|
||||||
def create_or_modify_portfolio(self, federal_agency):
|
def create_or_modify_portfolio(self, federal_agency):
|
||||||
"""Creates or modifies a portfolio record based on a federal agency."""
|
"""Creates or modifies a portfolio record based on a federal agency."""
|
||||||
portfolio_args = {
|
portfolio_args = {
|
||||||
|
@ -253,3 +256,12 @@ class Command(BaseCommand):
|
||||||
DomainInformation.objects.bulk_update(domain_infos, ["portfolio", "sub_organization"])
|
DomainInformation.objects.bulk_update(domain_infos, ["portfolio", "sub_organization"])
|
||||||
message = f"Added portfolio '{portfolio}' to {len(domain_infos)} domains"
|
message = f"Added portfolio '{portfolio}' to {len(domain_infos)} domains"
|
||||||
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, message)
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, message)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_portfolio_members(self, portfolio: Portfolio, federal_agency: FederalAgency):
|
||||||
|
"""
|
||||||
|
Associate portfolio with members for a federal agency.
|
||||||
|
Updates all relevant member records.
|
||||||
|
"""
|
||||||
|
# TODO: future ticket?
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ from django.db.models.manager import BaseManager
|
||||||
from typing import List
|
from typing import List
|
||||||
from registrar.utility.enums import LogCode
|
from registrar.utility.enums import LogCode
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
TODO: future ticket?
|
TODO: future ticket?
|
||||||
=====================
|
=====================
|
||||||
-->
|
-->
|
||||||
<!-- <div class="section-outlined__search {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6{% endif %}">
|
<div class="section-outlined__search {% if portfolio %} mobile:grid-col-12 desktop:grid-col-6{% endif %}">
|
||||||
<section aria-label="Members search component" class="margin-top-2">
|
<section aria-label="Members search component" class="margin-top-2">
|
||||||
<form class="usa-search usa-search--small" method="POST" role="search">
|
<form class="usa-search usa-search--small" method="POST" role="search">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
</svg>
|
</svg>
|
||||||
Reset
|
Reset
|
||||||
</button>
|
</button>
|
||||||
<label class="usa-sr-only" for="members__search-field">Search by domain name</label>
|
<label class="usa-sr-only" for="members__search-field">Search by member name</label>
|
||||||
<input
|
<input
|
||||||
class="usa-input"
|
class="usa-input"
|
||||||
id="members__search-field"
|
id="members__search-field"
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
</div> -->
|
</div>
|
||||||
<!-- ---------- Export as CSV ---------- -->
|
<!-- ---------- Export as CSV ---------- -->
|
||||||
{% if portfolio_members_count and portfolio_members_count > 0 %}
|
{% if portfolio_members_count and portfolio_members_count > 0 %}
|
||||||
<!--
|
<!--
|
||||||
|
|
|
@ -6,6 +6,10 @@ from django.contrib.auth.decorators import login_required
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
|
||||||
|
#---Logger
|
||||||
|
import logging
|
||||||
|
from venv import logger
|
||||||
|
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,6 +53,8 @@ def get_domain_ids_from_request(request):
|
||||||
Otherwise, return domain ids associated with request.user.
|
Otherwise, return domain ids associated with request.user.
|
||||||
"""
|
"""
|
||||||
portfolio = request.GET.get("portfolio")
|
portfolio = request.GET.get("portfolio")
|
||||||
|
# TODO: delete me
|
||||||
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'domain portfolio = {portfolio}')
|
||||||
if portfolio:
|
if portfolio:
|
||||||
current_user: User = request.user
|
current_user: User = request.user
|
||||||
if current_user.is_org_user(request) and current_user.has_view_all_domains_portfolio_permission(portfolio):
|
if current_user.is_org_user(request) and current_user.has_view_all_domains_portfolio_permission(portfolio):
|
||||||
|
|
|
@ -1,13 +1,17 @@
|
||||||
|
|
||||||
from django.http import JsonResponse
|
from django.http import JsonResponse
|
||||||
from django.core.paginator import Paginator
|
from django.core.paginator import Paginator
|
||||||
from registrar.models import DomainRequest
|
|
||||||
from django.utils.dateformat import format
|
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.urls import reverse
|
|
||||||
from django.db.models import Q
|
|
||||||
|
|
||||||
|
from registrar.models.user import User
|
||||||
from registrar.models.user_portfolio_permission import UserPortfolioPermission
|
from registrar.models.user_portfolio_permission import UserPortfolioPermission
|
||||||
|
|
||||||
|
#---Logger
|
||||||
|
import logging
|
||||||
|
from venv import logger
|
||||||
|
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
# DEVELOPER'S NOTE (9-20-24):
|
# DEVELOPER'S NOTE (9-20-24):
|
||||||
# The way this works is first we get a list of "member" objects
|
# The way this works is first we get a list of "member" objects
|
||||||
|
@ -27,12 +31,11 @@ def get_portfolio_members_json(request):
|
||||||
"""Given the current request,
|
"""Given the current request,
|
||||||
get all members that are associated with the given portfolio"""
|
get all members that are associated with the given portfolio"""
|
||||||
|
|
||||||
member_ids = get_member_ids_from_request(request)
|
objects = get_member_objects_from_request(request)
|
||||||
|
if(objects is not None):
|
||||||
|
member_ids = objects.values_list("id", flat=True)
|
||||||
unfiltered_total = member_ids.count()
|
unfiltered_total = member_ids.count()
|
||||||
|
|
||||||
objects = UserPortfolioPermission.objects.filter(id__in=member_ids)
|
|
||||||
unfiltered_total = objects.count()
|
|
||||||
|
|
||||||
# objects = apply_search(objects, request)
|
# objects = apply_search(objects, request)
|
||||||
# objects = apply_status_filter(objects, request)
|
# objects = apply_status_filter(objects, request)
|
||||||
# objects = apply_sorting(objects, request)
|
# objects = apply_sorting(objects, request)
|
||||||
|
@ -56,12 +59,32 @@ def get_portfolio_members_json(request):
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# TODO: clean this up -- this was added to handle NoneType error (test with http://localhost:8080/get-portfolio-members-json/)
|
||||||
|
# Perhaps this is why domain_requests_json does the wierd thing where it returns deomain request ids, then re-fetches the objects...
|
||||||
|
# Or maybe an assumption was made wherein we assume there will never be zero entries returned??
|
||||||
|
return JsonResponse(
|
||||||
|
{
|
||||||
|
"members": [], # "domain_requests": domain_requests, TODO: DELETE ME!
|
||||||
|
"has_next": False,
|
||||||
|
"has_previous": False,
|
||||||
|
"page": 0,
|
||||||
|
"num_pages": 0,
|
||||||
|
"total": 0,
|
||||||
|
"unfiltered_total": 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def get_member_ids_from_request(request):
|
|
||||||
|
def get_member_objects_from_request(request):
|
||||||
"""Given the current request,
|
"""Given the current request,
|
||||||
get all members that are associated with the given portfolio"""
|
get all members that are associated with the given portfolio"""
|
||||||
portfolio = request.GET.get("portfolio")
|
|
||||||
# filter_condition = Q(creator=request.user)
|
# portfolio = request.GET.get("portfolio") #TODO: WHY DOESN"T THIS WORK?? It is empty
|
||||||
|
# TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'portfolio = {portfolio}') # TODO: delete me
|
||||||
|
|
||||||
|
portfolio = request.session.get("portfolio")
|
||||||
|
|
||||||
if portfolio:
|
if portfolio:
|
||||||
# TODO: Permissions??
|
# TODO: Permissions??
|
||||||
# if request.user.is_org_user(request) and request.user.has_view_all_requests_portfolio_permission(portfolio):
|
# if request.user.is_org_user(request) and request.user.has_view_all_requests_portfolio_permission(portfolio):
|
||||||
|
@ -69,10 +92,15 @@ def get_member_ids_from_request(request):
|
||||||
# else:
|
# else:
|
||||||
# filter_condition = Q(portfolio=portfolio, creator=request.user)
|
# filter_condition = Q(portfolio=portfolio, creator=request.user)
|
||||||
|
|
||||||
member_ids = UserPortfolioPermission.objects.filter(
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, "getting permissions") # TODO: delete me
|
||||||
|
permissions = UserPortfolioPermission.objects.filter(
|
||||||
portfolio=portfolio
|
portfolio=portfolio
|
||||||
).values_list("user__id", flat=True)
|
)
|
||||||
return member_ids
|
|
||||||
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'permissions {permissions}') # TODO: delete me
|
||||||
|
members = User.objects.filter(portfolio_permissions__in=permissions)
|
||||||
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKCYAN, f'members {members}') # TODO: delete me
|
||||||
|
return members
|
||||||
|
|
||||||
|
|
||||||
# def apply_search(queryset, request):
|
# def apply_search(queryset, request):
|
||||||
|
@ -175,9 +203,8 @@ def serialize_members(request, member, user):
|
||||||
# ------- SERIALIZE
|
# ------- SERIALIZE
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"id": member.id,
|
"name": member.get_formatted_name(),
|
||||||
# "name": ??,
|
"last_active": member.id,
|
||||||
# "last_active": ??,
|
|
||||||
# ("manage icon...maybe svg_icon??")
|
# ("manage icon...maybe svg_icon??")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,12 @@ from django.views.generic.edit import FormMixin
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
#---Logger
|
||||||
|
import logging
|
||||||
|
from venv import logger
|
||||||
|
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class PortfolioDomainsView(PortfolioDomainsPermissionView, View):
|
class PortfolioDomainsView(PortfolioDomainsPermissionView, View):
|
||||||
|
|
||||||
template_name = "portfolio_domains.html"
|
template_name = "portfolio_domains.html"
|
||||||
|
@ -48,9 +54,14 @@ class PortfolioMembersView(PortfolioMembersPermissionView, View):
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
"""Add additional context data to the template."""
|
"""Add additional context data to the template."""
|
||||||
|
|
||||||
|
if self.request.user.is_authenticated:
|
||||||
|
request.session["new_request"] = True
|
||||||
|
|
||||||
# We can override the base class. This view only needs this item.
|
# We can override the base class. This view only needs this item.
|
||||||
context = {}
|
context = {}
|
||||||
portfolio = self.request.session.get("portfolio")
|
portfolio = self.request.session.get("portfolio")
|
||||||
|
TerminalHelper.colorful_logger(logger.info, TerminalColors.OKGREEN, f'PortfolioMembersView portfolio = {portfolio}')
|
||||||
if portfolio:
|
if portfolio:
|
||||||
|
|
||||||
# # ------ Gets admin members
|
# # ------ Gets admin members
|
||||||
|
@ -79,7 +90,7 @@ class PortfolioMembersView(PortfolioMembersPermissionView, View):
|
||||||
all_members = User.objects.filter(id__in=member_ids)
|
all_members = User.objects.filter(id__in=member_ids)
|
||||||
context["portfolio_members"] = all_members
|
context["portfolio_members"] = all_members
|
||||||
context["portfolio_members_count"] = all_members.count()
|
context["portfolio_members_count"] = all_members.count()
|
||||||
return render(request, "portfolio_members.html")
|
return render(request, "portfolio_members.html", context)
|
||||||
|
|
||||||
class PortfolioNoDomainsView(NoPortfolioDomainsPermissionView, View):
|
class PortfolioNoDomainsView(NoPortfolioDomainsPermissionView, View):
|
||||||
"""Some users have access to the underlying portfolio, but not any domains.
|
"""Some users have access to the underlying portfolio, but not any domains.
|
||||||
|
|
|
@ -15,6 +15,13 @@ import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: delete me
|
||||||
|
import logging
|
||||||
|
from venv import logger
|
||||||
|
from registrar.management.commands.utility.terminal_helper import TerminalColors, TerminalHelper
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class OrderableFieldsMixin:
|
class OrderableFieldsMixin:
|
||||||
"""
|
"""
|
||||||
Mixin to add multi-field ordering capabilities to a Django ModelAdmin on admin_order_field.
|
Mixin to add multi-field ordering capabilities to a Django ModelAdmin on admin_order_field.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue