• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

inventree / InvenTree / 8535197168

03 Apr 2024 07:58AM CUT coverage: 90.342% (-2.2%) from 92.496%
8535197168

Pull #6881

github

web-flow
Merge a1722af93 into 6be2ede5e
Pull Request #6881: [PUI] Add coverage testing

227 of 631 branches covered (35.97%)

Branch coverage included in aggregate %.

0 of 1 new or added line in 1 file covered. (0.0%)

1 existing line in 1 file now uncovered.

31971 of 35009 relevant lines covered (91.32%)

1.12 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

10.42
/src/backend/InvenTree/common/forms.py
1
"""Django forms for interacting with common objects."""
2

3
from django import forms
4
from django.utils.translation import gettext as _
5

6
from .files import FileManager
7

8

9
class UploadFileForm(forms.Form):
10
    """Step 1 of FileManagementFormView."""
11

12
    file = forms.FileField(label=_('File'), help_text=_('Select file to upload'))
1✔
13

14
    def __init__(self, *args, **kwargs):
1✔
15
        """Update label and help_text."""
16
        # Get file name
17
        name = None
18
        if 'name' in kwargs:
19
            name = kwargs.pop('name')
20

21
        super().__init__(*args, **kwargs)
22

23
        if name:
24
            # Update label and help_text with file name
25
            self.fields['file'].label = _(f'{name.title()} File')
26
            self.fields['file'].help_text = _(f'Select {name} file to upload')
27

28
    def clean_file(self):
29
        """Run tabular file validation.
30

31
        If anything is wrong with the file, it will raise ValidationError
32
        """
33
        file = self.cleaned_data['file']
×
34

35
        # Validate file using FileManager class - will perform initial data validation
36
        # (and raise a ValidationError if there is something wrong with the file)
37
        FileManager.validate(file)
×
38

39
        return file
×
40

41

42
class MatchFieldForm(forms.Form):
1✔
43
    """Step 2 of FileManagementFormView."""
44

45
    def __init__(self, *args, **kwargs):
46
        """Setup filemanager and check columns."""
47
        # Get FileManager
48
        file_manager = None
×
49
        if 'file_manager' in kwargs:
×
50
            file_manager = kwargs.pop('file_manager')
×
51

52
        super().__init__(*args, **kwargs)
×
53

54
        # Setup FileManager
55
        file_manager.setup()
×
56
        # Get columns
57
        columns = file_manager.columns()
×
58
        # Get headers choices
59
        headers_choices = [(header, header) for header in file_manager.HEADERS]
×
60

61
        # Create column fields
62
        for col in columns:
×
63
            field_name = col['name']
×
64
            self.fields[field_name] = forms.ChoiceField(
65
                choices=[('', '-' * 10)] + headers_choices,
66
                required=False,
67
                widget=forms.Select(attrs={'class': 'select fieldselect'}),
68
            )
69
            if col['guess']:
×
70
                self.fields[field_name].initial = col['guess']
×
71

72

73
class MatchItemForm(forms.Form):
1✔
74
    """Step 3 of FileManagementFormView."""
75

76
    def __init__(self, *args, **kwargs):
77
        """Setup filemanager and create fields."""
78
        # Get FileManager
79
        file_manager = None
×
80
        if 'file_manager' in kwargs:
×
81
            file_manager = kwargs.pop('file_manager')
×
82

83
        if 'row_data' in kwargs:
×
84
            row_data = kwargs.pop('row_data')
×
85
        else:
×
86
            row_data = None
×
87

88
        super().__init__(*args, **kwargs)
×
89

90
        # Setup FileManager
91
        file_manager.setup()
×
92

93
        # Create fields
94
        if row_data:
×
95
            # Navigate row data
96
            for row in row_data:
×
97
                # Navigate column data
98
                for col in row['data']:
×
99
                    # Get column matching
100
                    col_guess = col['column'].get('guess', None)
×
101
                    # Set field name
102
                    field_name = col_guess.lower() + '-' + str(row['index'])
×
103

104
                    # check if field def was overridden
105
                    overriden_field = self.get_special_field(
106
                        col_guess, row, file_manager
107
                    )
108
                    if overriden_field:
×
109
                        self.fields[field_name] = overriden_field
×
110

111
                    # Create input for required headers
112
                    elif col_guess in file_manager.REQUIRED_HEADERS:
×
113
                        # Get value
114
                        value = row.get(col_guess.lower(), '')
×
115
                        # Set field input box
116
                        self.fields[field_name] = forms.CharField(
117
                            required=True, initial=value
118
                        )
119

120
                    # Create item selection box
121
                    elif col_guess in file_manager.OPTIONAL_MATCH_HEADERS:
×
122
                        # Get item options
123
                        item_options = [
124
                            (option.id, option)
125
                            for option in row['match_options_' + col_guess]
126
                        ]
127
                        # Get item match
128
                        item_match = row['match_' + col_guess]
×
129
                        # Set field select box
130
                        self.fields[field_name] = forms.ChoiceField(
131
                            choices=[('', '-' * 10)] + item_options,
132
                            required=False,
133
                            widget=forms.Select(attrs={'class': 'select bomselect'}),
134
                        )
135
                        # Update select box when match was found
136
                        if item_match:
×
137
                            self.fields[field_name].initial = item_match.id
×
138

139
                    # Create item selection box
140
                    elif col_guess in file_manager.ITEM_MATCH_HEADERS:
×
141
                        # Get item options
142
                        item_options = [
143
                            (option.id, option) for option in row['item_options']
144
                        ]
145
                        # Get item match
146
                        item_match = row['item_match']
×
147
                        # Set field name
148
                        field_name = 'item_select-' + str(row['index'])
×
149
                        # Set field select box
150
                        self.fields[field_name] = forms.ChoiceField(
151
                            choices=[('', '-' * 10)] + item_options,
152
                            required=False,
153
                            widget=forms.Select(attrs={'class': 'select bomselect'}),
154
                        )
155
                        # Update select box when match was found
156
                        if item_match:
×
157
                            # Make it a required field: does not validate if
158
                            # removed using JS function
159
                            # self.fields[field_name].required = True
160
                            # Update initial value
161
                            self.fields[field_name].initial = item_match.id
×
162

163
                    # Optional entries
164
                    elif col_guess in file_manager.OPTIONAL_HEADERS:
×
165
                        # Get value
166
                        value = row.get(col_guess.lower(), '')
×
167
                        # Set field input box
168
                        self.fields[field_name] = forms.CharField(
169
                            required=False, initial=value
170
                        )
171

172
    def get_special_field(self, col_guess, row, file_manager):
1✔
173
        """Function to be overridden in inherited forms to add specific form settings."""
174
        return None
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc