Passed
Push — master ( ed5cf8...85e1bb )
by Alexander
03:56 queued 01:42
created

XMLRPCNewCaseRunForm.clean_status()   A

Complexity

Conditions 2

Size

Total Lines 6
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 2
nop 1
1
# -*- coding: utf-8 -*-
2
from django import forms
3
from django.contrib.auth.models import User
4
from django.utils.translation import ugettext_lazy as _
5
6
from tcms.core.utils import string_to_list
7
from tcms.core.forms.fields import UserField
8
from tcms.management.models import Product, Version, Build
9
from tcms.testplans.models import TestPlan
10
from tcms.testcases.models import TestCase
11
from .models import TestRun, TestCaseRunStatus
12
13
14
class BaseRunForm(forms.Form):
15
    summary = forms.CharField(max_length=255)
16
    manager = UserField()
17
    default_tester = UserField(required=False)
18
    build = forms.ModelChoiceField(
19
        queryset=Build.objects.none(),
20
    )
21
    notes = forms.CharField(
22
        widget=forms.Textarea,
23
        required=False,
24
    )
25
26
    def populate(self, product_id):
27
        query = {'product_id': product_id, 'is_active': True}
28
        self.fields['build'].queryset = Build.objects.filter(**query)
29
30
31
class NewRunForm(BaseRunForm):
32
    case = forms.ModelMultipleChoiceField(
33
        label='Cases',
34
        queryset=TestCase.objects.filter(case_status__id=2).all(),
35
    )
36
37
38
class XMLRPCNewRunForm(BaseRunForm):
39
    plan = forms.ModelChoiceField(
40
        queryset=TestPlan.objects.none(),
41
    )
42
43
    def assign_plan(self, plan_id):
44
        self.fields['plan'].queryset = TestPlan.objects.filter(pk=plan_id)
45
        self.populate(self.fields['plan'].queryset.first().product_id)
46
47
48
class XMLRPCUpdateRunForm(XMLRPCNewRunForm):
49
    plan = forms.ModelChoiceField(
50
        label='Test Plan',
51
        queryset=TestPlan.objects.all(),
52
        required=False,
53
    )
54
    summary = forms.CharField(
55
        label='Summary',
56
        required=False
57
    )
58
    manager = forms.ModelChoiceField(
59
        label='Manager', queryset=User.objects.all(), required=False
60
    )
61
    product = forms.ModelChoiceField(
62
        label='Product',
63
        queryset=Product.objects.all(),
64
        empty_label=None, required=False
65
    )
66
    product_version = forms.ModelChoiceField(
67
        label='Product Version',
68
        queryset=Version.objects.none(),
69
        empty_label=None, required=False
70
    )
71
    build = forms.ModelChoiceField(
72
        label='Build',
73
        queryset=Build.objects.all(),
74
        required=False
75
    )
76
    stop_date = forms.DateTimeField(
77
        required=False,
78
        input_formats=['%Y-%m-%d'],
79
        error_messages={
80
            'invalid': _('The stop date is invalid. The valid format is YYYY-MM-DD.')
81
        }
82
    )
83
84
    def clean_status(self):
85
        return self.cleaned_data.get('status')
86
87
88
# =========== Forms for search/filter ==============
89
90
class SearchRunForm(forms.Form):
91
    """
92
        Includes *only* fields used in search.html b/c
93
        the actual search is now done via JSON RPC.
94
    """
95
    plan = forms.CharField(required=False)
96
    product = forms.ModelChoiceField(
97
        queryset=Product.objects.all(),
98
        required=False
99
    )
100
    product_version = forms.ModelChoiceField(
101
        queryset=Version.objects.none(),
102
        required=False
103
    )
104
    build = forms.ModelChoiceField(
105
        label='Build',
106
        queryset=Build.objects.none(),
107
        required=False,
108
    )
109
    default_tester = UserField(required=False)
110
    tag__name__in = forms.CharField(required=False)
111
112
    def clean_tag__name__in(self):
113
        return string_to_list(self.cleaned_data['tag__name__in'])
114
115
    def populate(self, product_id=None):
116
        if product_id:
117
            self.fields['product_version'].queryset = Version.objects.filter(
118
                product__pk=product_id
119
            )
120
            self.fields['build'].queryset = Build.objects.filter(
121
                product__pk=product_id
122
            )
123
124
125
# ===========================================================================
126
# Case run form
127
# ===========================================================================
128
129
130
class BaseCaseRunForm(forms.Form):
131
    build = forms.ModelChoiceField(
132
        label='Build', queryset=Build.objects.all(),
133
    )
134
    status = forms.ModelChoiceField(
135
        label='Case Run Status', queryset=TestCaseRunStatus.objects.all(),
136
        required=False,
137
    )
138
    assignee = UserField(label='Assignee', required=False)
139
    case_text_version = forms.IntegerField(
140
        label='Case text version', required=False
141
    )
142
    sortkey = forms.IntegerField(label='Sortkey', required=False)
143
144
145
# =========== Forms for XML-RPC functions ==============
146
147
class XMLRPCNewCaseRunForm(BaseCaseRunForm):
148
    assignee = forms.ModelChoiceField(
149
        label='Assignee', queryset=User.objects.all(), required=False
150
    )
151
    run = forms.ModelChoiceField(
152
        label='Test Run', queryset=TestRun.objects.all(),
153
    )
154
    case = forms.ModelChoiceField(
155
        label='TestCase', queryset=TestCase.objects.all(),
156
    )
157
158
    def clean_assignee(self):
159
        data = self.cleaned_data.get('assignee')
160
        if not data:
161
            if self.cleaned_data.get('case') \
162
                    and self.cleaned_data['case'].default_tester_id:
163
                data = self.cleaned_data['case'].default_tester
164
            elif self.cleaned_data.get('run') \
165
                    and self.cleaned_data['run'].default_tester_id:
166
                data = self.cleaned_data['run'].default_tester
167
168
        return data
169
170
    def clean_case_text_version(self):
171
        data = self.cleaned_data.get('case_text_version')
172
        if not data and self.cleaned_data.get('case'):
173
            tc_ltxt = self.cleaned_data['case'].latest_text()
174
            if tc_ltxt:
175
                data = tc_ltxt.case_text_version
176
177
        return data
178
179
    def clean_status(self):
180
        data = self.cleaned_data.get('status')
181
        if not data:
182
            data = TestCaseRunStatus.objects.get(name='IDLE')
183
184
        return data
185
186
187
class XMLRPCUpdateCaseRunForm(BaseCaseRunForm):
188
    assignee = forms.ModelChoiceField(
189
        label='Assignee', queryset=User.objects.all(), required=False
190
    )
191
    build = forms.ModelChoiceField(
192
        label='Build', queryset=Build.objects.all(), required=False,
193
    )
194