Skip to content

Commit

Permalink
Fixes GeoNode#10290 complete_ISO_contact_roles_per_ressource_base_wit…
Browse files Browse the repository at this point in the history
…h_multiplicity
  • Loading branch information
mwallschlaeger committed Aug 9, 2023
1 parent da6a170 commit cb9d79b
Show file tree
Hide file tree
Showing 16 changed files with 207 additions and 377 deletions.
58 changes: 37 additions & 21 deletions geonode/base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1649,7 +1649,7 @@ def add_missing_metadata_author_or_poc(self):

@staticmethod
def get_multivalue_role_property_names() -> List[str]:
""" returns list of property names for all contact roles able to
"""returns list of property names for all contact roles able to
handle multiple profile_users
Returns:
Expand All @@ -1660,27 +1660,27 @@ def get_multivalue_role_property_names() -> List[str]:

@staticmethod
def get_multivalue_required_role_property_names() -> List[str]:
""" returns list of property names for all contact roles that are required
"""returns list of property names for all contact roles that are required
Returns:
_type_: List(str)
_description: list of names
"""
return [role.name for role in (set(Roles.get_multivalue_ones()) & set(Roles.get_required_ones()))]

@staticmethod
def get_ui_toggled_role_property_names() -> List[str]:
""" returns list of property names for all contact roles that are toggled of in metadata_editor
"""returns list of property names for all contact roles that are toggled of in metadata_editor
Returns:
_type_: List(str)
_description: list of names
"""
return [role.name for role in (set(Roles.get_toggled_ones()) & set(Roles.get_toggled_ones()))]

# typing not possible due to: from geonode.base.forms import ResourceBaseForm; unable due to circular ...
def set_contact_roles_from_metadata_edit(self, resource_base_form) -> bool:
""" gets a ResourceBaseForm and extracts the Contact Role elements from it
"""gets a ResourceBaseForm and extracts the Contact Role elements from it
Args:
resource_base_form (ResourceBaseForm): ResourceBaseForm with contact roles set
Expand All @@ -1698,7 +1698,7 @@ def set_contact_roles_from_metadata_edit(self, resource_base_form) -> bool:
return failed

def __get_contact_role_elements__(self, role: str) -> Optional[List[settings.AUTH_USER_MODEL]]:
""" general getter of for all contact roles except owner
"""general getter of for all contact roles except owner
Args:
role (str): string coresponding to ROLE_VALUES in geonode/people/enumarations, defining which propery is requested
Expand All @@ -1716,7 +1716,7 @@ def __get_contact_role_elements__(self, role: str) -> Optional[List[settings.AUT
CONTACT_ROLE_USER_PROFILES_ALLOWED_TYPES = Union[settings.AUTH_USER_MODEL, QuerySet, List[settings.AUTH_USER_MODEL]]

def __set_contact_role_element__(self, user_profile: CONTACT_ROLE_USER_PROFILES_ALLOWED_TYPES, role: str):
""" general setter for all contact roles except owner in resource base
"""general setter for all contact roles except owner in resource base
Args:
user_profile (CONTACT_ROLE_USER_PROFILES_ALLOWED_TYPES): _description_
Expand All @@ -1737,11 +1737,13 @@ def __create_role__(
elif isinstance(user_profile, list) and all(isinstance(x, get_user_model()) for x in user_profile):
ContactRole.objects.filter(role=role, resource=self).delete()
return [__create_role__(self, role, profile) for profile in user_profile]
elif user_profile is None:
ContactRole.objects.filter(role=role, resource=self).delete()
else:
logger.error(f"Bad profile format for role: {role} ...")

def get_defined_multivalue_contact_roles(self) -> List[Tuple[List[settings.AUTH_USER_MODEL], str]]:
""" Returns all set contact roles of the ressource with additional ROLE_VALUES from geonode.people.enumarations.ROLE_VALUES. Mainly used to generate output xml more easy.
"""Returns all set contact roles of the ressource with additional ROLE_VALUES from geonode.people.enumarations.ROLE_VALUES. Mainly used to generate output xml more easy.
Returns:
_type_: List[Tuple[List[people object], roles_label_name]]
Expand All @@ -1753,6 +1755,21 @@ def get_defined_multivalue_contact_roles(self) -> List[Tuple[List[settings.AUTH_
if self.__getattribute__(role.name)
}

def get_first_contact_of_role(self, role: str) -> Optional[ContactRole]:
"""
Get the first contact from the specified role.
Parameters:
role (str): The role of the contact.
Returns:
ContactRole or None: The first contact with the specified role, or None if not found.
"""
if contact := ContactRole.objects.filter(role=role).first():
return contact
else:
return None

# Contact Role: POC (pointOfContact)
def __get_poc__(self) -> List[settings.AUTH_USER_MODEL]:
return self.__get_contact_role_elements__(role="pointOfContact")
Expand All @@ -1762,8 +1779,8 @@ def __set_poc__(self, user_profile):

poc = property(__get_poc__, __set_poc__)

@classmethod
def poc_as_csv(self):
@property
def poc_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.poc)

# Contact Role: metadata_author
Expand All @@ -1776,7 +1793,7 @@ def _set_metadata_author(self, user_profile):
metadata_author = property(_get_metadata_author, _set_metadata_author)

@property
def metadata_author_as_csv(self):
def metadata_author_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.metadata_author)

# Contact Role: PROCESSOR
Expand All @@ -1789,7 +1806,7 @@ def _set_processor(self, user_profile):
processor = property(_get_processor, _set_processor)

@property
def processor_as_csv(self):
def processor_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.processor)

# Contact Role: PUBLISHER
Expand All @@ -1802,7 +1819,7 @@ def _set_publisher(self, user_profile):
publisher = property(_get_publisher, _set_publisher)

@property
def publisher_as_csv(self):
def publisher_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.publisher)

# Contact Role: CUSTODIAN
Expand All @@ -1815,7 +1832,7 @@ def _set_custodian(self, user_profile):
custodian = property(_get_custodian, _set_custodian)

@property
def custodian_as_csv(self):
def custodian_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.custodian)

# Contact Role: DISTRIBUTOR
Expand All @@ -1828,10 +1845,9 @@ def _set_distributor(self, user_profile):
distributor = property(_get_distributor, _set_distributor)

@property
def distributor_as_csv(self):
def distributor_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.distributor)


# Contact Role: RESOURCE_USER
def _get_resource_user(self):
return self.__get_contact_role_elements__(role=Roles.RESOURCE_USER.name)
Expand All @@ -1842,7 +1858,7 @@ def _set_resource_user(self, user_profile):
resource_user = property(_get_resource_user, _set_resource_user)

@property
def resource_user_as_csv(self):
def resource_user_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.resource_user)

# Contact Role: RESOURCE_PROVIDER
Expand All @@ -1855,7 +1871,7 @@ def _set_resource_provider(self, user_profile):
resource_provider = property(_get_resource_provider, _set_resource_provider)

@property
def resource_provider_as_csv(self):
def resource_provider_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.resource_provider)

# Contact Role: ORIGINATOR
Expand All @@ -1868,7 +1884,7 @@ def _set_originator(self, user_profile):
originator = property(_get_originator, _set_originator)

@property
def originator_as_csv(self):
def originator_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.originator)

# Contact Role: PRINCIPAL_INVESTIGATOR
Expand All @@ -1881,7 +1897,7 @@ def _set_principal_investigator(self, user_profile):
principal_investigator = property(_get_principal_investigator, _set_principal_investigator)

@property
def principal_investigator_as_csv(self):
def principal_investigator_csv(self):
return ",".join(p.get_full_name() or p.username for p in self.principal_investigator)


Expand Down
1 change: 1 addition & 0 deletions geonode/documents/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,7 @@ def test_patch_principal_investigator(self):
for user_id in user_ids
)
)

def test_file_path_and_doc_path_are_not_returned(self):
"""
If file_path and doc_path should not be visible
Expand Down
97 changes: 17 additions & 80 deletions geonode/documents/templates/layouts/doc_panels.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{% load static %}
{% load floppyforms %}
{% load base_tags %}
{% load contact_roles %}

<!-- Required to make select2 fields work for autocomplete -->
<link href="{% static "vendor/select2/dist/css/select2.css" %}" type="text/css" media="screen" rel="stylesheet" />
Expand Down Expand Up @@ -559,14 +560,14 @@
<!-- Contact Roles -->
<div class="col-xs-12 col-lg-3" >
<div class="panel panel-default" class="collapse" style="margin-top: 5px">
<div class="panel-heading">{% trans "Responsible Parties" %}</div>
{% block document_poc %}
<div class="panel-body check-select">
<span><label for="{{ document_form.poc|id }}">{{ document_form.poc.label }}</label></span>
{{ document_form.poc }}
</div>
{% endblock document_poc %}
</div>
<div class="panel-heading">{% trans "Responsible Parties" %}</div>
{% block document_poc %}
<div class="panel-body check-select">
<span><label for="{{ document_form.poc|id }}">{{ document_form.poc.label }}</label></span>
{{ document_form.poc }}
</div>
{% endblock document_poc %}
</div>
<div class="panel panel-default">
<div class="panel-heading">{% trans "Responsible and Permissions" %}</div>
<div class="panel-body">
Expand All @@ -579,87 +580,23 @@
</div>
</div>
<a href="#id-more-metadata-panel" data-toggle="collapse">{% trans "toggle more Contact Roles" %}</a>
{% block document_more_contact_roles %}
<div class="panel panel-default panel-collapse collapse" collapsed id='id-more-metadata-panel'>
<div class="panel-heading">{% trans "more metadata contact roles" %}</div>
<div class="panel-heading">{% trans "more metadata contact roles" %}</div>
{% for contact_role in UI_ROLES_IN_TOGGLE_VIEW %}
{{document_form|get_item:contact_role}}
{% endfor %}
<div class="panel-body">
{% block document_metadata_author %}
<div>
<span><label for="{{ document_form.metadata_author|id }}">{{ document_form.metadata_author.label }}</label></span>
{{ document_form.metadata_author }}
</div>
{% endblock document_metadata_author %}
</div>
<div class="panel-body">
{% block document_processor %}
<div>
<span><label for="{{ document_form.processor|id }}">{{ document_form.processor.label }}</label></span>
{{ document_form.processor }}
</div>
{% endblock document_processor %}
</div>
<div class="panel-body">
{% block document_publisher %}
<div>
<span><label for="{{ document_form.publisher|id }}">{{ document_form.publisher.label }}</label></span>
{{ document_form.publisher }}
</div>
{% endblock document_publisher %}
</div>
{% getattribute document_form contact_role as cr %}
<div class="panel-body">
{% block document_custodian %}
<div>
<span><label for="{{ document_form.custodian|id }}">{{ document_form.custodian.label }}</label></span>
{{ document_form.custodian }}
<span><label for="{{cr|id}}">{{cr.label}}</label></span>
{{ cr}}
</div>
{% endblock document_custodian %}
</div>
<div class="panel-body">
{% block document_distributor %}
<div>
<span><label for="{{ document_form.distributor|id }}">{{ document_form.distributor.label }}</label></span>
{{ document_form.distributor }}
</div>
{% endblock document_distributor %}
</div>
<div class="panel-body">
{% block document_resource_user %}
<div>
<span><label for="{{ document_form.resource_user|id }}">{{ document_form.resource_user.label }}</label></span>
{{ document_form.resource_user }}
</div>
{% endblock document_resource_user %}
</div>
<div class="panel-body">
{% block document_resource_provider %}
<div>
<span><label for="{{ document_form.resource_provider|id }}">{{ document_form.resource_provider.label }}</label></span>
{{ document_form.resource_provider }}
</div>
{% endblock document_resource_provider %}
</div>
<div class="panel-body">
{% block document_originator %}
<div>
<span><label for="{{ document_form.originator|id }}">{{ document_form.originator.label }}</label></span>
{{ document_form.originator }}
</div>
{% endblock document_originator %}
</div>
<div class="panel-body">
{% block document_principal_investigator %}
<div>
<span><label for="{{ document_form.principal_investigator|id }}">{{ document_form.principal_investigator.label }}</label></span>
{{ document_form.principal_investigator }}
</div>
{% endblock document_principal_investigator %}
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock document_more_contact_roles %}
</div>
<!--End Contact Roles -->
</div>
</div>
</div>
Expand Down
7 changes: 3 additions & 4 deletions geonode/documents/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,6 @@ def document_metadata(
role_form.hidden = True
contact_role_forms_context[f"{role}_form"] = role_form


metadata_author_groups = get_user_visible_groups(request.user)
if not AdvancedSecurityWorkflowManager.is_allowed_to_publish(request.user, document):
document_form.fields["is_published"].widget.attrs.update({"disabled": "true"})
Expand All @@ -486,16 +485,16 @@ def document_metadata(
"document_form": document_form,
"category_form": category_form,
"tkeywords_form": tkeywords_form,
**contact_role_forms_context,
"metadata_author_groups": metadata_author_groups,
"TOPICCATEGORY_MANDATORY": getattr(settings, "TOPICCATEGORY_MANDATORY", False),
"GROUP_MANDATORY_RESOURCES": getattr(settings, "GROUP_MANDATORY_RESOURCES", False),
"UI_MANDATORY_FIELDS": list(
set(getattr(settings, "UI_DEFAULT_MANDATORY_FIELDS", []))
| set(getattr(settings, "UI_REQUIRED_FIELDS", []))
),
"UI_ROLES_IN_TOGGLE_VIEW": document.get_ui_toggled_role_property_names()
}
**contact_role_forms_context,
"UI_ROLES_IN_TOGGLE_VIEW": document.get_ui_toggled_role_property_names(),
},
)


Expand Down
Loading

0 comments on commit cb9d79b

Please sign in to comment.