Skip to content

Commit a585f90

Browse files
authored
Merge pull request DefectDojo#3370 from DefectDojo/release/1.10.1
Release: Merge release into master from: release/1.10.1
2 parents 1433c1e + a029313 commit a585f90

23 files changed

+1012
-359
lines changed

components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "DefectDojo",
3-
"version": "1.10.0",
3+
"version": "1.10.1",
44
"dependencies": {
55
"JUMFlot": "jumjum123/JUMFlot#*",
66
"bootstrap": "^3.4.0",

dojo/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66

77
default_app_config = 'dojo.apps.DojoAppConfig'
88

9-
__version__ = '1.10.0'
9+
__version__ = '1.10.1'
1010
__url__ = 'https://github.com/DefectDojo/django-DefectDojo'
1111
__docs__ = 'http://defectdojo.readthedocs.io/'
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Generated by Django 2.2.16 on 2020-11-08 08:01
2+
3+
from django.db import migrations
4+
import logging
5+
6+
logger = logging.getLogger(__name__)
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('dojo', '0064_jira_refactor_populate'),
13+
]
14+
15+
def delete_empty_jira_project_configs(apps, schema_editor):
16+
logger.info('removing JIRA_Projects with empty instance and empty project key created due to bugs in 1.10.0')
17+
logger.info('details in https://github.com/DefectDojo/django-DefectDojo/issues/3354')
18+
# querying on null or blank or whatever can get the wrong results, so just iterate over all configs to be reliable
19+
JIRA_Project = apps.get_model('dojo', 'JIRA_Project')
20+
for jira_project in JIRA_Project.objects.all():
21+
if not jira_project.jira_instance and not jira_project.project_key:
22+
product = jira_project.product
23+
product_id = product.id if product else 0
24+
engagement = jira_project.engagement
25+
engagement_id = engagement.id if engagement else 0
26+
27+
logger.info('removing empty JIRA_Project %i for product %i:%s engagement %i:%s', jira_project.id, product_id, product, engagement_id, engagement)
28+
jira_project.delete()
29+
30+
operations = [
31+
migrations.RunPython(delete_empty_jira_project_configs, migrations.RunPython.noop),
32+
]

dojo/engagement/views.py

Lines changed: 20 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -146,17 +146,14 @@ def edit_engagement(request, eid):
146146
engagement = Engagement.objects.get(pk=eid)
147147
is_ci_cd = engagement.engagement_type == "CI/CD"
148148
jira_epic_form = None
149-
jira_project = jira_helper.get_jira_project(engagement, use_inheritance=False)
149+
jira_project = None
150150
jira_error = False
151151

152152
if request.method == 'POST':
153153
form = EngForm(request.POST, instance=engagement, cicd=is_ci_cd, product=engagement.product.id, user=request.user)
154+
jira_project = jira_helper.get_jira_project(engagement, use_inheritance=False)
154155

155-
jira_project_form = JIRAProjectForm(request.POST, prefix='jira-project-form', instance=jira_project, target='engagement')
156-
jira_epic_form = JIRAEngagementForm(request.POST, prefix='jira-epic-form', instance=engagement)
157-
158-
if (form.is_valid() and (jira_project_form is None or jira_project_form.is_valid()) and (jira_epic_form is None or jira_epic_form.is_valid())):
159-
156+
if form.is_valid():
160157
# first save engagement details
161158
new_status = form.cleaned_data.get('status')
162159
engagement = form.save(commit=False)
@@ -170,72 +167,37 @@ def edit_engagement(request, eid):
170167
t = ", ".join('"{0}"'.format(w) for w in tags)
171168
engagement.tags = t
172169

173-
# save jira project config
174-
jira_project = jira_project_form.save(commit=False)
175-
jira_project.engagement = engagement
176-
# only check jira project if form is sufficiently populated
177-
if jira_project.jira_instance and jira_project.project_key:
178-
jira_error = not jira_helper.is_jira_project_valid(jira_project)
179-
180-
if not jira_error:
181-
jira_project.save()
182-
183-
messages.add_message(
184-
request,
185-
messages.SUCCESS,
186-
'JIRA Project config added successfully.',
187-
extra_tags='alert-success')
188-
189-
# push epic
190-
if jira_epic_form.cleaned_data.get('push_to_jira'):
191-
if jira_helper.push_to_jira(engagement):
192-
messages.add_message(
193-
request,
194-
messages.SUCCESS,
195-
'Push to JIRA for Epic queued succesfully, check alerts on the top right for errors',
196-
extra_tags='alert-success')
197-
else:
198-
jira_error = True
199-
200-
messages.add_message(
201-
request,
202-
messages.SUCCESS,
203-
'Push to JIRA for Epic failed, check alerts on the top right for errors',
204-
extra_tags='alert-danger')
205-
206170
messages.add_message(
207171
request,
208172
messages.SUCCESS,
209173
'Engagement updated successfully.',
210174
extra_tags='alert-success')
211175

212-
if not jira_error:
176+
success, jira_project_form = jira_helper.process_jira_project_form(request, instance=jira_project, engagement=engagement)
177+
error = not success
178+
179+
success, jira_epic_form = jira_helper.process_jira_epic_form(request, engagement=engagement)
180+
error = error or not success
181+
182+
if not error:
213183
if '_Add Tests' in request.POST:
214184
return HttpResponseRedirect(
215185
reverse('add_tests', args=(engagement.id, )))
216186
else:
217187
return HttpResponseRedirect(
218188
reverse('view_engagement', args=(engagement.id, )))
219-
220189
else:
221-
# if forms invalid, page will just reload and show errors
222-
if jira_project_form.errors or jira_epic_form.errors:
223-
messages.add_message(
224-
request,
225-
messages.ERROR,
226-
'Errors in JIRA forms, see below',
227-
extra_tags='alert-danger')
190+
logger.debug(form.errors)
228191

229-
else:
230-
form = EngForm(initial={'product': engagement.product}, instance=engagement, cicd=is_ci_cd, product=engagement.product, user=request.user)
192+
form = EngForm(initial={'product': engagement.product}, instance=engagement, cicd=is_ci_cd, product=engagement.product, user=request.user)
231193

232-
jira_project_form = None
233-
jira_epic_form = None
234-
if get_system_setting('enable_jira'):
235-
jira_project_form = JIRAProjectForm(prefix='jira-project-form', instance=jira_project, target='engagement', product=engagement.product)
236-
if jira_project:
237-
logger.debug('showing jira-epic-form')
238-
jira_epic_form = JIRAEngagementForm(prefix='jira-epic-form', instance=engagement)
194+
jira_project_form = None
195+
jira_epic_form = None
196+
if get_system_setting('enable_jira'):
197+
jira_project = jira_helper.get_jira_project(engagement, use_inheritance=False)
198+
jira_project_form = JIRAProjectForm(instance=jira_project, target='engagement', product=engagement.product)
199+
logger.debug('showing jira-epic-form')
200+
jira_epic_form = JIRAEngagementForm(instance=engagement)
239201

240202
form.initial['tags'] = [tag.name for tag in engagement.tags]
241203

@@ -248,6 +210,7 @@ def edit_engagement(request, eid):
248210
'edit': True,
249211
'jira_epic_form': jira_epic_form,
250212
'jira_project_form': jira_project_form,
213+
'engagement': engagement,
251214
})
252215

253216

dojo/finding/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ def edit_finding(request, fid):
671671
extra_tags='alert-danger')
672672

673673
if use_jira:
674-
jform = JIRAFindingForm(request.POST, prefix='jiraform', push_all=push_all_jira_issues, instance=finding)
674+
jform = JIRAFindingForm(request.POST, prefix='jiraform', push_all=push_all_jira_issues, instance=finding, jira_project=jira_helper.get_jira_project(finding))
675675

676676
if form.is_valid() and (jform is None or jform.is_valid()):
677677
if jform:
@@ -825,7 +825,7 @@ def edit_finding(request, fid):
825825
form_error = True
826826
else:
827827
if use_jira:
828-
jform = JIRAFindingForm(push_all=push_all_jira_issues, prefix='jiraform', instance=finding)
828+
jform = JIRAFindingForm(push_all=push_all_jira_issues, prefix='jiraform', instance=finding, jira_project=jira_helper.get_jira_project(finding))
829829

830830
if get_system_setting('enable_github'):
831831
if GITHUB_PKey.objects.filter(product=finding.test.engagement.product).exclude(git_conf_id=None):

dojo/fixtures/dojo_testdata.json

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1748,19 +1748,6 @@
17481748
"project_key": "NTEST"
17491749
}
17501750
},
1751-
{
1752-
"pk": 3,
1753-
"model": "dojo.jira_project",
1754-
"fields": {
1755-
"push_notes": false,
1756-
"product": 3,
1757-
"push_all_issues": false,
1758-
"component": "",
1759-
"enable_engagement_epic_mapping": false,
1760-
"jira_instance": 4,
1761-
"project_key": "key3"
1762-
}
1763-
},
17641751
{
17651752
"pk": 1,
17661753
"model": "dojo.note_type",

dojo/forms.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
from dojo.tools import requires_file, SCAN_SONARQUBE_API
3232
from dojo.user.helper import user_is_authorized
3333
from django.urls import reverse
34-
import dojo.jira_link.helper as jira_helper
3534
import logging
3635

3736
logger = logging.getLogger(__name__)
@@ -2077,6 +2076,8 @@ class Meta:
20772076
class JIRAProjectForm(forms.ModelForm):
20782077
jira_instance = forms.ModelChoiceField(queryset=JIRA_Instance.objects.all(), label='JIRA Instance', required=False)
20792078

2079+
prefix = 'jira-project-form'
2080+
20802081
class Meta:
20812082
model = JIRA_Project
20822083
exclude = ['product', 'engagement']
@@ -2085,18 +2086,23 @@ def __init__(self, *args, **kwargs):
20852086
# if the form is shown for an engagement, we set a placeholder text around inherited settings from product
20862087
self.target = kwargs.pop('target', 'product')
20872088
self.product = kwargs.pop('product', None)
2089+
self.engagement = kwargs.pop('engagement', None)
20882090
super().__init__(*args, **kwargs)
20892091

20902092
# logger.debug('self.target: %s, self.product: %s, self.instance: %s', self.target, self.product, self.instance)
20912093
if self.target == 'engagement':
2092-
if not self.product and self.instance and self.instance.engagement and self.instance.engagement.product:
2093-
self.product = self.instance.engagement.product
2094-
product_name = self.product.name if self.product else ''
2094+
product_name = self.product.name if self.product else self.engagement.product.name if self.engagement.product else ''
20952095

20962096
self.fields['project_key'].widget = forms.TextInput(attrs={'placeholder': 'JIRA settings inherited from product ''%s''' % product_name})
20972097
self.fields['project_key'].help_text = 'JIRA settings are inherited from product ''%s'', unless configured differently here.' % product_name
20982098
self.fields['jira_instance'].help_text = 'JIRA settings are inherited from product ''%s'' , unless configured differently here.' % product_name
20992099

2100+
# if we don't have an instance, django will insert a blank empty one :-(
2101+
# so we have to check for id to make sure we only trigger this when there is a real instance from db
2102+
if self.instance.id:
2103+
self.fields['jira_instance'].required = True
2104+
self.fields['project_key'].required = True
2105+
21002106
def clean(self):
21012107
logger.debug('validating jira project form')
21022108
cleaned_data = super().clean()
@@ -2155,6 +2161,7 @@ def __init__(self, *args, **kwargs):
21552161
self.fields['jira_issue'].widget = forms.TextInput(attrs={'placeholder': 'Leave empty and check push to jira to create a new JIRA issue'})
21562162

21572163
def clean(self):
2164+
import dojo.jira_link.helper as jira_helper
21582165
logger.debug('validating jirafindingform')
21592166
cleaned_data = super(JIRAFindingForm, self).clean()
21602167
jira_issue_key_new = self.cleaned_data.get('jira_issue')
@@ -2221,6 +2228,8 @@ def __init__(self, *args, **kwargs):
22212228

22222229

22232230
class JIRAEngagementForm(forms.Form):
2231+
prefix = 'jira-epic-form'
2232+
22242233
def __init__(self, *args, **kwargs):
22252234
self.instance = kwargs.pop('instance', None)
22262235

0 commit comments

Comments
 (0)