flake8
-
djblets/forms/widgets.py (Diff revision 1) Show all issues -
-
Review Request #11858 — Created Oct. 20, 2021 and submitted
Information | |
---|---|
maubin | |
Djblets | |
release-3.x | |
11821, 11878 | |
Reviewers | |
djblets | |
Previously, ListEditWidget expects values to be strings with a valid
separator, thus it can only be used to edit a list of strings.
The corresponding Django template and Backbone view are hardcoded to
display string values with text inputs.This change modifies ListEditWidget so that it can modify a list of
any type of values, not just strings. This change includes the creation
of a ListEditField which has the ListEditWidget as its default widget.
This field splits a string into a list of strings, reproducing the
behaviour of the old ListEditWidget. We also introduce a
ListEditDictionaryField, which takes a dictionary and splits it into a
list of (key, value) tuples.
djblets.forms.tests
with success.Summary | Author | |
---|---|---|
Michelle |
Description | From | Last Updated |
---|---|---|
Typo in summary: dbjlets -> djblets |
|
|
Please wrap the description/testing done to 70 columns. |
|
|
Can we change the summary to be "Modify" instead of "Modifying"? |
|
|
It would be nice to write the testing done as a set of bullet points. Right now it's kind of … |
|
|
W293 blank line contains whitespace |
![]() |
|
W293 blank line contains whitespace |
![]() |
|
E303 too many blank lines (2) |
![]() |
|
Will change {{forloop.counter0}} to 0 |
![]() |
|
This trailing comma will break older browsers, since it's outputted directly to the browser, and is not in a .es6.js … |
|
|
Django's MultiWidget also takes in a child widget (well, a list of them). It accepts either a class or an … |
|
|
So here's a big thing I missed in my prior review (and this is all from the original design, which … |
|
|
This could be one statement. |
|
|
No need for parens around name. In fact, (name) is equivalent to name. If we instead had (name,), then it'd … |
|
|
I suspect we won't want to use attrs itself here. Those are the attributes for the ListEditWidget, which will probably … |
|
|
We reference self.value_widget many times. Each time we do that, we have to go through the attribute accessor paths in … |
|
|
Missing a trailing comma. |
|
|
Technically, this makes this a breaking change, which requires a Djblets major version bump (we follow semantic versioning in Djblets, … |
|
|
W291 trailing whitespace |
![]() |
|
W291 trailing whitespace |
![]() |
|
W293 blank line contains whitespace |
![]() |
|
W291 trailing whitespace |
![]() |
|
W291 trailing whitespace |
![]() |
|
W293 blank line contains whitespace |
![]() |
|
W291 trailing whitespace |
![]() |
|
W291 trailing whitespace |
![]() |
|
W293 blank line contains whitespace |
![]() |
|
W293 blank line contains whitespace |
![]() |
|
W391 blank line at end of file |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
E231 missing whitespace after ',' |
![]() |
|
W292 no newline at end of file |
![]() |
|
It's possible that when you are creating ListEditView here, it is not defined, That's why the error Cannot read properties … |
![]() |
|
You're actually storing this as _sep in the __init__ method. We don't need to have any documentation for purely internal/private … |
|
|
This can be dedented 4 spaces. |
|
|
Dedent 4 spaces. |
|
|
This should just be indented 4 spaces, not 7. Even better would be to reformat the docstring so the first … |
|
|
Because this init method doesn't do anything but call the superclass, we can just get rid of it. |
|
|
Dedent 4 spaces. |
|
|
Dedent 4 spaces. |
|
|
This should have a "Raises" section with django.forms.ValidationError |
|
|
This new line can go away (plus you added some trailing whitespace). |
|
|
This new line can go away (plus you added some trailing whitespace). |
|
|
Please add a module docstring for this. |
|
|
Please add a module docstring for this. |
|
|
We generally avoid the python ternary syntax because it's not particularly readable. Let's just make this an if/else. |
|
|
Add a blank line between these two. For properties, we can also skip "Returns" and just put in: Type: django.forms.widgets.Media … |
|
|
We do sometimes say "list or unicode" to clarify here. |
|
|
Trailing whitespace on this line. |
|
|
Trailing whitespace on this line. |
|
|
Col: 87 Missing semicolon. |
![]() |
|
Trailing whitespace on this line. |
|
|
Trailing whitespace on this line. |
|
|
Trailing whitespace on this line. |
|
|
Trailing whitespace on this line. |
|
|
We don't use var in .es6 files. That said, if you change the .each() to use a fat-arrow function, you … |
|
|
Col: 62 Missing semicolon. |
![]() |
|
Col: 7 Missing semicolon. |
![]() |
|
Please keep the import list alphabetized |
|
|
Add a blank line between these two (in python classes, there's one blank line between each thing, and the docstring … |
|
|
These are each indented one space too many. |
|
|
Each of these lines needs to be indented one more space. |
|
|
This new line can be removed. |
|
|
Add a blank line between these two. |
|
|
Add a blank line between these two. |
|
|
f before w |
|
|
Test docstrings shouldn't have a period at the end, because the test runner will print an ellipsis. |
|
|
Type definitions don't need an explanation, just the type name. The explanation of the property is in the docstring above … |
|
|
Add a blank line between these two. |
|
|
This line can go away. |
|
|
Instead of passing in len to filter, we should use None. This will do a falsy check instead of actually … |
|
|
Type here can be jQuery |
|
|
It looks like this is taking in a jQuery, so we should list that here and call the argument name … |
|
|
Let's define a variable for $(el) so we don't have to construct the jQuery object twice. |
|
|
Should this be removed? |
|
|
We no longer need this on djblets release-3.x or master. |
|
|
We no longer need this on djblets release-3.x or master. |
|
|
We need to add some blank lines between all of these. |
|
|
The outer parens aren't necessary here. |
|
Description: |
|
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Testing Done: |
|
||||||||||||
Commits: |
|
||||||||||||
Diff: |
Revision 2 (+78 -52) |
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 2) |
---|
Will change
{{forloop.counter0}}
to0
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 2) |
---|
This trailing comma will break older browsers, since it's outputted directly to the browser, and is not in a
.es6.js
file (which would compile suitably for the browsers we need to support).
djblets/forms/widgets.py (Diff revision 2) |
---|
Django's
MultiWidget
also takes in a child widget (well, a list of them). It accepts either a class or an instance in the constructor, and if it's a class, it'll instantiate it.I think that's the right pattern, and the right default. Taking in a class just stores a reference to the class in the list of default values for the function.
Making the default an instance means that:
- We instantiate the
TextInput
and keep this around forever (using memory that may not be needed)- We actually share that default instance across all
ListEditWidget
instances by default, which could lead to errors with state being clobbered.Let's make the default a reference to the class, and then in the constructor we can instantiate it if it's a class or store directly if the caller provided an instance.
djblets/forms/widgets.py (Diff revision 2) |
---|
No need for parens around
name
. In fact,(name)
is equivalent toname
. If we instead had(name,)
, then it'd be a tuple with one value (name
) in it.A tuple is often a correct thing to pass in using
%
-based formatting, but isn't necessary in this particular case.Caveat: If the value being passed in was iterable (a list or tuple, for example), we would need to wrap it as
(value,)
, or the%
-formatting would be looking inside of it for values to stuff into the%s
and such.
djblets/forms/widgets.py (Diff revision 2) |
---|
I suspect we won't want to use
attrs
itself here. Those are the attributes for theListEditWidget
, which will probably differ.A base set of
attrs
are generally provided upon widget instantiation (or overridden in the widget itself), and then built upon when it's time to render. So starting out, we'd probably want:widget_attrs = value_widget.attrs
Which we could pass in to
render()
.If we wanted to add our own attributes to each value (say, giving them each a unique ID in the DOM — something worth considering in the future — consider the following an example only), we'd do something like:
common_widget_attrs = value_widget.attrs for i, val in enumerate(value_list): widget_attrs = {} if 'id' in attrs: widget_attrs['id'] = '%s_%s' % (self.id_for_label(attrs['id']), i) render( ..., attrs=value_widget.build_attrs(common_widget_attrs, widget_attrs))
So, taking those base attributes, and then modifying them on each loop so it's suitable for that row.
For reference:
enumerate
wraps an iterable, yielding an index and the value for each iteration.id_for_label
returns a suitable ID for the widget.build_attrs
takes in common attributes and specific attributes and returns a new dictionary combining the two.djblets/forms/widgets.py (Diff revision 2) |
---|
We reference
self.value_widget
many times. Each time we do that, we have to go through the attribute accessor paths in the class. Not particularly slow, but not worth doing. Let's pull outvalue_widget
into a local variable before the loop above, so accesses are fast.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 2) |
---|
Technically, this makes this a breaking change, which requires a Djblets major version bump (we follow semantic versioning in Djblets, at least nowadays).
This is probably fine, since we're targeting Djblets 3.0 for this work, but we need to document this with the following before the
Args
section:Version Changed: 3.0: * Removed the `inputAttrs` option. * Added the `renderedDefaultRow` option.
(Also,
renderedDefaultRow
will need to be documented.)
djblets/forms/widgets.py (Diff revision 2) |
---|
So here's a big thing I missed in my prior review (and this is all from the original design, which makes modernizing this tricky).
This code is still assuming that we're dealing strictly with individual strings (and that we can just split them). That isn't safe, as the widget may be returning an integer, a list, a dictionary, or even string-encoded content that may get split wrong.
However, we don't want to break existing consumers.
The problem comes down to the original design. This assumed it was only ever going to work with strings, and that the data being fed in was a string that had a valid separator.
It should have been designed to work in conjunction with a matching field that prepared the value before it got to
render()
, turning whatever the content would be into a list of values that pertained to the widgets.Basically, it should be the job of the field to prepare data and the job of a widget to render it. The widget shouldn't have to be parsing anything.
So I think we can work our way toward this design by doing the following:
- In
render()
, check ifvalue
is a list. If so, we're good. This is modern. If not, convert it to a list through this existing logic we have here. (Update the code to reusevalue
, instead ofvalue_list
, to make it clear that this is what we expect of it.)- Add a comment saying that we plan to deprecate this behavior. In a future release, we'll enable deprecation warnings for this code path.
- Introduce a
djblets.forms.fields.ListEditField
. This will be the new field intended to work withListEditWidget
. Its job will be to take in a string and convert it to values, and to associateListEditWidget
as the default widget. Subclasses (such as your field for the Pygments work) can do that conversion however is needed. By default, it should split in the same way that the widget otherwise would.This effectively gives us a migration path to that ideal world in which the widget just renders, and the field handles the data processing. It would then be really easy to subclass these and get the data and widget setup in the right form.
That may sound like a lot, but the field work isn't going to be too bad. Not documented as well as it should be, but I can guide you through any of it.
Create ListEditField and ListEditDictionaryField and their tests
Description: |
|
|||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Testing Done: |
|
|||||||||||||||||||||||||||
Commits: |
|
|||||||||||||||||||||||||||
Diff: |
Revision 3 (+539 -63) |
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 3) |
---|
E231 missing whitespace after ','
Commits: |
|
||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 4 (+555 -81) |
Add get_context and value_from_datadict methods
Commits: |
|
||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 5 (+744 -144) |
Working on javascript logic for dynamically adding and removing values in listeditwidget.
Commits: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 6 (+812 -238) |
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 6) |
---|
It's possible that when you are creating ListEditView here, it is not defined, That's why the error
Cannot read properties of undefined (reading 'ListEditView')
happens? I would try to see if I can do something likeconsole.log(Djblets.Forms)
just to see if the class is properly imported/accessible within this HTML. You might need to add extra code to specify where to get the ListEditView from
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 6) |
---|
Are you calling/importing the Form correctly? Adding the correct classes (ex. multipart/form) when rendering it in the HTML? Does new items in the listeditview require a different form of parsing than just parsing the text?
I would also console.log() it out to see if the result is what you're expecting, and check the types of the results too.
Done all the logic for ListEditWidget, need to modify tests
Description: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Commits: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Diff: |
Revision 7 (+974 -326) |
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Col: 87 Missing semicolon.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Col: 62 Missing semicolon.
I know this is still marked WIP, but it's looking really solid so I did a pretty thorough review.
djblets/forms/fields.py (Diff revision 7) |
---|
You're actually storing this as
_sep
in the__init__
method. We don't need to have any documentation for purely internal/private attributes, unless they're particularly confusing or complicated.
djblets/forms/fields.py (Diff revision 7) |
---|
This should just be indented 4 spaces, not 7. Even better would be to reformat the docstring so the first line fits on one line and move any details into a second paragraph.
djblets/forms/fields.py (Diff revision 7) |
---|
Because this init method doesn't do anything but call the superclass, we can just get rid of it.
djblets/forms/fields.py (Diff revision 7) |
---|
This should have a "Raises" section with
django.forms.ValidationError
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 7) |
---|
This new line can go away (plus you added some trailing whitespace).
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 7) |
---|
This new line can go away (plus you added some trailing whitespace).
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 7) |
---|
Please add a module docstring for this.
djblets/forms/tests/test_list_edit_field.py (Diff revision 7) |
---|
Please add a module docstring for this.
djblets/forms/widgets.py (Diff revision 7) |
---|
We generally avoid the python ternary syntax because it's not particularly readable. Let's just make this an if/else.
djblets/forms/widgets.py (Diff revision 7) |
---|
Add a blank line between these two.
For properties, we can also skip "Returns" and just put in:
Type: django.forms.widgets.Media
because callers can use it as if it were just a plain attribute and not a method.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Trailing whitespace on this line.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Trailing whitespace on this line.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Trailing whitespace on this line.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Trailing whitespace on this line.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Trailing whitespace on this line.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
Trailing whitespace on this line.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 7) |
---|
We don't use
var
in .es6 files. That said, if you change the.each()
to use a fat-arrow function, you can just usethis
directly instead of aliasing it toself
.
Commits: |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 8 (+1027 -375) |
Summary: |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Description: |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Testing Done: |
|
Summary: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Description: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Testing Done: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Commits: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Diff: |
Revision 9 (+1605 -623) |
djblets/static/djblets/js/forms/views/tests/listEditViewTests.es6.js (Diff revision 9) |
---|
Col: 7 Missing semicolon.
Commits: |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 10 (+1601 -619) |
djblets/forms/fields.py (Diff revision 10) |
---|
Add a blank line between these two (in python classes, there's one blank line between each thing, and the docstring counts as a thing).
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 10) |
---|
These are each indented one space too many.
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 10) |
---|
Each of these lines needs to be indented one more space.
djblets/forms/templates/djblets_forms/list_edit_widget.html (Diff revision 10) |
---|
This new line can be removed.
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 10) |
---|
Add a blank line between these two.
djblets/forms/tests/test_list_edit_widget.py (Diff revision 10) |
---|
Test docstrings shouldn't have a period at the end, because the test runner will print an ellipsis.
djblets/forms/widgets.py (Diff revision 10) |
---|
Type definitions don't need an explanation, just the type name. The explanation of the property is in the docstring above this.
djblets/forms/widgets.py (Diff revision 10) |
---|
Instead of passing in
len
to filter, we should useNone
. This will do a falsy check instead of actually checking the length of the string, which is ever so slightly faster.
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 10) |
---|
Type here can be
jQuery
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 10) |
---|
It looks like this is taking in a jQuery, so we should list that here and call the argument name $entry
djblets/static/djblets/js/forms/views/listEditView.es6.js (Diff revision 10) |
---|
Let's define a variable for
$(el)
so we don't have to construct the jQuery object twice.
djblets/static/djblets/js/forms/views/tests/listEditViewTests.es6.js (Diff revision 10) |
---|
Should this be removed?
Commits: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 11 (+1626 -640) |
Testing Done: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Commits: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Branch: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Diff: |
Revision 12 (+1400 -420) |
It would be nice to write the testing done as a set of bullet points. Right now it's kind of hard to read.
djblets/forms/tests/test_list_edit_dictionary_field.py (Diff revision 12) |
---|
We no longer need this on djblets release-3.x or master.
djblets/forms/tests/test_list_edit_field.py (Diff revision 12) |
---|
We no longer need this on djblets release-3.x or master.
Summary: |
|
||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Testing Done: |
|
||||||||||||||||||||||||||||||
Commits: |
|
||||||||||||||||||||||||||||||
Diff: |
Revision 13 (+1398 -420) |
Testing Done: |
|
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Commits: |
|
||||||||||||
Diff: |
Revision 14 (+1400 -420) |
Commits: |
|
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 15 (+1492 -428) |
got rid of some unnecessary "Version Added:"s
Commits: |
|
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 16 (+1462 -428) |