update ticket info on ProjectSummaryHistoryView (#77825)

This commit is contained in:
Lauréline Guérin 2023-05-25 11:51:46 +02:00
parent 762e2ac0d2
commit c8984c43fa
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
8 changed files with 119 additions and 10 deletions

View File

@ -0,0 +1,12 @@
from django import forms
from .models import IssueInfo
class IssueInfoForm(forms.ModelForm):
class Meta:
model = IssueInfo
fields = [
'issue_type',
'doc_focus',
]

View File

@ -0,0 +1,16 @@
<tr>
<td class="edit">
<a rel="popup" class="link-action-icon edit" href="{% url 'issue-edit-info' issue.id %}" data-inplace-submit="true">Editer</a>
</td>
<td class="doc">
{% if issue.info.doc_focus %}<span class="icon doc"></span>{% endif %}
</td>
<td class="type">
{{ issue.info.issue_type }}
</td>
<td class="issue"><a href="{{ issue.url }}">#{{ issue.id }}</a></td>
<td class="subject">{{ issue.subject }}</td>
<td class="modules">
<span class="modules">[&nbsp;{% for module in issue.modules.keys %}{{ module }}{% if not forloop.last %},&nbsp;{% endif %}{% endfor %}&nbsp;]</span>
</td>
</tr>

View File

@ -0,0 +1,16 @@
{% extends "scrutiny/base.html" %}
{% block appbar %}
<h2>Infos du ticket #{{ form.instance.issue_id }}</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button class="submit-button">Enregistrer</button>
<a class="cancel" href="/">Annuler</a>
</div>
</form>
{% endblock %}

View File

@ -1,11 +1,5 @@
<table class="main pk-compact-table issues">
{% for issue in issues %}
<tr>
<td class="issue"><a href="{{ issue.url }}">#{{ issue.id }}</a></td>
<td class="subject">{{ issue.subject }}</td>
<td class="modules">
<span class="modules">[&nbsp;{% for module in issue.modules.keys %}{{ module }}{% if not forloop.last %},&nbsp;{% endif %}{% endfor %}&nbsp;]</span>
</td>
</tr>
{% include 'projects/issue_fragment.html' %}
{% endfor %}
</ul>

View File

@ -60,6 +60,10 @@
}
});
});
$(document).on('gadjo:dialog-done', function(ev, data) {
var $target = $(ev.target);
$target.parents('tr').replaceWith(data.content);
});
});
</script>
{% endblock %}

View File

@ -1,6 +1,7 @@
from django.urls import path, re_path
from .views import (
IssueInfoUpdate,
IssuesSnippet,
ModuleDeploymentsView,
ModuleDiffView,
@ -26,6 +27,11 @@ urlpatterns = [
name='module-diff',
),
path('issues/snippet/', IssuesSnippet.as_view(), name='issues-snippet'),
path(
'issues/<int:issue_id>/info',
IssueInfoUpdate.as_view(),
name='issue-edit-info',
),
re_path(
r'^modules/(?P<name>[\w,-]+)/issues/(?P<commit1>[\w,\.-]+)/(?P<commit2>[\w,\.-]+)$',
ModuleIssuesView.as_view(),

View File

@ -2,14 +2,21 @@ import datetime
import json
import re
from django.http import HttpResponse
from django import template
from django.http import HttpResponse, JsonResponse
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import FormView
from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView
from .models import InstalledService, InstalledVersion, Module, Project
from .utils import CommitAndIssues, decorate_commit_line, get_issue_deployment_status
from .forms import IssueInfoForm
from .models import InstalledService, InstalledVersion, IssueInfo, Module, Project
from .utils import CommitAndIssues, Issue, decorate_commit_line, get_issue_deployment_status
def is_ajax(request):
return request.headers.get('x-requested-with') == 'XMLHttpRequest'
class ProjectDetailView(DetailView):
@ -293,12 +300,44 @@ class IssuesSnippet(TemplateView):
issues[int(issue.id)].modules = {}
issues[int(issue.id)].modules[module_info['name']] = True
issues_info = IssueInfo.objects.filter(issue_id__in=issues.keys())
for info in issues_info:
issues[int(info.issue_id)].info = info
context['issues'] = list(issues.values())
context['issues'].sort(key=lambda x: int(x.id))
context['issues'].sort(key=lambda x: sorted(x.modules.keys()))
return context
class IssueInfoUpdate(FormView):
form_class = IssueInfoForm
template_name = 'projects/issue_info_form.html'
success_url = '/'
def dispatch(self, request, *args, **kwargs):
self.issue = Issue(kwargs['issue_id'])
return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self):
info, created = IssueInfo.objects.get_or_create(issue_id=self.issue.id)
kwargs = super().get_form_kwargs()
kwargs['instance'] = info
return kwargs
def form_valid(self, form):
form.save()
self.issue.info = form.instance
if not is_ajax(self.request):
return super().form_valid(form)
tmpl = template.loader.select_template(['projects/issue_fragment.html'])
response = {
'content': tmpl.render({'issue': self.issue}, self.request),
}
return JsonResponse(response)
def api_issues_json(request, *args, **kwargs):
response = HttpResponse(content_type='application/json')
issue_id = kwargs.get('issue')

View File

@ -128,6 +128,11 @@ table.loading td::after {
animation: cell-loading-pulse 10s linear infinite alternate;
}
table.issues td.edit,
table.issues td.doc {
width: 10px;
}
table.issues td.type,
table.issues td.issue {
width: 50px;
}
@ -135,6 +140,23 @@ table.issues td.modules {
width: 100px;
text-align: right;
}
table.issues td.edit a.link-action-icon,
table.issues td.doc span.icon {
display: block;
width: 1em;
overflow: hidden;
border: none;
}
table.issues td.edit a.link-action-icon.edit::before {
content: "\f044"; /* edit */
font-family: FontAwesome;
padding-right: 1ex;
}
table.issues td.doc span.icon.doc::before {
content: "\f15c"; /* fa-file-text */
font-family: FontAwesome;
padding-right: 1ex;
}
ul.user-info {
display: none;