#4099 Store the user who closed a ticket in the database.
Merged 5 years ago by pingou. Opened 5 years ago by cverna.
cverna/pagure fix_3932  into  master

@@ -0,0 +1,31 @@ 

+ """Store the user who closed an issue in the db

+ 

+ Revision ID: 1f24c9c8efa5

+ Revises: 6a3ed02ee160

+ Create Date: 2018-12-04 13:02:57.101095

+ 

+ """

+ 

+ from alembic import op

+ import sqlalchemy as sa

+ 

+ 

+ # revision identifiers, used by Alembic.

+ revision = "1f24c9c8efa5"

+ down_revision = "6a3ed02ee160"

+ 

+ 

+ def upgrade():

+ 

+     op.add_column(

+         "issues",

+         sa.Column(

+             "closed_by_id",

+             sa.Integer,

+             sa.ForeignKey("users.id", onupdate="CASCADE"),

+         ),

+     )

+ 

+ 

+ def downgrade():

+     op.drop_column("issues", "closed_by_id")

file modified
+2
@@ -249,6 +249,7 @@ 

              "blocks": [],

              "close_status": null,

              "closed_at": null,

+             "closed_by": null,

              "comments": [],

              "content": "This issue needs attention",

              "custom_fields": [],
@@ -465,6 +466,7 @@ 

                "blocks": ["1"],

                "close_status": null,

                "closed_at": null,

+               "closed_by": null,

                "comments": [],

                "content": "asd",

                "custom_fields": [],

file modified
+2
@@ -286,6 +286,7 @@ 

                "blocks": [],

                "close_status": null,

                "closed_at": null,

+               "closed_by": null,

                "comments": [],

                "content": "Test Issue",

                "custom_fields": [],
@@ -314,6 +315,7 @@ 

                "blocks": [],

                "close_status": null,

                "closed_at": null,

+               "closed_by": null,

                "comments": [],

                "content": "Test Issue",

                "custom_fields": [],

file modified
+15
@@ -1244,6 +1244,11 @@ 

          sa.DateTime, nullable=False, default=datetime.datetime.utcnow

      )

      closed_at = sa.Column(sa.DateTime, nullable=True)

+     closed_by_id = sa.Column(

+         sa.Integer,

+         sa.ForeignKey("users.id", onupdate="CASCADE"),

+         nullable=True,

+     )

  

      project = relation(

          "Project",
@@ -1279,6 +1284,13 @@ 

          viewonly=True,

      )

  

+     closed_by = relation(

+         "User",

+         foreign_keys=[closed_by_id],

+         remote_side=[User.id],

+         backref="closed_issues",

+     )

+ 

      def __repr__(self):

          return "Issue(%s, project:%s, user:%s, title:%s)" % (

              self.id,
@@ -1436,6 +1448,9 @@ 

              "priority": self.priority,

              "milestone": self.milestone,

              "custom_fields": custom_fields,

+             "closed_by": self.closed_by.to_json(public=public)

+             if self.closed_by

+             else None,

          }

  

          comments = []

file modified
+1
@@ -2026,6 +2026,7 @@ 

          issue.status = status

          if status.lower() != "open":

              issue.closed_at = datetime.datetime.utcnow()

+             issue.closed_by_id = user_obj.id

          elif issue.close_status:

              issue.close_status = None

              close_status = Unspecified

file modified
+3 -1
@@ -90,8 +90,10 @@ 

                  {% endif %}

                </span> {{ issue.closed_at |humanize }}

              </span>

+             {% if issue.closed_by %}

              by

-             <span title="{{ issue.user.html_title }}">{{ issue.user.user }}.</span>

+             <span title="{{ issue.closed_by.html_title }}">{{ issue.closed_by.user }}.</span>

+             {% endif %}

              <span class="text-muted" data-toggle="tooltip" title="{{issue.date_created | format_datetime}}">

                  <span class="font-weight-bold">Opened</span> {{ issue.date_created |humanize }}

              </span>

@@ -40,6 +40,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "We should work on this",

      "custom_fields": [],
@@ -63,6 +64,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -86,6 +88,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -109,6 +112,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -132,6 +136,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -155,6 +160,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -178,6 +184,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -201,6 +208,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -224,6 +232,7 @@ 

      "blocks": [],

      "close_status": None,

      "closed_at": None,

+     "closed_by": None,

      "comments": [],

      "content": "This issue needs attention",

      "custom_fields": [],
@@ -251,6 +260,7 @@ 

      'blocks': [],

      'close_status': None,

      'closed_at': None,

+     "closed_by": None,

      'comments': [],

      'content': 'Description',

      'custom_fields': [],
@@ -271,6 +281,7 @@ 

      'blocks': [],

      'close_status': None,

      'closed_at': None,

+     "closed_by": None,

      'comments': [],

      'content': 'Description',

      'custom_fields': [],
@@ -2337,6 +2348,7 @@ 

                  'blocks': [],

                  'close_status': None,

                  'closed_at': None,

+                 'closed_by': None,

                  'comments': [],

                  'content': 'Description',

                  'custom_fields': [],
@@ -2410,6 +2422,7 @@ 

                "date_created": "1431414800",

                "close_status": None,

                "closed_at": None,

+               "closed_by": None,

                "depends": [],

                "id": 1,

                "last_updated": "1431414800",
@@ -2508,6 +2521,7 @@ 

                "date_created": "1431414800",

                "close_status": None,

                "closed_at": None,

+               "closed_by": None,

                "depends": [],

                "id": 2,

                "last_updated": "1431414800",
@@ -2541,6 +2555,7 @@ 

                "date_created": "1431414800",

                "close_status": None,

                "closed_at": None,

+               "closed_by": None,

                "depends": [],

                "id": 2,

                "last_updated": "1431414800",

@@ -152,6 +152,7 @@ 

                  "blocks": [],

                  "close_status": None,

                  "closed_at": None,

+                 "closed_by": None,

                  "comments": [],

                  "content": "This issue needs attention",

                  "custom_fields": [],
@@ -206,6 +207,7 @@ 

                  "blocks": [],

                  "close_status": None,

                  "closed_at": None,

+                 "closed_by": None,

                  "comments": [],

                  "content": "This issue needs attention",

                  "custom_fields": [],
@@ -260,6 +262,7 @@ 

                  "blocks": [],

                  "close_status": None,

                  "closed_at": None,

+                 "closed_by": None,

                  "comments": [],

                  "content": "This issue needs attention",

                  "custom_fields": [],

@@ -29,6 +29,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "We should work on this",

          "custom_fields": [],
@@ -52,6 +53,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "This issue needs attention",

          "custom_fields": [],
@@ -75,6 +77,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "This issue needs attention",

          "custom_fields": [],
@@ -98,6 +101,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "This issue needs attention",

          "custom_fields": [],
@@ -121,6 +125,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "This issue needs attention",

          "custom_fields": [],
@@ -144,6 +149,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "This issue needs attention",

          "custom_fields": [],
@@ -167,6 +173,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "This issue needs attention",

          "custom_fields": [],
@@ -190,6 +197,7 @@ 

          "blocks": [],

          "close_status": None,

          "closed_at": None,

+         "closed_by": None,

          "comments": [],

          "content": "This issue needs attention",

          "custom_fields": [],
@@ -2498,6 +2506,7 @@ 

                              "blocks": [],

                              "close_status": None,

                              "closed_at": None,

+                             "closed_by": None,

                              "comments": [],

                              "content": "This issue needs attention",

                              "custom_fields": [],
@@ -2577,6 +2586,7 @@ 

                              "blocks": [],

                              "close_status": None,

                              "closed_at": None,

+                             "closed_by": None,

                              "comments": [],

                              "content": "We should work on this",

                              "custom_fields": [],
@@ -2600,6 +2610,7 @@ 

                              "blocks": [],

                              "close_status": None,

                              "closed_at": None,

+                             "closed_by": None,

                              "comments": [],

                              "content": "This issue needs attention",

                              "custom_fields": [],
@@ -2672,6 +2683,7 @@ 

                          "blocks": [],

                          "close_status": None,

                          "closed_at": None,

+                         "closed_by": None,

                          "comments": [],

                          "content": "We should work on this",

                          "custom_fields": [],
@@ -2695,6 +2707,7 @@ 

                          "blocks": [],

                          "close_status": None,

                          "closed_at": None,

+                         "closed_by": None,

                          "comments": [],

                          "content": "This issue needs attention",

                          "custom_fields": [],
@@ -2835,6 +2848,7 @@ 

                          "blocks": [],

                          "close_status": None,

                          "closed_at": None,

+                         "closed_by": None,

                          "comments": [],

                          "content": "We should work on this",

                          "custom_fields": [],
@@ -2858,6 +2872,7 @@ 

                          "blocks": [],

                          "close_status": None,

                          "closed_at": None,

+                         "closed_by": None,

                          "comments": [],

                          "content": "This issue needs attention",

                          "custom_fields": [],
@@ -2948,6 +2963,7 @@ 

                      "blocks": [],

                      "close_status": None,

                      "closed_at": None,

+                     "closed_by": None,

                      "comments": [],

                      "content": "This issue needs attention",

                      "custom_fields": [],
@@ -2996,6 +3012,7 @@ 

                  "blocks": [],

                  "close_status": None,

                  "closed_at": None,

+                 "closed_by": None,

                  "comments": [],

                  "content": "This issue needs attention",

                  "custom_fields": [],

@@ -1225,6 +1225,7 @@ 

                    "blocks": [],

                    "close_status": None,

                    "closed_at": None,

+                   "closed_by": None,

                    "comments": [],

                    "content": "We should work on this",

                    "custom_fields": [],

@@ -3960,7 +3960,9 @@ 

          self.assertEqual(msg.title, 'Test issue')

  

          user = tests.FakeUser()

-         user.username = 'pingou'

+         user.username = 'foo'

+         msg = pagure.lib.query.add_user_to_project(self.session, repo, "foo", "pingou")

+         self.session.commit()

          with tests.user_set(self.app.application, user):

              output = self.app.get('/test/issue/1')

              self.assertEqual(output.status_code, 200)
@@ -4002,6 +4004,13 @@ 

              self.assertTrue(

                  '<option selected value="Fixed">Fixed</option>'

                  in output_text)

+             self.assertIn(

+                 '                Closed: Fixed\n'

+                 '              </span> just now\n'

+                 '            </span>\n'

+                 '            by\n'

+                 '            <span title="foo bar (foo)">foo.</span>\n',

+                 output_text)

  

      def _set_up_for_reaction_test(self, private=False):

          tests.create_projects(self.session)

file modified
+6 -3
@@ -1437,7 +1437,7 @@ 

  index 0000000..60f7480

  --- /dev/null

  +++ b/456

- @@ -0,0 +1,28 @@

+ @@ -0,0 +1,29 @@

  +{

  +    "assignee": null,

  +    "blocks": [],
@@ -1493,6 +1493,8 @@ 

              elif 'closed_at' in row:

                  t = row.split(': ')[0]

                  row = '%s: null,' % t

+             elif 'closed_by' in row:

+                 continue

              elif row.startswith('index 00'):

                  row = 'index 0000000..60f7480'

              elif row.startswith('+++ b/'):
@@ -1535,8 +1537,7 @@ 

  index 458821a..77674a8

  --- a/123

  +++ b/456

- @@ -3,13 +3,32 @@

-      "blocks": [],

+ @@ -4,13 +4,32 @@

       "close_status": null,

       "closed_at": null,

  -    "comments": [],
@@ -1593,6 +1594,8 @@ 

              elif 'closed_at' in row:

                  t = row.split(': ')[0]

                  row = '%s: null,' % t

+             elif 'closed_by' in row:

+                 continue

              elif row.startswith('index'):

                  row = 'index 458821a..77674a8'

              elif row.startswith('--- a/'):

Fixes 3932

Signed-off-by: Clement Verna cverna@tutanota.com

Are these rows really needed? The content of this field shouldn't change much b/w test runs no?

Should we check a little more context here? To ensure that user is mentioned where we expect it to be?

Should we check here if there is a closed_by user first? For ticket that were closed before this PR.

A few questions/suggestions but overall looks fine to me :)

Yes, or I could change the database migration to populate the closed_by user with the current Issue.user. What do you think ?

rebased onto dc55ef88985770ff36b1aaa6aa2c0402d6a6849d

5 years ago

Pretty please pagure-ci rebuild

Do we need the index here? (Not that I mind, but the alembic migration doesn't create it)

I think I would include the by in the if block and drop the else since the information is potentially wrong/confusing in this case

Couple of extra comments but it's looking good

ha no I don't think we need it, I forgot to remove it :)

rebased onto 65ba18f44ea5fe2e27da55443cb9ca504f220533

5 years ago

rebased onto 81c1305

5 years ago

Pull-Request has been merged by pingou

5 years ago