From 93dabf73c72c2518d78830d69afd7b3925fc809a Mon Sep 17 00:00:00 2001 From: Frank Duncan <frankduncan@opentechstrategies.com> Date: Thu, 6 Feb 2025 05:35:32 -0600 Subject: [PATCH] Add GFCLFCAnalysis and GFCExploreTable templates --- .../roles/GFC2024/files/GFCExploreTable | 67 ++++ .../roles/GFC2024/files/GFCLFCAnalysis | 346 ++++++++++++++++++ .../ansible/roles/GFC2024/tasks/main.yml | 72 +++- 3 files changed, 478 insertions(+), 7 deletions(-) create mode 100644 competitions/GFC2024/ansible/roles/GFC2024/files/GFCExploreTable create mode 100644 competitions/GFC2024/ansible/roles/GFC2024/files/GFCLFCAnalysis diff --git a/competitions/GFC2024/ansible/roles/GFC2024/files/GFCExploreTable b/competitions/GFC2024/ansible/roles/GFC2024/files/GFCExploreTable new file mode 100644 index 00000000..74dacd0a --- /dev/null +++ b/competitions/GFC2024/ansible/roles/GFC2024/files/GFCExploreTable @@ -0,0 +1,67 @@ +<div id="torque-explore--table-view"> +{%- set top_proposals = [] %} +{%- set wildcard_proposals = [] %} +{%- set other_proposals = [] %} +{%- for proposal in proposal_data %} +{%- if "Achievement Level" in proposal %} +{%- if "Wildcard" in proposal["Achievement Level"] %} +{{- '' if wildcard_proposals.append(proposal) }} +{%- elif "Top Proposal" in proposal["Achievement Level"] %} +{{- '' if top_proposals.append(proposal) }} +{%- else %} +{{- '' if other_proposals.append(proposal) }} +{%- endif %} +{%- endif %} +{%- endfor %} +{%- macro proposal_table(proposals, table_name) %} +{% if proposals %} +<h2>{{table_name}}</h2> +<table class="ots--table" cellpadding="0" cellspacing="0"> + <colgroup> + <col style="width:auto"> + <col style="width:auto"> + <col style="width:auto"> + <col style="width:auto"> + <col style="width:auto;max-width:30%"> + <col style="width:auto"> + </colgroup> + <thead> + <tr> + <th>Rank</th> + <th>Organization Name</th> + <th>Organization Location</th> + <th>Project Category</th> + <th>Tags</th> + </tr> + </thead> + <tbody> + {%- for proposal in proposals %} + <tr> + <td>{{proposal["Rank"]}}</td> + <td><a href="/GFC2024/index.php/{{proposal["MediaWiki Title"]}}">{{proposal["Organization Name"]}}</a></td> + <td>{{proposal["Organization Location"]["City"]}}, {{proposal["Organization Location"]["State/Province"]}}</td> + <td> + {%- set categories = [] %} + {%- for category in proposal['Project Category']['Selection'] -%} + {%- if category == 'My project addresses the Future of Environmental Change along the Gulf Coast.' %} + {{- '' if categories.append("Environmental Change") }} + {%- elif category == 'My project addresses the Future of Healthy and Resilient Communities in the Gulf.' -%} + {{- '' if categories.append("Healthy and Resilitent Communities") }} + {%- elif category == 'My project addresses the Future of the Energy Transition.' -%} + {{- '' if categories.append("Energy Transition") }} + {%- else -%} + {{- '' if categories.append(category)}} + {% endif -%} + {% endfor -%} + {{ categories | join(", ") }} + </td> + <td>{{proposal["Tags"] | join(", ")}}</td> + </tr> + {%- endfor %} + </tbody> +</table> +{%- endif %} +{%- endmacro %} +{{ proposal_table(top_proposals, "Top Proposals") }} +{{ proposal_table(wildcard_proposals, "Wildcards") }} +{{ proposal_table(other_proposals, "Other") }} diff --git a/competitions/GFC2024/ansible/roles/GFC2024/files/GFCLFCAnalysis b/competitions/GFC2024/ansible/roles/GFC2024/files/GFCLFCAnalysis new file mode 100644 index 00000000..6e843338 --- /dev/null +++ b/competitions/GFC2024/ansible/roles/GFC2024/files/GFCLFCAnalysis @@ -0,0 +1,346 @@ +<div class="proposal-body"> + + <div class="proposal-content proposal-analysis"> + + <div class="proposal-analysis--logos"> + <img src="/GFC2024/images/d/d4/LeverForChange_Logo.svg" class="proposal-analysis--logo--lfc" height="70" alt="Lever For Change logo"> + <img src="/GFC2024/images/3/31/GFC2024_Logo.png" class="proposal-analysis--logo--competition" height="70" alt="GFC logo"> + </div> + + <div class="proposal-analysis--preflight"> + <div class="proposal-analysis--preflight--organization">Organization: {{proposal["Organization Name"]}}</div> + <div class="proposal-analysis--preflight--spread-row"> + <div>Evaluation Panel Score: <b>{{proposal["Panel Score"]["LFC Normalized"]}}</b></div> + <div>Evaluation Panel Rank: <b>{{proposal["Panel Rank"]["LFC Normalized"]}}</b></div> + </div> + <div class="proposal-analysis--preflight--spread-row"> + <div>Participatory Review Score: <b>{{proposal["Peer Score"]["LFC Normalized"]}}</b></div> + <div>Participatory Review Rank: <b>{{proposal["Peer Rank"]["LFC Normalized"]}}</b></div> + </div> + </div> + + <div class="proposal-analysis--project-details"> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Project Title</div> + </div> + <div class="proposal-analysis--section-body">{{ proposal['Project Title'] }} ({{ proposal['Application #'] }})</div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">One-Sentence Description</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="line" data-field="LFC Analysis||One Sentence Description">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + {{ proposal['LFC Analysis']['One Sentence Description'] }} + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Project Location</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="line" data-field="LFC Analysis||Project Location">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + {{ proposal['LFC Analysis']['Project Location'] }} + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Lead Organization Type</div> + </div> + <div class="proposal-analysis--section-body"> + {% if proposal['Organization Legal Status'] == 'An entity under section 501(c)(3) and 509(a)(1) or (2) of the IRC' %} + Nonprofit Organization, 501(c)(3) + {% elif proposal['Organization Legal Status'] == 'An entity under section 501(c)(4) of the IRC ' %} + Advocacy Organization, 501(c)(4) + {% elif proposal['Organization Legal Status'] == 'A private foundation under section 501(c)(3) of the IRC' %} + Private Foundation, 501(c)(3) + {% else %} + {{ proposal['Organization Legal Status'] }} + {% endif %} + </div> + </div> + + </div> + + <div class="proposal-analysis--main"> + <h2 class="proposal-analysis--main-header">Lever for Change Insights</h2> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">The Challenge</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||The Challenge">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||The Challenge"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['The Challenge'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['The Challenge']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">The Solutions</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||The Solutions">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||The Solutions"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['The Solutions'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['The Solutions']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Implementation Plan</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Implementation Plan">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Implementation Plan"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Implementation Plan'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Implementation Plan']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Partnerships (if applicable)</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Partnerships">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Partnerships"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Partnerships'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Partnerships']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Strength of Approach</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Strength of Approach">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Strength of Approach"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Strength of Approach'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Strength of Approach']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> +{{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Potential Challenges</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Potential Challenges">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Potential Challenges"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Potential Challenges'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Potential Challenges']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Reputational Risks</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Reputational Risks">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Reputational Risks"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Reputational Risks'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Reputational Risks']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> +{{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--main"> + <h2 class="proposal-analysis--main-header">Gulf Research Program Insights</h2> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Science-Specific Feedback</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Science-Specific Feedback">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Science-Specific Feedback"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Science-Specific Feedback'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Science-Specific Feedback']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Grantee Status</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Grantee Status">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Grantee Status"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Grantee Status'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Grantee Status']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + <div class="proposal-analysis--section"> + <div class="proposal-analysis--section-header"> + <div class="proposal-analysis--section-header-title">Alignment with GRP Grantmaking Approach</div> + <div class="proposal-analysis--section-header-actions"> + <button class="lfc--button small torque-edit-button" data-type="callback" data-callback="LFCTheme.inlineMarkdown" data-field="LFC Analysis||Alignment with GRP Grantmaking Approach">Edit</button> + </div> + </div> + <div class="proposal-analysis--section-body"> + <div class="lfc-theme--torque-markdown-section" data-field="LFC Analysis||Alignment with GRP Grantmaking Approach"> + <div class="lfc-theme--torque-markdown-section--display"> + {%- set default_value = "" -%} + {%- if proposal['LFC Analysis']['Alignment with GRP Grantmaking Approach'] -%} + {{ convert_md_to_html(proposal['LFC Analysis']['Alignment with GRP Grantmaking Approach']) }} + {%- else -%} + {{ convert_md_to_html(default_value) }} + {%- endif -%} + </div> + <pre class="lfc-theme--torque-markdown-section--default-value"> + {{default_value | replace("\n", "_CR_")}} + </pre> + <div class="lfc-theme--torque-markdown-section--edit"> + </div> + </div> + </div> + </div> + + </div> + + </div> + +</div> + diff --git a/competitions/GFC2024/ansible/roles/GFC2024/tasks/main.yml b/competitions/GFC2024/ansible/roles/GFC2024/tasks/main.yml index 82fd9961..adac6bbe 100644 --- a/competitions/GFC2024/ansible/roles/GFC2024/tasks/main.yml +++ b/competitions/GFC2024/ansible/roles/GFC2024/tasks/main.yml @@ -11,15 +11,73 @@ regexp: ^\$wgLogos = [ '1x' => .* ]; line: $wgLogos = [ '1x' => "$wgResourceBasePath/resources/assets/GFC2024_Logo.png" ]; -- name: Transfer GFC Proposal +- name: Transfer GFC Templates copy: - src: GFCProposal - dest: "{{ mediawiki_install_directory }}/GFCProposal" + src: "{{ item }}" + dest: "{{ mediawiki_install_directory }}/{{ item }}" + loop: + - GFCProposal + - GFCLFCAnalysis + - GFCExploreTable -- name: Install GFC Proposal - raw: "php {{ mediawiki_install_directory }}/mediawiki-{{ mediawiki_version }}/maintenance/edit.php -b TorqueConfig:GFCProposal < {{ mediawiki_install_directory }}/GFCProposal" +- name: Install GFC Templates + raw: "php {{ mediawiki_install_directory }}/mediawiki-{{ mediawiki_version }}/maintenance/edit.php -b TorqueConfig:{{ item }} < {{ mediawiki_install_directory }}/{{ item }}" + loop: + - GFCProposal + - GFCLFCAnalysis + - GFCExploreTable -- name: Remove GFC Proposal +- name: Remove GFC Templates file: - path: "{{ mediawiki_install_directory }}/GFCProposal" + path: "{{ mediawiki_install_directory }}/{{ item }}" state: absent + loop: + - GFCProposal + - GFCLFCAnalysis + - GFCExploreTable + +- name: Explore Setup + blockinfile: + path: "{{ mediawiki_install_directory }}/mediawiki-{{ mediawiki_version }}/LocalSettings.php" + marker: "## {mark} ANSIBLE EXPLORE CONFIG" + block: | + $wgTorquePrimaryFilters = [ + "achievement_level", + "tags", + ]; + $wgTorqueFilterDefaults = [ + "achievement_level" => ["Top Proposal", "Wildcard"], + ]; + $wgTorqueFilterGroups = [ + [ + "name" => "primary", + "filters" => [ + "tags", + "achievement_level", + "organization_location", + ] + ], + ]; + $tdcOverrideMessage["torque-explore-filter-organization_location"] = "Filter by State"; + + +- name: Install additional tab configurations + blockinfile: + path: "{{ mediawiki_install_directory }}/mediawiki-{{ mediawiki_version }}/LocalSettings.php" + marker: "## {mark} ANSIBLE ADDITIONAL TAB CONFIG" + block: | + $wgLFCExtraTabOverrides["FINALIST_CANDIDATE"] = function() { + global $wgUser; + if($wgUser->isSafeToLoad() && $wgUser->isAllowed("lfcanalysis")) { + return [ + ["", "Original Proposal"], + ["Evaluations of ", "Evaluations"], + ["LFC Analysis of ", "Analysis"], + ]; + } else { + return [ + ["", "Original Proposal"], + ["Evaluations of ", "Evaluations"], + ]; + } + }; -- GitLab