#3846 Add option to allow any authenticated user to edit meta-data on tickets
Merged 5 years ago by pingou. Opened 5 years ago by pingou.

file modified
+16 -8
@@ -136,7 +136,7 @@ 

          )

  

  

- def _check_ticket_access(issue, assignee=False):

+ def _check_ticket_access(issue, assignee=False, open_access=False):

      """Check if user can access issue. Must be repo committer

      or author to see private issues.

      :param issue: issue object
@@ -146,8 +146,11 @@ 

      """

      # Private tickets require commit access

      _check_private_issue_access(issue)

-     # Public tickets require ticket access

-     error = not is_repo_user(issue.project)

+ 

+     error = False

+     if not open_access:

+         # Public tickets require ticket access

+         error = not is_repo_user(issue.project)

  

      if assignee:

          if (
@@ -824,7 +827,8 @@ 

      _check_token(repo, project_token=False)

  

      issue = _get_issue(repo, issueid)

-     _check_ticket_access(issue, assignee=True)

+     open_access = repo.settings.get("open_metadata_access_to_all", False)

+     _check_ticket_access(issue, assignee=True, open_access=open_access)

  

      status = pagure.lib.get_issue_statuses(flask.g.session)

      form = pagure.forms.StatusForm(
@@ -938,7 +942,8 @@ 

      _check_token(repo)

  

      issue = _get_issue(repo, issueid)

-     _check_ticket_access(issue)

+     open_access = repo.settings.get("open_metadata_access_to_all", False)

+     _check_ticket_access(issue, open_access=open_access)

  

      form = pagure.forms.MilestoneForm(

          milestones=repo.milestones.keys(), csrf_enabled=False
@@ -1125,7 +1130,8 @@ 

      _check_token(repo)

  

      issue = _get_issue(repo, issueid)

-     _check_ticket_access(issue, assignee=True)

+     open_access = repo.settings.get("open_metadata_access_to_all", False)

+     _check_ticket_access(issue, assignee=True, open_access=open_access)

  

      form = pagure.forms.AssignIssueForm(csrf_enabled=False)

      if form.validate_on_submit():
@@ -1312,7 +1318,8 @@ 

      _check_token(repo)

  

      issue = _get_issue(repo, issueid)

-     _check_ticket_access(issue)

+     open_access = repo.settings.get("open_metadata_access_to_all", False)

+     _check_ticket_access(issue, open_access=open_access)

  

      fields = {k.name: k for k in repo.issue_keys}

      if field not in fields:
@@ -1428,7 +1435,8 @@ 

      _check_token(repo)

  

      issue = _get_issue(repo, issueid)

-     _check_ticket_access(issue)

+     open_access = repo.settings.get("open_metadata_access_to_all", False)

+     _check_ticket_access(issue, open_access=open_access)

  

      fields = get_request_data()

  

@@ -10,8 +10,6 @@ 

  

  from __future__ import unicode_literals

  

- import sys

- 

  import sqlalchemy as sa

  import wtforms

  

@@ -9,7 +9,6 @@ 

  """

  

  from __future__ import unicode_literals

- import sys

  

  import sqlalchemy as sa

  import wtforms

@@ -10,8 +10,6 @@ 

  

  from __future__ import unicode_literals

  

- import sys

- 

  import sqlalchemy as sa

  import wtforms

  

file modified
+1
@@ -630,6 +630,7 @@ 

              "notify_on_commit_flag": False,

              "issue_tracker_read_only": False,

              "disable_non_fast-forward_merges": False,

+             "open_metadata_access_to_all": False,

          }

  

          if self._settings:

file modified
+239 -238
@@ -18,7 +18,7 @@ 

  {% block repo %}

  <div class="d-flex align-items-start">

      <h4 class="ml-1">

-         {% if g.authenticated and g.repo_user %}

+         {% if g.authenticated and (g.repo_user or open_access) %}

          <form action="{{ url_for('ui_ns.update_issue', username=username,

          namespace=repo.namespace, repo=repo.name, issueid=issueid)

          }}" method="post" class="hidden" id="changestatusform">
@@ -34,57 +34,57 @@ 

          {{form.csrf_token}}

          {% if repo.issue_keys %}

            {% for field in repo.issue_keys %}

-                   {% if field.key_type == 'list' %}

-                     <select class="form-control"

-                         name="{{ field.name }}"

-                         id="{{ field.name | replace(' ', '_') }}">

-                       <option value="None">None</option>

-                       {% for item in field.data or [] %}

-                         <option value="{{item}}" {% if field.name in knowns_keys and item == knowns_keys[field.name].value %} selected {% endif %}>

-                           {{ item }}

-                         </option>

-                       {% endfor %}

-                     </select>

-                   {% else %}

-                     <input

-                       {%- if field.key_type == 'boolean' %} type="checkbox" {% endif %}

-                       class="form-control" name="{{ field.name }}" id="{{ field.name }}"

-                       {%- if field.name in knowns_keys %}

-                         {% if field.key_type == 'boolean'%}

-                           {% if knowns_keys[field.name].value in ['true', 'on', '1'] %}checked{% endif %}

-                         {% else %} value="{{ knowns_keys[field.name].value }}"

-                         {% endif %}

-                       {%- endif -%} />

+             {% if field.key_type == 'list' %}

+               <select class="form-control"

+                   name="{{ field.name }}"

+                   id="{{ field.name | replace(' ', '_') }}">

+                 <option value="None">None</option>

+                 {% for item in field.data or [] %}

+                   <option value="{{item}}" {% if field.name in knowns_keys and item == knowns_keys[field.name].value %} selected {% endif %}>

+                     {{ item }}

+                   </option>

+                 {% endfor %}

+               </select>

+             {% else %}

+               <input

+                 {%- if field.key_type == 'boolean' %} type="checkbox" {% endif %}

+                 class="form-control" name="{{ field.name }}" id="{{ field.name }}"

+                 {%- if field.name in knowns_keys %}

+                   {% if field.key_type == 'boolean'%}

+                     {% if knowns_keys[field.name].value in ['true', 'on', '1'] %}checked{% endif %}

+                   {% else %} value="{{ knowns_keys[field.name].value }}"

                    {% endif %}

-             {% endfor %}

+                 {%- endif -%} />

+             {% endif %}

+           {% endfor %}

          {% endif %}

          </form>

          {% endif %}

          <div>

-             {% if issue.private %}

-               <span title="Private ticket" class="text-danger fa fa-fw fa-lock"></span>

-             {% endif %}

-             {% if issue.status == 'Open' %}

-               <span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>

-               <span class="text-success font-weight-bold">#{{issue.id}}</span>

-             {% elif issue.status == 'Closed' %}

-               <span class="fa fa-fw text-danger fa-exclamation-circle pt-1"></span>

-               <span class="text-danger font-weight-bold">#{{issue.id}}</span>

-             {% endif %}

-             <span class="font-weight-bold">

-                   {{ issue.title | noJS(ignore="img") | safe}}

-             </span>

-             {% if g.repo_committer or (

-               g.fas_user and g.fas_user.username == issue.user.username) %}

-             <a class="btn btn-outline-secondary btn-sm border-0" href="{{

-                 url_for('ui_ns.edit_issue',

-                         repo=repo.name,

-                         username=username,

-                         namespace=repo.namespace,

-                         issueid=issueid)

-                 }}" title="Edit this issue">

-             <i class="fa fa-pencil"></i></a>

-             {% endif %}

+           {% if issue.private %}

+             <span title="Private ticket" class="text-danger fa fa-fw fa-lock"></span>

+           {% endif %}

+           {% if issue.status == 'Open' %}

+             <span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>

+             <span class="text-success font-weight-bold">#{{issue.id}}</span>

+           {% elif issue.status == 'Closed' %}

+             <span class="fa fa-fw text-danger fa-exclamation-circle pt-1"></span>

+             <span class="text-danger font-weight-bold">#{{issue.id}}</span>

+           {% endif %}

+           <span class="font-weight-bold">

+                 {{ issue.title | noJS(ignore="img") | safe}}

+           </span>

+           {% if g.repo_committer or (

+             g.fas_user and g.fas_user.username == issue.user.username) %}

+           <a class="btn btn-outline-secondary btn-sm border-0" href="{{

+               url_for('ui_ns.edit_issue',

+                       repo=repo.name,

+                       username=username,

+                       namespace=repo.namespace,

+                       issueid=issueid)

+               }}" title="Edit this issue">

+           <i class="fa fa-pencil"></i></a>

+           {% endif %}

          </div>

          <div>

            <small>
@@ -119,7 +119,7 @@ 

      <div class="ml-auto">

          <div class="btn-group">

          <div class="dropdown">

-           {% if g.authenticated and g.repo_user %}

+           {% if g.authenticated and (g.repo_user or open_access) %}

            <a href="javascript:void(0)" class="font-weight-bold btn btn-sm {{'btn-success' if issue.status=='Open' else 'btn-danger'}} dropdown-toggle"

            id="dropdownMenuButton" data-toggle='dropdown' aria-haspopup="true" aria-expanded="false">

            {% else %}
@@ -196,108 +196,108 @@ 

          {% if g.authenticated and form and not repo.settings.get('issue_tracker_read_only', False) %}

  

          <div class="card mt-5">

-               <div class="card-header pb-0 pt-1 bg-light">

-                 <div class="row">

-                   <div class="col align-self-center">

-                         <span><strong>Add new comment</strong></span>

-                   </div>

-                   <div class="col">

-                           <ul class="nav nav-tabs float-right border-bottom-0">

-                             <li class="nav-item">

-                               <a class="nav-link" id="previewinmarkdown" href="javascript:void(0)">Preview</a>

-                             </li>

-                             <li class="nav-item">

-                               <a class="nav-link active" id="editinmarkdown" href="javascript:void(0)">Edit</a>

-                             </li>

-                           </ul>

-                         {% if repo.quick_replies %}

-                         {% include "quick_reply.html" %}

-                         {% endif %}

-                     </div>

-                 </div>

+           <div class="card-header pb-0 pt-1 bg-light">

+             <div class="row">

+               <div class="col align-self-center">

+                     <span><strong>Add new comment</strong></span>

                </div>

-               <div class="card-body">

-                         <textarea class="form-control" rows=8 id="comment" name="comment"

-                         placeholder="Enter your comment here" tabindex=1></textarea>

-                         <div id="preview" class="p-1">

-                         </div>

-                         <div class="mt-2">

-                             <label class="custom-file font-size-09">

-                                 <input type="file" id="file-picker" class="custom-file-input" name="file" accept="image/*" multiple tabindex=3>

-                                 <label class="custom-file-label" for="file-picker">

-                                   Browse to attach images or drag them into the comment field

-                                 </label>

-                             </label>

-                             <div id="progress" class="progress" style="display: none; height:22px">

-                               <div id="progress-bar" class="progress-bar" style="height:22px; line-height: 2em;">0%</div>

-                             </div>

-                         </div>

+               <div class="col">

+                       <ul class="nav nav-tabs float-right border-bottom-0">

+                         <li class="nav-item">

+                           <a class="nav-link" id="previewinmarkdown" href="javascript:void(0)">Preview</a>

+                         </li>

+                         <li class="nav-item">

+                           <a class="nav-link active" id="editinmarkdown" href="javascript:void(0)">Edit</a>

+                         </li>

+                       </ul>

+                     {% if repo.quick_replies %}

+                     {% include "quick_reply.html" %}

+                     {% endif %}

                  </div>

-                 <div class="card-footer bg-light">

-                   <div class="d-flex align-items-center">

-                     <small>Comments use <a href="https://docs.pagure.org/pagure/usage/markdown.html"

-                        target="_blank" rel="noopener noreferrer" class="notblue">Markdown Syntax</a></small>

-                     <div class="ml-auto">

-                       <div class="btn-group">

-                         {% if g.authenticated and g.repo_user %}

-                         {% if issue.status == 'Open' %}

-                           {% if repo.close_status %}

-                           <div class="btn-group">

-                           <a href="javascript:void(0)" class="btn btn-outline-primary dropdown-toggle"

-                           id="dropdownMenuButton" data-toggle='dropdown' aria-haspopup="true" aria-expanded="false" tabindex=3>

-                             Comment &amp; Close

-                           </a>

-                           <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton">

-                             <h6 class="dropdown-header">Close issue as:</h6>

-                             {% for close_status in repo.close_status %}

-                               <a class="dropdown-item comment_and_close_action" href="javascript:void(0)" data-value="{{close_status}}">{{close_status}}</a>

-                             {% endfor %}

-                           </div>

-                           </div>

-                           {% else %}

-                             <a class="btn btn-outline-primary comment_and_close_action" data-value="" href="javascript:void(0)">

-                               Comment &amp; Close

-                             </a>

-                           {% endif %}

-                       {% else %}

-                       <a class="btn btn-outline-primary comment_and_close_action" data-value="" href="javascript:void(0)">

-                           Comment &amp; Reopen

-                         </a>

-                       {% endif %}

-                       {% endif %}

-                       <input type="submit" class="btn btn-primary"

-                       value="Comment" tabindex=2 />

-                       </div>

+             </div>

+           </div>

+           <div class="card-body">

+             <textarea class="form-control" rows=8 id="comment" name="comment"

+               placeholder="Enter your comment here" tabindex=1></textarea>

+             <div id="preview" class="p-1">

+             </div>

+             <div class="mt-2">

+                 <label class="custom-file font-size-09">

+                     <input type="file" id="file-picker" class="custom-file-input" name="file" accept="image/*" multiple tabindex=3>

+                     <label class="custom-file-label" for="file-picker">

+                       Browse to attach images or drag them into the comment field

+                     </label>

+                 </label>

+                 <div id="progress" class="progress" style="display: none; height:22px">

+                   <div id="progress-bar" class="progress-bar" style="height:22px; line-height: 2em;">0%</div>

+                 </div>

+             </div>

+           </div>

+           <div class="card-footer bg-light">

+             <div class="d-flex align-items-center">

+               <small>Comments use <a href="https://docs.pagure.org/pagure/usage/markdown.html"

+                  target="_blank" rel="noopener noreferrer" class="notblue">Markdown Syntax</a></small>

+               <div class="ml-auto">

+                 <div class="btn-group">

+                   {% if g.authenticated and g.repo_user %}

+                   {% if issue.status == 'Open' %}

+                     {% if repo.close_status %}

+                     <div class="btn-group">

+                     <a href="javascript:void(0)" class="btn btn-outline-primary dropdown-toggle"

+                     id="dropdownMenuButton" data-toggle='dropdown' aria-haspopup="true" aria-expanded="false" tabindex=3>

+                       Comment &amp; Close

+                     </a>

+                     <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton">

+                       <h6 class="dropdown-header">Close issue as:</h6>

+                       {% for close_status in repo.close_status %}

+                         <a class="dropdown-item comment_and_close_action" href="javascript:void(0)" data-value="{{close_status}}">{{close_status}}</a>

+                       {% endfor %}

                      </div>

-                   </div>

+                     </div>

+                     {% else %}

+                       <a class="btn btn-outline-primary comment_and_close_action" data-value="" href="javascript:void(0)">

+                         Comment &amp; Close

+                       </a>

+                     {% endif %}

+                 {% else %}

+                 <a class="btn btn-outline-primary comment_and_close_action" data-value="" href="javascript:void(0)">

+                     Comment &amp; Reopen

+                   </a>

+                 {% endif %}

+                 {% endif %}

+                 <input type="submit" class="btn btn-primary"

+                 value="Comment" tabindex=2 />

                  </div>

+               </div>

+             </div>

            </div>

-         {% elif g.authenticated and form and repo.settings.get('issue_tracker_read_only', False) %}

-           <p>

-             This issue tracker is read-only.

-           </p>

-         {% else %}

-           <p>

-             <a href="{{ url_for('auth_login', next=request.url) }}">Login</a>

-             to comment on this ticket.

-           </p>

-         {% endif %}

+         </div>

+       {% elif g.authenticated and form and repo.settings.get('issue_tracker_read_only', False) %}

+         <p>

+           This issue tracker is read-only.

+         </p>

+       {% else %}

+         <p>

+           <a href="{{ url_for('auth_login', next=request.url) }}">Login</a>

+           to comment on this ticket.

+         </p>

+       {% endif %}

  

    </div>

  

    <div class="col-md-4">

      <div>

        <div class="mb-4">

-           <h5 class="d-flex align-items-center font-weight-bold border-bottom">

-               <div class="py-2 text-uppercase font-size-09">Metadata</div>

-               {% if g.authenticated and (g.repo_user or g.fas_user.username == issue.user.user)

-                 and not repo.settings.get('issue_tracker_read_only', False) %}

-               <div class="ml-auto">

-               <a class="btn btn-outline-primary border-0 btn-sm issue-metadata-display editmetadatatoggle" href="javascript:void(0)" style="display: inline-block;"><i class="fa fa-fw fa-pencil"></i></a>

-               <a class="btn btn-outline-secondary border-0 btn-sm issue-metadata-form hidden editmetadatatoggle" href="javascript:void(0)" style="display: none;"><i class="fa fa-fw fa-times"></i></a>

-               </div>

-               {% endif %}

-             </h5>

+         <h5 class="d-flex align-items-center font-weight-bold border-bottom">

+             <div class="py-2 text-uppercase font-size-09">Metadata</div>

+             {% if g.authenticated and (g.repo_user or g.fas_user.username == issue.user.user or open_access)

+               and not repo.settings.get('issue_tracker_read_only', False) %}

+             <div class="ml-auto">

+             <a class="btn btn-outline-primary border-0 btn-sm issue-metadata-display editmetadatatoggle" href="javascript:void(0)" style="display: inline-block;"><i class="fa fa-fw fa-pencil"></i></a>

+             <a class="btn btn-outline-secondary border-0 btn-sm issue-metadata-form hidden editmetadatatoggle" href="javascript:void(0)" style="display: none;"><i class="fa fa-fw fa-times"></i></a>

+             </div>

+             {% endif %}

+           </h5>

  

            {% if g.authenticated and (g.repo_user or g.fas_user.username == issue.user.user) %}

              <div class="hidden">
@@ -307,52 +307,52 @@ 

            {% endif%}

  

            <fieldset class="form-group issue-metadata-display mt-4">

-               <label class="mb-1 pl-1"> <i class="fa fa-fw fa-user-plus"></i> <strong>Assignee</strong></label>

-               <div id="assignee_plain">

-                 <div class="ml-2" title="{{ issue.assignee.html_title if issue.assignee else '' }}">

-                     {% if issue.assignee %}

-                       <div class="mt-1">{{issue.assignee.username| avatar(size=24) | safe}}

-                           <a href="{{ url_for(

-                             'ui_ns.view_issues',

-                             repo=repo.name,

-                             username=username,

-                             namespace=repo.namespace,

-                             assignee=issue.assignee.username)

-                             }}" title="{{ issue.assignee.html_title }}">

-                             {{ issue.assignee.username }}

-                           </a>

-                           {% if g.authenticated and (issue.assignee.username == g.fas_user.username) %}

-                           &mdash; <a href="javascript:void(0)" id="drop-btn"

-                               title="drop the assignment of this issue">

-                             Drop

-                           </a>

-                         {% endif %}

-                       </div>

-                     {% else %}

-                       <div class="text-muted">

-                         None

-                         {% if g.authenticated and g.repo_user and issue.status|lower == 'open'

-                           and (not issue.assignee or issue.assignee.username != g.fas_user.username)

-                           and not repo.settings.get('issue_tracker_read_only', False) %}

-                           &mdash; <a href="javascript:void(0)" id="take-btn"

-                           title="assign this issue to you">

-                             Take

-                         </a>

-                         {% endif %}

-                       </div>

+             <label class="mb-1 pl-1"> <i class="fa fa-fw fa-user-plus"></i> <strong>Assignee</strong></label>

+             <div id="assignee_plain">

+               <div class="ml-2" title="{{ issue.assignee.html_title if issue.assignee else '' }}">

+                 {% if issue.assignee %}

+                   <div class="mt-1">{{issue.assignee.username| avatar(size=24) | safe}}

+                       <a href="{{ url_for(

+                         'ui_ns.view_issues',

+                         repo=repo.name,

+                         username=username,

+                         namespace=repo.namespace,

+                         assignee=issue.assignee.username)

+                         }}" title="{{ issue.assignee.html_title }}">

+                         {{ issue.assignee.username }}

+                       </a>

+                       {% if g.authenticated and (issue.assignee.username == g.fas_user.username) %}

+                       &mdash; <a href="javascript:void(0)" id="drop-btn"

+                           title="drop the assignment of this issue">

+                         Drop

+                       </a>

                      {% endif %}

                    </div>

+                 {% else %}

+                   <div class="text-muted">

+                     None

+                     {% if g.authenticated and (g.repo_user or open_access) and issue.status|lower == 'open'

+                       and (not issue.assignee or issue.assignee.username != g.fas_user.username)

+                       and not repo.settings.get('issue_tracker_read_only', False) %}

+                       &mdash; <a href="javascript:void(0)" id="take-btn"

+                       title="assign this issue to you">

+                         Take

+                     </a>

+                     {% endif %}

+                   </div>

+                 {% endif %}

                </div>

-             </fieldset>

+             </div>

+           </fieldset>

  

-             {% if g.authenticated and g.repo_user %}

-             <fieldset class="form-group issue-metadata-form hidden">

-               <label for="assignee"><strong>Assignee</strong></label>

-               <input class="form-control" name="assignee" id="assignee"

-                 placeholder="username"

-                 value="{{ issue.assignee.username or '' }}" />

-             </fieldset>

-             {% endif%}

+           {% if g.authenticated and (g.repo_user or open_access) %}

+           <fieldset class="form-group issue-metadata-form hidden">

+             <label for="assignee"><strong>Assignee</strong></label>

+             <input class="form-control" name="assignee" id="assignee"

+               placeholder="username"

+               value="{{ issue.assignee.username or '' }}" />

+           </fieldset>

+           {% endif%}

  

            <fieldset class="form-group issue-metadata-display mt-4">

              <label class="mb-1"><i class="fa fa-fw fa-tag"></i> <strong>Tags</strong></label>
@@ -376,7 +376,7 @@ 

              {% endif%}

            </fieldset>

  

-           {% if g.authenticated and g.repo_user %}

+           {% if g.authenticated and (g.repo_user or open_access) %}

            <fieldset class="form-group issue-metadata-form hidden">

              <label for="tag"><strong>Tags</strong></label>

               <input id="tag" type="text" placeholder="tag1, tag2" name="tag"
@@ -416,7 +416,7 @@ 

              </div>

            </fieldset>

  

-           {% if g.authenticated and g.repo_user %}

+           {% if g.authenticated and (g.repo_user or open_access) %}

              <fieldset class="form-group issue-metadata-form hidden">

                <label for="blocking"><strong>Blocking</strong></label>

                <input class="form-control" id="blocking" type="text"
@@ -438,7 +438,7 @@ 

            </div>

            </fieldset>

  

-           {% if g.authenticated and g.repo_user %}

+           {% if g.authenticated and (g.repo_user or open_access) %}

              <fieldset class="form-group issue-metadata-form hidden">

                <label for="depending"><strong>Depending on</strong></label>

                <input class="form-control" id="depending" type="text"
@@ -458,7 +458,7 @@ 

              {% endif %}

              </div>

            </fieldset>

-           {% if g.authenticated and g.repo_user %}

+           {% if g.authenticated and (g.repo_user or open_access) %}

              {{ render_bootstrap_field(form.priority,

                formclass="issue-metadata-form hidden") }}

            {% endif%}
@@ -485,16 +485,16 @@ 

                {% endif %}

              </div>

            </fieldset>

-           {% if g.authenticated and g.repo_user %}

+           {% if g.authenticated and (g.repo_user or open_access) %}

              {{ render_bootstrap_field(form.milestone,

-               formclass="issue-metadata-form hidden") }}

+                  formclass="issue-metadata-form hidden") }}

            {% endif%}

  

            {% endif %}

  

-           {% if g.authenticated and g.repo_user %}

+           {% if g.authenticated and (g.repo_user or open_access) %}

              {{ render_bootstrap_field(form.private,

-               formclass="issue-metadata-form hidden") }}

+                  formclass="issue-metadata-form hidden") }}

            {% endif%}

  

            {% if repo.issue_keys %}
@@ -516,7 +516,7 @@ 

                    {% endif %}

                </div>

              </fieldset>

-             {% if g.authenticated and g.repo_user %}

+             {% if g.authenticated and (g.repo_user or open_access) %}

                <fieldset class="form-group issue-metadata-form hidden">

                  <label for="field"><strong> <i class="fa fa-fw fa-circle-o"></i>{{ field.name }}</strong></label>

                  {% if field.key_type == 'list' %}
@@ -576,32 +576,33 @@ 

  

        <div class="mt-3">

          <h5 class="d-flex align-items-center font-weight-bold border-bottom">

-             <div class="py-2 text-uppercase font-size-09">

-               Subscribers

-               <span class="badge badge-secondary badge-pill font-size-09 ml-1" id="subscribers-count">{{subscribers|count}}</span>

-             </div>

-             <div class="ml-auto">

-                 <a href="#" class="btn btn-sm btn-link" id="subcribe-btn"

-                 {% if g.fas_user.username in subscribers -%}

-                   title="Unsubscribe from this issue">Unsubscribe

-                 {%- else -%}

-                   title="Subscribe to this issue">Subscribe

-                 {%- endif -%}

-               </a>

-               </div>

-           </h5>

-           {% if subscribers %}

-           <div id="subscribers_list" class="p-2">

-           {% for subscriber in subscribers %}

-               <a href="{{ url_for('ui_ns.view_user', username=subscriber)

-               }}" title="{{ subscriber }}" id="sub-avatar-{{subscriber}}">{{

-                 subscriber |avatar(size=30, css_class="pb-1") | safe

-               }}</a>

-           {% endfor %}

+           <div class="py-2 text-uppercase font-size-09">

+             Subscribers

+             <span class="badge badge-secondary badge-pill font-size-09 ml-1" id="subscribers-count">{{subscribers|count}}</span>

            </div>

-           {% else %}

-           <div class="text-center text-muted pt-2">No Subscribers</div>

-           {% endif %}

+           <div class="ml-auto">

+               <a href="#" class="btn btn-sm btn-link" id="subcribe-btn"

+               {% if g.fas_user.username in subscribers -%}

+                 title="Unsubscribe from this issue">Unsubscribe

+               {%- else -%}

+                 title="Subscribe to this issue">Subscribe

+               {%- endif -%}

+             </a>

+             </div>

+         </h5>

+ 

+         {% if subscribers %}

+         <div id="subscribers_list" class="p-2">

+         {% for subscriber in subscribers %}

+             <a href="{{ url_for('ui_ns.view_user', username=subscriber)

+             }}" title="{{ subscriber }}" id="sub-avatar-{{subscriber}}">{{

+               subscriber |avatar(size=30, css_class="pb-1") | safe

+             }}</a>

+         {% endfor %}

+         </div>

+         {% else %}

+         <div class="text-center text-muted pt-2">No Subscribers</div>

+         {% endif %}

  

        </div>

      {% endif %}
@@ -609,32 +610,31 @@ 

  

      {% if issue.related_prs %}

        <div class="mt-3">

-           <h5 class="d-flex align-items-center font-weight-bold border-bottom">

-               <div class="py-2 text-uppercase font-size-09">

-                 Related Pull Requests

-               </div>

-             </h5>

-           <div id="pr_list">

-             <ul class="list-unstyled">

-               {% for pr in issue.related_prs %}

-               <li>

-                 <a class="badge badge-secondary" href="{{ url_for(

-                     'ui_ns.request_pull',

-                     repo=pr.project.name,

-                     username=pr.project.user.user if pr.project.is_fork else none,

-                     namespace=pr.project.namespace,

-                     requestid=pr.id) }}">#{{pr.id}}</a>

-                 {{ pr.status if pr.status != 'Open' else 'Last updated'

-                   }} {{ pr.last_updated | humanize }}

-               </li>

-               {% endfor %}

-             </ul>

+         <h5 class="d-flex align-items-center font-weight-bold border-bottom">

+           <div class="py-2 text-uppercase font-size-09">

+             Related Pull Requests

            </div>

+         </h5>

+         <div id="pr_list">

+           <ul class="list-unstyled">

+             {% for pr in issue.related_prs %}

+             <li>

+               <a class="badge badge-secondary" href="{{ url_for(

+                   'ui_ns.request_pull',

+                   repo=pr.project.name,

+                   username=pr.project.user.user if pr.project.is_fork else none,

+                   namespace=pr.project.namespace,

+                   requestid=pr.id) }}">#{{pr.id}}</a>

+               {{ pr.status if pr.status != 'Open' else 'Last updated'

+                 }} {{ pr.last_updated | humanize }}

+             </li>

+             {% endfor %}

+           </ul>

+         </div>

        </div>

      {% endif %}

    </div>

  

- 

    </div>

  </form>

  
@@ -1024,7 +1024,7 @@ 

  

  

  <script type="text/javascript">

- {% if g.authenticated and g.repo_user %}

+ {% if g.authenticated and (g.repo_user or open_access) %}

  function take_issue(){

    var _url = "{{ url_for('api_ns.api_assign_issue',

              repo=repo.name, namespace=repo.namespace, username=username,
@@ -1069,7 +1069,7 @@ 

  {% endif %}

  

  function setup_btn_take_drop(){

-   {% if g.authenticated and g.repo_user %}

+   {% if g.authenticated and (g.repo_user or open_access) %}

    $("#take-btn").click(take_issue)

    {% endif %}

    {% if g.authenticated and (
@@ -1257,6 +1257,7 @@ 

  

    {% if g.authenticated and (

      g.repo_user

+     or open_access

      or issue.user.user == g.fas_user.username

      or issue.assignee.user == g.fas_user.username) %}

    setup_btn_take_drop();

@@ -160,7 +160,7 @@ 

        </div>

    </div>

  

-   {% if g.repo_user and not type or type == 'new' %}

+   {% if (g.repo_user or open_access) and not type or type == 'new' %}

    <div class="col-md-4">

      <div class="mb-4">

          <h5 class="d-flex align-items-center font-weight-bold border-bottom mb-4">
@@ -291,7 +291,7 @@ 

      });

    });

  

-   {% if g.repo_user %}

+   {% if (g.repo_user or open_access) %}

    var available_tags = [];

    {% for tog in tag_list %}

      available_tags.push("{{ tog.tag }}");

file modified
+13 -8
@@ -127,6 +127,10 @@ 

          close_status=repo.close_status,

      )

  

+     is_author = flask.g.fas_user.username == issue.user.user

+     is_contributor = flask.g.repo_user

+     is_open_access = repo.settings.get("open_metadata_access_to_all", False)

+ 

      if form.validate_on_submit():

          if flask.request.form.get("drop_comment"):

              commentid = flask.request.form.get("drop_comment")
@@ -138,8 +142,7 @@ 

                  flask.abort(404, "Comment not found")

  

              if (

-                 flask.g.fas_user.username != comment.user.username

-                 or comment.parent.status != "Open"

+                 not is_author or comment.parent.status != "Open"

              ) and not flask.g.repo_committer:

                  flask.abort(

                      403,
@@ -219,10 +222,7 @@ 

              # The status field can be updated by both the admin and the

              # person who opened the ticket.

              # Update status

-             if (

-                 flask.g.repo_user

-                 or flask.g.fas_user.username == issue.user.user

-             ):

+             if is_contributor or is_author:

                  if new_status in status:

                      msgs = pagure.lib.edit_issue(

                          flask.g.session,
@@ -240,7 +240,7 @@ 

              # All the other meta-data can be changed only by admins

              # while other field will be missing for non-admin and thus

              # reset if we let them

-             if flask.g.repo_user:

+             if is_contributor or is_open_access:

                  # Adjust (add/remove) tags

                  msgs = pagure.lib.update_tags(

                      flask.g.session,
@@ -870,6 +870,7 @@ 

      """

      template = flask.request.args.get("template") or "default"

      repo = flask.g.repo

+     open_access = repo.settings.get("open_metadata_access_to_all", False)

  

      milestones = []

      for m in repo.milestones_keys or repo.milestones:
@@ -906,7 +907,7 @@ 

              assignee = None

              milestone = None

              tags = None

-             if flask.g.repo_user:

+             if flask.g.repo_user or open_access:

                  assignee = (

                      flask.request.form.get("assignee", "").strip() or None

                  )
@@ -1038,6 +1039,7 @@ 

          types=types,

          default=default,

          tag_list=tag_list,

+         open_access=open_access,

      )

  

  
@@ -1097,6 +1099,8 @@ 

      for key in issue.other_fields:

          knowns_keys[key.key.name] = key

  

+     open_access = repo.settings.get("open_metadata_access_to_all", False)

+ 

      return flask.render_template(

          "issue.html",

          select="issues",
@@ -1107,6 +1111,7 @@ 

          issueid=issueid,

          form=form,

          knowns_keys=knowns_keys,

+         open_access=open_access,

          subscribers=pagure.lib.get_watch_list(flask.g.session, issue),

          attachments=issue.attachments,

      )

@@ -546,7 +546,7 @@ 

                  'title="comma separated list of tags"\n                '

                  'value="tag2" />', output_text)

              self.assertIn(

-                 'placeholder="username"\n                value="foo" />\n',

+                 'placeholder="username"\n              value="foo" />\n',

                  output_text)

              self.assertIn(

                  'href="/test/roadmap/v2.0/"',
@@ -1113,7 +1113,7 @@ 

              output_text)

          self.assertIn(

              '<a href="/login/?next=http%3A%2F%2Flocalhost%2Ftest%2Fissue%2F1">'

-             'Login</a>\n            to comment on this ticket.',

+             'Login</a>\n          to comment on this ticket.',

              output_text)

  

      @patch('pagure.lib.git.update_git')
@@ -1155,7 +1155,7 @@ 

              output_text)

          self.assertIn(

              '<a href="/login/?next=http%3A%2F%2Flocalhost%2Ftest%2Fissue%2F1">'

-             'Login</a>\n            to comment on this ticket.',

+             'Login</a>\n          to comment on this ticket.',

              output_text)

  

          user = tests.FakeUser()
@@ -1286,7 +1286,7 @@ 

              output_text)

          self.assertTrue(

              '<a href="/login/?next=http%3A%2F%2Flocalhost%2Ftest%2Fissue%2F1">'

-             'Login</a>\n            to comment on this ticket.'

+             'Login</a>\n          to comment on this ticket.'

              in output_text)

  

          # Create issues to play with
@@ -2607,7 +2607,7 @@ 

              output_text = output.get_data(as_text=True)

              self.assertIn(

                  ' <span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>\n'

-                 '              <span class="text-success font-weight-bold">#1</span>\n ',

+                 '            <span class="text-success font-weight-bold">#1</span>\n ',

                  output_text)

              self.assertEqual(output_text.count(

                  '<option selected value="Open">Open</option>'), 1)
@@ -2670,7 +2670,7 @@ 

              output_text = output.get_data(as_text=True)

              self.assertIn(

                  ' <span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>\n'

-                 '              <span class="text-success font-weight-bold">#1</span>\n ',

+                 '            <span class="text-success font-weight-bold">#1</span>\n ',

                  output_text)

              self.assertEqual(output_text.count(

                  '<option selected value="Open">Open</option>'), 1)

@@ -116,7 +116,7 @@ 

              output.get_data(as_text=True))

          self.assertTrue(

              '<a href="/login/?next=http%3A%2F%2Flocalhost%2Ftest%2Fissue%2F1">'

-             'Login</a>\n            to comment on this ticket.'

+             'Login</a>\n          to comment on this ticket.'

              in output.get_data(as_text=True))

  

          user = tests.FakeUser()
@@ -372,7 +372,7 @@ 

              output_text)

          self.assertIn(

              '<a href="/login/?next=http%3A%2F%2Flocalhost%2Ftest%2Fissue%2F1">'

-             'Login</a>\n            to comment on this ticket.',

+             'Login</a>\n          to comment on this ticket.',

              output_text)

  

          user = tests.FakeUser()
@@ -879,7 +879,7 @@ 

              output.get_data(as_text=True))

          self.assertTrue(

              '<a href="/login/?next=http%3A%2F%2Flocalhost%2Ftest%2Fissue%2F1">'

-             'Login</a>\n            to comment on this ticket.'

+             'Login</a>\n          to comment on this ticket.'

              in output.get_data(as_text=True))

  

          user = tests.FakeUser()

The added file is too large to be shown here, see it at: tests/test_pagure_flask_ui_issues_open_access.py
@@ -221,7 +221,7 @@ 

                  output_text)

              self.assertIn(

                  '<span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>\n'

-                 '              <span class="text-success font-weight-bold">#1</span>\n',

+                 '            <span class="text-success font-weight-bold">#1</span>\n',

                  output_text)

  

      def test_view_issue_author(self):
@@ -238,7 +238,7 @@ 

                  output_text)

              self.assertIn(

                  '<span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>\n'

-                 '              <span class="text-success font-weight-bold">#1</span>\n',

+                 '            <span class="text-success font-weight-bold">#1</span>\n',

                  output_text)

  

      def test_view_issue_authenticated(self):
@@ -296,7 +296,7 @@ 

                  output_text)

              self.assertIn(

                  '<span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>\n'

-                 '              <span class="text-success font-weight-bold">#1</span>\n',

+                 '            <span class="text-success font-weight-bold">#1</span>\n',

                  output_text)

  

      def test_view_issue_authenticated_assigned(self):
@@ -320,7 +320,7 @@ 

                  output_text)

              self.assertIn(

                  '<span class="fa fa-fw text-success fa-exclamation-circle pt-1"></span>\n'

-                 '              <span class="text-success font-weight-bold">#1</span>\n',

+                 '            <span class="text-success font-weight-bold">#1</span>\n',

                  output_text)

  

  

file modified
+3 -1
@@ -1698,7 +1698,7 @@ 

  index 0000000..60f7480

  --- /dev/null

  +++ b/456

- @@ -0,0 +1,141 @@

+ @@ -0,0 +1,143 @@

  +{

  +    "assignee": null,

  +    "branch": "master",
@@ -1752,6 +1752,7 @@ 

  +            "issues_default_to_private": false,

  +            "notify_on_commit_flag": false,

  +            "notify_on_pull-request_flag": false,

+ +            "open_metadata_access_to_all": false,

  +            "project_documentation": false,

  +            "pull_request_access_only": false,

  +            "pull_requests": true,
@@ -1809,6 +1810,7 @@ 

  +            "issues_default_to_private": false,

  +            "notify_on_commit_flag": false,

  +            "notify_on_pull-request_flag": false,

+ +            "open_metadata_access_to_all": false,

  +            "project_documentation": false,

  +            "pull_request_access_only": false,

  +            "pull_requests": true,

rebased onto 84dcf09d09ea8aa34d37efee55fe0aeeaf5d9764

5 years ago

Can you please rebase this so that the tests can run?

rebased onto 0a82dffd3cd45bffe7af7fbeb54b3c727a00dd26

5 years ago

rebased onto 3821e64

5 years ago

1 new commit added

  • Drop un-used imports
5 years ago

Pull-Request has been merged by pingou

5 years ago