{% extends "repo_master.html" %}
{% from "_formhelper.html" import render_field_in_row %}
{% block title %}{{ select.capitalize() }} - {{ repo.name }}{% endblock %}
{% set tag = "home" %}
{% block repo %}
<section class="settings">
<h3>Settings for {{repo.name}}</h3>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
Project Details
</div>
<div class="card-block">
<form action="{{ url_for('.update_project',
username=username, repo=repo.name) }}" method="post">
<fieldset class="form-group">
<label for="description">Description</label>
<input class="form-control" name="description" value="{{
repo.description if repo.description }}" required/>
<small class="text-muted">Short description of the project</small>
</fieldset>
<fieldset class="form-group">
<label for="url">Project's url</label>
<input class="form-control" name="url" value="{{ repo.url if repo.url else '' }}" />
<small class="text-muted">Website URL of the project</small>
</fieldset>
<fieldset class="form-group">
<label for="avatar">Avatar email</label>
<input class="form-control" name="avatar_email" value="{{ repo.avatar_email if repo.avatar_email else '' }}" />
<small class="text-muted">Email address linked to avatar to display for the project</small>
</fieldset>
<fieldset class="form-group">
<label for="tags">Project tags</label>
<input class="form-control" name="tags" value="{{ repo.tags_text |join(', ') if repo.tags else '' }}" />
<small class="text-muted">tags for project</small>
</fieldset>
<button class="btn btn-primary" type="submit" title="Update description">
Update
</button>
{{ form.csrf_token }}
</form>
</div>
</div>
</div>
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
Default Branch
</div>
<div class="card-block">
<form action="{{ url_for('change_ref_head',
username=username, repo=repo.name) }}" method="post">
{{ branches_form.csrf_token }}
{{ branches_form.branches(class_="c-select") }}
<input class="btn btn-primary" type="submit" value="Make Default"/>
</form>
</div>
</div>
</div>
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
<strong>Private web-hook key</strong>
</div>
<div class="card-block">
<p>
Each message sent to the web-hook are signed via hmac and SHA1 using
this private key.
</p>
<p>
This key is private to your project, make sure to store in a safe place
and do not share it.
</p>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon"><span class="oi" data-glyph="key"></span></div>
<input class="form-control" type="text" value="{{ repo.hook_token }}" readonly>
</div>
</div>
<form action="{{ url_for('.new_repo_hook_token',
username=username, repo=repo.name) }}"
method="post" class="icon">
<button class="btn btn-primary" type="submit"
onclick="return confirm('Are you sure to generate a new token for '
+ 'this project/fork? \nThis will break all web hook in place and '
+ 'cannot be un-done.');"
title="Generate a new hook token">
<span class="oi" data-glyph="reload"></span> Re-generate
</button>
{{ form.csrf_token }}
</form>
</div>
</div>
</div>
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
<strong>API Keys</strong>
</div>
<div class="card-block">
<p>
API keys are tokens used to authenticate you on pagure. They can also
be used to grant access to 3rd party application to behave on this
project on your name.
</p>
<p>
These are your personal tokens; they are not visible to other owners
of this repository.
</p>
<p>
These keys are valid for <span class="strong">60</span> days.
</p>
<p>
These keys are private to your project, make sure to store in a safe
place and do not share it.
</p>
</div>
{% if repo.tokens %}
<ul class="list-group list-group-flush">
{% for token in repo.tokens %}
{% if token.user.username == g.fas_user.username %}
<li class="list-group-item">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon"><span class="oi" data-glyph="key"></span></div>
<input class="form-control" type="text" value="{{ token.id }}" readonly>
</div>
</div>
{% if token.expired %}
<span class="text-danger"><strong>Expired</strong> since {{ token.expiration.date() }}</span>
{% else %}
<span class="text-success"><strong>Valid</strong> until: {{ token.expiration.date() }}</span>
<form class="pull-xs-right" action="{{ url_for('.revoke_api_token',
username=username, repo=repo.name, token_id=token.id) }}"
method="post" class="icon">
<button class="btn btn-danger" type="submit"
onclick="return confirm('Are you sure to revoke this token ?'
+ '\nThis will break all application using it and '
+ 'cannot be un-done.');"
title="Revoke token">
<span class="oi" data-glyph="trash"></span> Revoke
</button>
{{ form.csrf_token }}
</form>
{% endif %}
<button type="button" class="btn btn-link" data-toggle="modal" data-target="#acls{{ token.id }}">
ACLs
</button>
<div class="modal fade" id="acls{{ token.id }}" tabindex="-1" role="dialog" aria-labelledby="ACLs" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
<span class="sr-only">Close</span>
</button>
<h4 class="modal-title" id="myModalLabel">ACLs</h4>
</div>
<div class="modal-body">
{{ token.acls_list |safe }}
</div>
</div>
</div>
</div>
</li>
{% endif %}
{% endfor %}
</ul>
{% endif %}
<div class="card-block">
<a href="{{ url_for('.add_token', username=username, repo=repo.name) }}"
method="post" class="icon">
<button class="btn btn-primary" type="submit"
title="Generate a new API token">
Create new key
</button>
</a>
</div>
</div>
</div>
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
Project options
</div>
<div class="card-block">
<form action="{{ url_for('.view_settings',
username=username, repo=repo.name) }}" method="post">
{% for key in repo.settings | sort %}
{% if not config.get('ENABLE_TICKETS', True) and key in ['issue_tracker'] %}
{% elif not config.get('DOC_APP_URL') and key in ['project_documentation'] %}
{% elif not config.get('WEBHOOK') and key in ['Web-hooks'] %}
{% else %}
{% if repo.settings[key] in [True, False, 'y'] %}
<div>
<label class="c-input c-checkbox">
<input id="{{ key }}" type="checkbox" value="y" name="{{ key }}" {%
if repo.settings[key] -%}checked=""{%- endif -%}/>
<span class="c-indicator"></span>
Activate {{ key | replace('_', ' ') }}
</label>
</div>
{% else %}
<div class="form-inline">
<label for="{{ key }}">Activate {{ key | replace('_', ' ') }} :</label>
<input width="4em" class="form-control" id="{{ key }}" type="text" {% if repo.settings[key]
%}value="{{ repo.settings[key] }}"{% endif %} name="{{ key }}" />
</div>
{% endif %}
{% endif %}
{% endfor %}
</table>
<p class="p-t-2">
<input type="submit" class="btn btn-primary" value="Update">
{{ form.csrf_token }}
</p>
</form>
</div>
</div>
</div>
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
Re-generate git repos
</div>
<div class="card-block">
<form action="{{ url_for('.regenerate_git',
username=username, repo=repo.name) }}" method="post"
class="icon">
<input name="regenerate" value="tickets" type="hidden"/>
<button class="btn btn-primary" type="submit"
title="Regenerate tickets git repo">
<span class="oi" data-glyph="reload"></span> Regenerate the git repo for issues
</button>
{{ form.csrf_token }}
</form>
<form class="m-t-2" action="{{ url_for('.regenerate_git',
username=username, repo=repo.name) }}" method="post"
class="icon">
<input name="regenerate" value="requests" type="hidden"/>
<button class="btn btn-primary" type="submit"
title="Regenerate requests git repo">
<span class="oi" data-glyph="reload"></span> Regenerate the git repo for requests
</button>
{{ form.csrf_token }}
</form>
</div>
</div>
</div>
{% if config.get('ENABLE_USER_MNGT', True) %}
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
Users and Groups
</div>
<div class="card-block">
<p>Here below is the list of user having commit rights to this repo.</p>
<p>
<a href="{{ url_for('.add_user', username=username, repo=repo.name) }}"
class="btn btn-primary">
add user
</a>
<a href="{{ url_for('.add_group_project', username=username, repo=repo.name) }}"
class="btn btn-primary">
add group
</a>
</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<a href="{{ url_for('.view_user', username=repo.user.user) }}"><span class="oi" data-glyph="person"></span> {{ repo.user.user }}</a>
(owner)
</li>
{% for user in repo.users %}
<li class="list-group-item">
<a href="{{ url_for('.view_user', username=user.user) }}"><span class="oi" data-glyph="person"></span> {{ user.user }}</a>
<form class="pull-xs-right" method="POST"
action="{{ url_for('.remove_user', username=username, repo=repo.name, userid=user.id) }}">
<button
onclick="return confirm('You sure you want to remove this user from this project?');"
title="Remove user" class="btn btn-danger btn-sm">
<span class="oi" data-glyph="trash"></span>
</button>
{{ form.csrf_token }}
</form>
</li>
{% endfor %}
{% for group in repo.groups %}
<li class="list-group-item">
<a href="{{ url_for('.view_group', group=group.group_name) }}"><span class="oi" data-glyph="people"></span> {{ group.group_name }}</a>
<form class="pull-xs-right" method="POST"
action="">
<button
onclick="return confirm('You sure you want to remove this group from this project?');"
title="Remove group" class="btn btn-danger btn-sm pull-xs-right">
<span class="oi" data-glyph="trash"></span>
</button>
{{ form.csrf_token }}
</form>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% if plugins %}
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
Hooks
</div>
<div class="card-block">
<div id="accordions" role="tablist" aria-multiselectable="true">
{% set idcount = 1 %}
{% for plugin in plugins %}
<div class="panel panel-default" >
<div class="panel-heading" role="tab" id="pluginheading{{idcount}}">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordions" href="#plugincollapse{{idcount}}" aria-expanded="true" aria-controls="plugincollapse{{idcount}}">
<span id="dropdowncaret" class="oi" data-glyph="caret-right"></span> {{ plugin }}
</a>
</h4>
</div>
<div id="plugincollapse{{ idcount }}" data-plugin="{{ plugin }}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="pluginheading{{ idcount }}">
<span class="oi oi-spin pull-left" data-glyph="loop-circular"></span>
</div>
</div>
{% set idcount = idcount+1 %}
{% endfor %}
</div>
</div>
</div>
</div>
{% endif %}
{% if config.get('ENABLE_TICKETS', True) %}
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
<strong>Priorities</strong>
</div>
<div class="card-block">
<p>
Here below are the priorities you may assign to a ticket, allowing
you to sort them with it.
<span class="italic">
The heavier the weight of the priority, the lower in the list
it will show by default.
</span>
</p>
</div>
<form action="{{ url_for('.update_priorities',
username=username, repo=repo.name) }}"
method="post" class="icon">
{{ tag_form.csrf_token }}
<div class="card-block">
<div class="row">
<div class="col-sm-2">
<strong>Weight</strong>
</div>
<div class="col-sm-10">
<strong>Title</strong>
</div>
</div>
<div id="priorities">
{% for priority in repo.priorities | sort %}
<div class="row p-t-1">
<div class="col-sm-2 p-r-0">
<input type="text" name="priority_weigth"
value="{{ priority }}" size="3" class="form-control"/>
</div>
<div class="col-sm-9 p-r-0">
<input type="text" name="priority_title"
value="{{ repo.priorities[priority] }}" class="form-control"/>
</div>
<div class="col-sm-1">
<button
onclick="return confirm('Do you really want to remove this priority?');"
title="Remove tag" class="btn btn-danger">
<span class="oi" data-glyph="trash"></span>
</button>
</div>
</div>
{% endfor %}
</div>
<div class="row p-t-1">
<div class="col-sm-12">
<a class="btn btn-secondary btn-sm btn-block" id="new_priority">
add new priority
</a>
</div>
</div>
<div class="row p-t-1">
<div class="col-sm-12">
<button class="btn btn-primary" type="submit"
title="Update the priorities">
Update
</button>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
<strong>Issue Tags</strong>
</div>
<div class="card-block">
<p>
Here below is the list of tags associated with one or more issue of
the project.
</p>
</div>
<ul class="list-group list-group-flush">
{% for tag in tags %}
<li class="list-group-item clearfix">
<a href="{{ url_for('view_issues', username=username,
repo=repo.name, tags=tag.tag) }}">
<span class="oi" data-glyph="tag"></span> {{ tag.tag }}
</a>
<div class="pull-xs-right">
<form class="icon del_icon pull-xs-right" method="POST"
action="{{ url_for('remove_tag', username=username, repo=repo.name) }}">
<input type="hidden" value="{{ tag.tag }}" name="tag" />
{{ tag_form.csrf_token }}
<button
onclick="return confirm('Do you really want to remove the tag: {{ tag.tag }}?');"
title="Remove tag" class="btn btn-danger btn-sm">
<span class="oi" data-glyph="trash"></span>
</button>
</form>
<a href="{{ url_for(
'.edit_tag',username=username, repo=repo.name, tag=tag.tag) }}">
<button class="btn btn-default btn-sm" title="Edit tag">
<span class="oi" data-glyph="pencil"></span>
</button>
</a>
</div>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% if config.get('ENABLE_DEL_PROJECTS', True) %}
<div class="col-md-8 col-md-offset-2">
<div class="card">
<div class="card-header">
Delete Project
</div>
<div class="card-block">
<form action="{{ url_for('.delete_repo',
username=username, repo=repo.name) }}"
method="post" class="icon">
<button class="btn btn-danger" type="submit"
onclick="return confirm('Are you sure to delete {{repo.name}}? \nThis is final and cannot be un-done.');"
title="Delete the project/fork">
<span class="oi" data-glyph="trash"></span> Delete the {{repo.name}} project
</button>
</form>
</div>
</div>
</div>
{% endif %}
</div>
</section>
{% endblock %}
{% block jscripts %}
{{ super() }}
<script>
function show_acls(acls) {
var _txt = '<div title="ACLs details" id="show_meeting">'
+ '<ul>';
for (i = 0; i < acls.length; i++) {
_txt += '<li>' + acls[i] + '</li>';
}
_txt += '</ul>' + '</div>';
var _elt = $(_txt);
var _height = $(window).height() * 0.8;
_elt.dialog({
height: 250,
width: 250,
modal: true,
cache: false,
});
}
$('#accordions').on('shown.bs.collapse', function (e) {
var _plugin = $(e.target).attr('data-plugin');
$(e.target).siblings().find("#dropdowncaret").attr('data-glyph', "caret-bottom");
if (!_plugin) {
return false;
}
var _url = "{{ url_for('.view_plugin', repo=repo.name, username=username, plugin='') }}";
_url += _plugin + '/0';
console.log(_url);
$.ajax({
url: _url ,
type: 'GET',
dataType: 'html',
success: function(res) {
$("#"+e.target.id).html(res);
},
});
return false;
})
$('#accordions').on('hide.bs.collapse', function (e) {
$(e.target).siblings().find("#dropdowncaret").attr('data-glyph', "caret-right");
})
$('#new_priority').click(function(e) {
console.log('new priority');
console.log($('#priorities'));
$('#priorities').append(
'<div class="row p-t-1"> \
<div class="col-sm-2 p-r-0">\
<input type="text" name="priority_weigth"\
value="" size="3" class="form-control"/>\
</div>\
<div class="col-sm-9 p-r-0">\
<input type="text" name="priority_title"\
value="" class="form-control"/>\
</div>\
<div class="col-sm-1">\
<button\
onclick="return confirm("Do you really want to remove this priority?");"\
title="Remove tag" class="btn btn-danger">\
<span class="oi" data-glyph="trash"></span>\
</button>\
</div>\
</div>'
);
console.log($('#priorities'));
});
</script>
{% endblock %}