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

inventree / InvenTree / 4509843514

pending completion
4509843514

push

github

Oliver Walters
Add result counter to quick search bar

25881 of 29379 relevant lines covered (88.09%)

0.88 hits per line

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

17.14
/InvenTree/common/forms.py
1
"""Django forms for interacting with common objects."""
2

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

6
from .files import FileManager
1✔
7

8

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

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

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

24
        super().__init__(*args, **kwargs)
×
25

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

31
    def clean_file(self):
1✔
32
        """Run tabular file validation.
33

34
        If anything is wrong with the file, it will raise ValidationError
35
        """
36
        file = self.cleaned_data['file']
×
37

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

42
        return file
×
43

44

45
class MatchFieldForm(forms.Form):
1✔
46
    """Step 2 of FileManagementFormView."""
47

48
    def __init__(self, *args, **kwargs):
1✔
49
        """Setup filemanager and check columsn."""
50
        # Get FileManager
51
        file_manager = None
×
52
        if 'file_manager' in kwargs:
×
53
            file_manager = kwargs.pop('file_manager')
×
54

55
        super().__init__(*args, **kwargs)
×
56

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

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

77

78
class MatchItemForm(forms.Form):
1✔
79
    """Step 3 of FileManagementFormView."""
80

81
    def __init__(self, *args, **kwargs):
1✔
82
        """Setup filemanager and create fields."""
83
        # Get FileManager
84
        file_manager = None
×
85
        if 'file_manager' in kwargs:
×
86
            file_manager = kwargs.pop('file_manager')
×
87

88
        if 'row_data' in kwargs:
×
89
            row_data = kwargs.pop('row_data')
×
90
        else:
91
            row_data = None
×
92

93
        super().__init__(*args, **kwargs)
×
94

95
        # Setup FileManager
96
        file_manager.setup()
×
97

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

109
                    # check if field def was overriden
110
                    overriden_field = self.get_special_field(col_guess, row, file_manager)
×
111
                    if overriden_field:
×
112
                        self.fields[field_name] = overriden_field
×
113

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

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

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

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

176
    def get_special_field(self, col_guess, row, file_manager):
1✔
177
        """Function to be overriden in inherited forms to add specific form settings."""
178
        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

© 2026 Coveralls, Inc