mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			385 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			385 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ================
 | |
| Triaging tickets
 | |
| ================
 | |
| 
 | |
| Django uses Trac_ for managing the work on the code base. Trac is a
 | |
| community-tended garden of the bugs people have found and the features people
 | |
| would like to see added. As in any garden, sometimes there are weeds to be
 | |
| pulled and sometimes there are flowers and vegetables that need picking. We need
 | |
| your help to sort out one from the other, and in the end we all benefit
 | |
| together.
 | |
| 
 | |
| Like all gardens, we can aspire to perfection but in reality there's no such
 | |
| thing. Even in the most pristine garden there are still snails and insects.
 | |
| In a community garden there are also helpful people who -- with the best of
 | |
| intentions -- fertilize the weeds and poison the roses. It's the job of the
 | |
| community as a whole to self-manage, keep the problems to a minimum, and
 | |
| educate those coming into the community so that they can become valuable
 | |
| contributing members.
 | |
| 
 | |
| Similarly, while we aim for Trac to be a perfect representation of the state
 | |
| of Django's progress, we acknowledge that this simply will not happen. By
 | |
| distributing the load of Trac maintenance to the community, we accept that
 | |
| there will be mistakes. Trac is "mostly accurate", and we give allowances for
 | |
| the fact that sometimes it will be wrong. That's okay. We're perfectionists
 | |
| with deadlines.
 | |
| 
 | |
| We rely on the community to keep participating, keep tickets as accurate as
 | |
| possible, and raise issues for discussion on our mailing lists when there is
 | |
| confusion or disagreement.
 | |
| 
 | |
| Django is a community project, and every contribution helps. We can't do this
 | |
| without YOU!
 | |
| 
 | |
| Triage workflow
 | |
| ---------------
 | |
| 
 | |
| Unfortunately, not all bug reports and feature requests in the ticket tracker
 | |
| provide all the :doc:`required details<bugs-and-features>`. A number of
 | |
| tickets have patches, but those patches don't meet all the requirements of a
 | |
| :ref:`good patch<patch-style>`.
 | |
| 
 | |
| One way to help out is to *triage* tickets that have been created by other
 | |
| users. The core team and several community members work on this regularly, but
 | |
| more help is always appreciated.
 | |
| 
 | |
| Most of the workflow is based around the concept of a ticket's
 | |
| :ref:`triage stages <triage-stages>`. Each stage describes where in its
 | |
| lifetime a given ticket is at any time. Along with a handful of flags, this
 | |
| attribute easily tells us what and who each ticket is waiting on.
 | |
| 
 | |
| Since a picture is worth a thousand words, let's start there:
 | |
| 
 | |
| .. image:: /internals/_images/triage_process.*
 | |
|    :height: 564
 | |
|    :width: 580
 | |
|    :alt: Django's ticket triage workflow
 | |
| 
 | |
| We've got two roles in this diagram:
 | |
| 
 | |
| * :doc:`Committers</internals/committers>` (also called core developers):
 | |
|   people with commit access who are responsible for making the big
 | |
|   decisions, writing large portions of the code and integrating the
 | |
|   contributions of the community.
 | |
| 
 | |
| * Ticket triagers: anyone in the Django community who chooses to
 | |
|   become involved in Django's development process. Our Trac installation
 | |
|   is intentionally left open to the public, and anyone can triage tickets.
 | |
|   Django is a community project, and we encourage :ref:`triage by the
 | |
|   community<how-can-i-help-with-triaging>`.
 | |
| 
 | |
| By way of example, here we see the lifecycle of an average ticket:
 | |
| 
 | |
| * Alice creates a ticket, and uploads an incomplete patch (no tests, incorrect
 | |
|   implementation).
 | |
| 
 | |
| * Bob reviews the patch, marks it "Accepted", "needs tests", and "patch needs
 | |
|   improvement", and leaves a comment telling Alice how the patch could be
 | |
|   improved.
 | |
| 
 | |
| * Alice updates the patch, adding tests (but not changing the
 | |
|   implementation). She removes the two flags.
 | |
| 
 | |
| * Charlie reviews the patch and resets the "patch needs improvement" flag with
 | |
|   another comment about improving the implementation.
 | |
| 
 | |
| * Alice updates the patch, fixing the implementation. She removes the "patch
 | |
|   needs improvement" flag.
 | |
| 
 | |
| * Daisy reviews the patch, and marks it RFC.
 | |
| 
 | |
| * Jacob, a core developer, reviews the RFC patch, applies it to his checkout,
 | |
|   and commits it.
 | |
| 
 | |
| Some tickets require much less feedback than this, but then again some tickets
 | |
| require much much more.
 | |
| 
 | |
| .. _triage-stages:
 | |
| 
 | |
| Triage stages
 | |
| -------------
 | |
| 
 | |
| Below we describe in more detail the various stages that a ticket may flow
 | |
| through during its lifetime.
 | |
| 
 | |
| Unreviewed
 | |
| ~~~~~~~~~~
 | |
| 
 | |
| The ticket has not been reviewed by anyone who felt qualified to make a
 | |
| judgment about whether the ticket contained a valid issue, a viable feature,
 | |
| or ought to be closed for any of the various reasons.
 | |
| 
 | |
| Accepted
 | |
| ~~~~~~~~
 | |
| 
 | |
| The big grey area! The absolute meaning of "accepted" is that the issue
 | |
| described in the ticket is valid and is in some stage of being worked on.
 | |
| Beyond that there are several considerations:
 | |
| 
 | |
| * **Accepted + No Flags**
 | |
| 
 | |
|   The ticket is valid, but no one has submitted a patch for it yet. Often this
 | |
|   means you could safely start writing a patch for it.
 | |
| 
 | |
| * **Accepted + Has Patch**
 | |
| 
 | |
|   The ticket is waiting for people to review the supplied patch. This means
 | |
|   downloading the patch and trying it out, verifying that it contains tests
 | |
|   and docs, running the test suite with the included patch, and leaving
 | |
|   feedback on the ticket.
 | |
| 
 | |
| * **Accepted + Has Patch + (any other flag)**
 | |
| 
 | |
|   This means the ticket has been reviewed, and has been found to need further
 | |
|   work. "Needs tests" and "Needs documentation" are self-explanatory. "Patch
 | |
|   needs improvement" will generally be accompanied by a comment on the ticket
 | |
|   explaining what is needed to improve the code.
 | |
| 
 | |
| Design Decision Needed
 | |
| ~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| This stage is for issues which may be contentious, may be backwards
 | |
| incompatible, or otherwise involve high-level design decisions. These issues
 | |
| should be discussed either in the ticket comments or on `django-developers`_.
 | |
| 
 | |
| If a ticket has been marked as "DDN", decisions are generally eventually
 | |
| made by the core committers, however that is not a requirement. See the
 | |
| :ref:`New contributors' FAQ<new-contributors-faq>` for "My ticket has been in
 | |
| DDN forever! What should I do?"
 | |
| 
 | |
| This stage will often be used for feature requests. It can also be used for
 | |
| issues that *might* be bugs, depending on opinion or interpretation. Obvious
 | |
| bugs (such as crashes, incorrect query results, or non-compliance with a
 | |
| standard) skip this stage and move straight to "Accepted".
 | |
| 
 | |
| Ready For Checkin
 | |
| ~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| The ticket was reviewed by any member of the community other than the person
 | |
| who supplied the patch and found to meet all the requirements for a
 | |
| commit-ready patch. A core committer now needs to give the patch a final
 | |
| review prior to being committed. See the
 | |
| :ref:`New contributors' FAQ<new-contributors-faq>` for "My ticket has been in
 | |
| RFC forever! What should I do?"
 | |
| 
 | |
| Someday/Maybe
 | |
| ~~~~~~~~~~~~~
 | |
| 
 | |
| Generally only used for vague/high-level features or design ideas. These
 | |
| tickets are uncommon and overall less useful since they don't describe
 | |
| concrete actionable issues. They are enhancement requests that we might
 | |
| consider adding someday to the framework if an excellent patch is submitted.
 | |
| These tickets are not a high priority.
 | |
| 
 | |
| Other triage attributes
 | |
| -----------------------
 | |
| 
 | |
| A number of flags, appearing as checkboxes in Trac, can be set on a ticket:
 | |
| 
 | |
| * Has patch
 | |
|     This means the ticket has an associated
 | |
|     :doc:`patch<writing-code/submitting-patches>`. These will be reviewed
 | |
|     to see if the patch is "good".
 | |
| 
 | |
| * Needs documentation:
 | |
|     This flag is used for tickets with patches that need associated
 | |
|     documentation. Complete documentation of features is a prerequisite
 | |
|     before we can check them into the codebase.
 | |
| 
 | |
| * Needs tests
 | |
|     This flags the patch as needing associated unit tests. Again, this
 | |
|     is a required part of a valid patch.
 | |
| 
 | |
| * Patch needs improvement
 | |
|     This flag means that although the ticket *has* a patch, it's not quite
 | |
|     ready for checkin. This could mean the patch no longer applies
 | |
|     cleanly, there is a flaw in the implementation, or that the code
 | |
|     doesn't meet our standards.
 | |
| 
 | |
| * Easy pickings
 | |
|     Tickets that would require small, easy, patches.
 | |
| 
 | |
| Tickets should be categorized by *type* between:
 | |
| 
 | |
| * New Feature
 | |
|     For adding something new.
 | |
| 
 | |
| * Bug
 | |
|     For when an existing thing is broken or not behaving as expected.
 | |
| 
 | |
| * Cleanup/optimization
 | |
|     For when nothing is broken but something could be made cleaner,
 | |
|     better, faster, stronger.
 | |
| 
 | |
| Tickets should also be classified into *components* indicating which area of
 | |
| the Django codebase they belong to. This makes tickets better organized and
 | |
| easier to find.
 | |
| 
 | |
| The *severity* attribute is used to identify blockers, that is, issues which
 | |
| should get fixed before releasing the next version of Django. Typically those
 | |
| issues are bugs causing regressions from earlier versions or potentially
 | |
| causing severe data losses. This attribute is quite rarely used and the vast
 | |
| majority of tickets have a severity of "Normal".
 | |
| 
 | |
| Finally, it is possible to use the *version* attribute to indicate in which
 | |
| version the reported bug was identified.
 | |
| 
 | |
| .. _closing-tickets:
 | |
| 
 | |
| Closing Tickets
 | |
| ---------------
 | |
| 
 | |
| When a ticket has completed its useful lifecycle, it's time for it to be
 | |
| closed. Closing a ticket is a big responsibility, though. You have to be sure
 | |
| that the issue is really resolved, and you need to keep in mind that the
 | |
| reporter of the ticket may not be happy to have their ticket closed (unless
 | |
| it's fixed, of course). If you're not certain about closing a ticket, just
 | |
| leave a comment with your thoughts instead.
 | |
| 
 | |
| If you do close a ticket, you should always make sure of the following:
 | |
| 
 | |
| * Be certain that the issue is resolved.
 | |
| 
 | |
| * Leave a comment explaining the decision to close the ticket.
 | |
| 
 | |
| * If there is a way they can improve the ticket to reopen it, let them know.
 | |
| 
 | |
| * If the ticket is a duplicate, reference the original ticket. Also
 | |
|   cross-reference the closed ticket by leaving a comment in the original one
 | |
|   -- this allows to access more related information about the reported bug
 | |
|   or requested feature.
 | |
| 
 | |
| * **Be polite.** No one likes having their ticket closed. It can be
 | |
|   frustrating or even discouraging. The best way to avoid turning people
 | |
|   off from contributing to Django is to be polite and friendly and to offer
 | |
|   suggestions for how they could improve this ticket and other tickets in
 | |
|   the future.
 | |
| 
 | |
| A ticket can be resolved in a number of ways:
 | |
| 
 | |
| * fixed
 | |
|       Used by the core developers once a patch has been rolled into
 | |
|       Django and the issue is fixed.
 | |
| 
 | |
| * invalid
 | |
|       Used if the ticket is found to be incorrect. This means that the
 | |
|       issue in the ticket is actually the result of a user error, or
 | |
|       describes a problem with something other than Django, or isn't
 | |
|       a bug report or feature request at all (for example, some new users
 | |
|       submit support queries as tickets).
 | |
| 
 | |
| * wontfix
 | |
|       Used when a core developer decides that this request is not
 | |
|       appropriate for consideration in Django. This is usually chosen after
 | |
|       discussion in the `django-developers`_ mailing list. Feel free to
 | |
|       start or join in discussions of "wontfix" tickets on the
 | |
|       django-developers_ mailing list, but please do not reopen tickets
 | |
|       closed as "wontfix" by a :doc:`core developer</internals/committers>`.
 | |
| 
 | |
| * duplicate
 | |
|       Used when another ticket covers the same issue. By closing duplicate
 | |
|       tickets, we keep all the discussion in one place, which helps
 | |
|       everyone.
 | |
| 
 | |
| * worksforme
 | |
|       Used when the ticket doesn't contain enough detail to replicate
 | |
|       the original bug.
 | |
| 
 | |
| * needsinfo
 | |
|       Used when the ticket does not contain enough information to replicate
 | |
|       the reported issue but is potentially still valid. The ticket
 | |
|       should be reopened when more information is supplied.
 | |
| 
 | |
| If you believe that the ticket was closed in error -- because you're
 | |
| still having the issue, or it's popped up somewhere else, or the triagers have
 | |
| made a mistake -- please reopen the ticket and provide further information.
 | |
| Again, please do not reopen tickets that have been marked as "wontfix" by core
 | |
| developers and bring the issue to django-developers_ instead.
 | |
| 
 | |
| .. _how-can-i-help-with-triaging:
 | |
| 
 | |
| How can I help with triaging?
 | |
| -----------------------------
 | |
| 
 | |
| Although the core developers make the big decisions in the ticket triage
 | |
| process, there's a lot that general community members can do to help the
 | |
| triage process. Really, **ANYONE** can help.
 | |
| 
 | |
| Start by `creating an account on Trac`_. If you have an account but have
 | |
| forgotten your password, you can reset it using the `password reset page`_.
 | |
| 
 | |
| Then, you can help out by:
 | |
| 
 | |
| * Closing "Unreviewed" tickets as "invalid", "worksforme" or "duplicate."
 | |
| 
 | |
| * Promoting "Unreviewed" tickets to "Design decision needed" if a design
 | |
|   decision needs to be made, or "Accepted" in case of obvious bugs or
 | |
|   sensible, clearly defined, feature requests.
 | |
| 
 | |
| * Correcting the "Needs tests", "Needs documentation", or "Has patch"
 | |
|   flags for tickets where they are incorrectly set.
 | |
| 
 | |
| * Setting the "`Easy pickings`_" flag for tickets that are small and
 | |
|   relatively straightforward.
 | |
| 
 | |
| * Checking that old tickets are still valid. If a ticket hasn't seen
 | |
|   any activity in a long time, it's possible that the problem has been
 | |
|   fixed but the ticket hasn't yet been closed.
 | |
| 
 | |
| * Contacting the owners of tickets that have been claimed but have not
 | |
|   seen any recent activity. If the owner doesn't respond after a week
 | |
|   or so, remove the owner's claim on the ticket.
 | |
| 
 | |
| * Identifying trends and themes in the tickets. If there a lot of bug
 | |
|   reports about a particular part of Django, it may indicate we should
 | |
|   consider refactoring that part of the code. If a trend is emerging,
 | |
|   you should raise it for discussion (referencing the relevant tickets)
 | |
|   on `django-developers`_.
 | |
| 
 | |
| * Set the *type* of tickets that are still uncategorized.
 | |
| 
 | |
| * Verify if patches submitted by other users are correct. If they do and
 | |
|   also contain appropriate documentation and tests then move them to the
 | |
|   "Ready for Checkin" stage. If they don't then leave a comment to explain
 | |
|   why and set the corresponding flags ("Patch needs improvement",
 | |
|   "Needs tests" etc.).
 | |
| 
 | |
| .. note::
 | |
| 
 | |
|     The `Reports page`_ contains links to many useful Trac queries, including
 | |
|     several that are useful for triaging tickets and reviewing patches as
 | |
|     suggested above.
 | |
| 
 | |
|     You can also find more :doc:`new-contributors`.
 | |
| 
 | |
|     .. _Reports page: https://code.djangoproject.com/wiki/Reports
 | |
| 
 | |
| However, we do ask the following of all general community members working in
 | |
| the ticket database:
 | |
| 
 | |
| * Please **don't** close tickets as "wontfix." The core developers will
 | |
|   make the final determination of the fate of a ticket, usually after
 | |
|   consultation with the community.
 | |
| 
 | |
| * Please **don't** promote your own tickets to "Ready for checkin". You
 | |
|   may mark other people's tickets which you've reviewed as "Ready for
 | |
|   checkin", but you should get at minimum one other community member to
 | |
|   review a patch that you submit.
 | |
| 
 | |
| * Please **don't** reverse a decision that has been made by a :doc:`core
 | |
|   developer</internals/committers>`. If you disagree with a decision that
 | |
|   has been made, please post a message to `django-developers`_.
 | |
| 
 | |
| * If you're unsure if you should be making a change, don't make the
 | |
|   change but instead leave a comment with your concerns on the ticket,
 | |
|   or post a message to `django-developers`_. It's okay to be unsure,
 | |
|   but your input is still valuable.
 | |
| 
 | |
| .. _Trac: https://code.djangoproject.com/
 | |
| .. _django-developers: http://groups.google.com/group/django-developers
 | |
| .. _i18n branch: https://code.djangoproject.com/browser/django/branches/i18n
 | |
| .. _`tags/releases`: https://code.djangoproject.com/browser/django/tags/releases
 | |
| .. _`easy pickings`: https://code.djangoproject.com/query?status=!closed&easy=1
 | |
| .. _`creating an account on Trac`: https://www.djangoproject.com/accounts/register/
 | |
| .. _password reset page: https://www.djangoproject.com/accounts/password/reset/
 |