logdetective 2.4.1__py3-none-any.whl → 2.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- logdetective/server/database/base.py +25 -23
- logdetective/server/database/models/koji.py +29 -22
- logdetective/server/database/models/merge_request_jobs.py +163 -164
- logdetective/server/database/models/metrics.py +61 -46
- logdetective/server/emoji.py +7 -7
- logdetective/server/gitlab.py +6 -6
- logdetective/server/metric.py +9 -9
- logdetective/server/plot.py +12 -10
- logdetective/server/server.py +19 -11
- logdetective/server/utils.py +7 -0
- logdetective/utils.py +36 -29
- {logdetective-2.4.1.dist-info → logdetective-2.5.0.dist-info}/METADATA +4 -3
- {logdetective-2.4.1.dist-info → logdetective-2.5.0.dist-info}/RECORD +16 -16
- {logdetective-2.4.1.dist-info → logdetective-2.5.0.dist-info}/WHEEL +0 -0
- {logdetective-2.4.1.dist-info → logdetective-2.5.0.dist-info}/entry_points.txt +0 -0
- {logdetective-2.4.1.dist-info → logdetective-2.5.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -13,6 +13,7 @@ from sqlalchemy import (
|
|
|
13
13
|
ForeignKey,
|
|
14
14
|
UniqueConstraint,
|
|
15
15
|
desc,
|
|
16
|
+
select,
|
|
16
17
|
)
|
|
17
18
|
from sqlalchemy.orm import relationship
|
|
18
19
|
from sqlalchemy.engine import Row
|
|
@@ -70,7 +71,7 @@ class GitlabMergeRequestJobs(Base):
|
|
|
70
71
|
|
|
71
72
|
@classmethod
|
|
72
73
|
@backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
|
|
73
|
-
def create(
|
|
74
|
+
async def create(
|
|
74
75
|
cls,
|
|
75
76
|
forge: Forge,
|
|
76
77
|
project_id: int,
|
|
@@ -86,28 +87,30 @@ class GitlabMergeRequestJobs(Base):
|
|
|
86
87
|
mr_iid: merge request forge iid
|
|
87
88
|
job_id: forge job id
|
|
88
89
|
"""
|
|
89
|
-
with transaction(commit=True) as session:
|
|
90
|
+
async with transaction(commit=True) as session:
|
|
90
91
|
mr = cls()
|
|
91
92
|
mr.forge = forge
|
|
92
93
|
mr.project_id = project_id
|
|
93
94
|
mr.mr_iid = mr_iid
|
|
94
95
|
mr.job_id = job_id
|
|
95
96
|
session.add(mr)
|
|
96
|
-
session.flush()
|
|
97
|
+
await session.flush()
|
|
97
98
|
return mr.id
|
|
98
99
|
|
|
99
100
|
@classmethod
|
|
100
|
-
def get_by_id(
|
|
101
|
+
async def get_by_id(
|
|
101
102
|
cls,
|
|
102
103
|
id_: int,
|
|
103
104
|
) -> Optional["GitlabMergeRequestJobs"]:
|
|
104
105
|
"""Search for a given PostgreSQL id"""
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
query = select(cls).where(cls.id == id_)
|
|
107
|
+
async with transaction(commit=False) as session:
|
|
108
|
+
query_result = await session.execute(query)
|
|
109
|
+
mr = query_result.scalars().first()
|
|
107
110
|
return mr
|
|
108
111
|
|
|
109
112
|
@classmethod
|
|
110
|
-
def get_by_details(
|
|
113
|
+
async def get_by_details(
|
|
111
114
|
cls,
|
|
112
115
|
forge: Forge,
|
|
113
116
|
project_id: int,
|
|
@@ -122,36 +125,34 @@ class GitlabMergeRequestJobs(Base):
|
|
|
122
125
|
mr_iid: merge request forge iid
|
|
123
126
|
job_id: forge job id
|
|
124
127
|
"""
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
)
|
|
128
|
+
query = select(cls).where(
|
|
129
|
+
cls.forge == forge,
|
|
130
|
+
cls.project_id == project_id,
|
|
131
|
+
cls.mr_iid == mr_iid,
|
|
132
|
+
cls.job_id == job_id,
|
|
133
|
+
)
|
|
134
|
+
async with transaction(commit=False) as session:
|
|
135
|
+
query_result = await session.execute(query)
|
|
136
|
+
mr = query_result.scalars().first()
|
|
133
137
|
return mr
|
|
134
138
|
|
|
135
139
|
@classmethod
|
|
136
|
-
def get_by_mr_iid(
|
|
137
|
-
cls, forge: Forge, project_id: int, mr_iid
|
|
138
|
-
) -> List[Self]:
|
|
140
|
+
async def get_by_mr_iid(cls, forge: Forge, project_id: int, mr_iid) -> List[Self]:
|
|
139
141
|
"""Get all the mr jobs saved for the specified mr iid and project id."""
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
)
|
|
142
|
+
query = select(cls).where(
|
|
143
|
+
GitlabMergeRequestJobs.forge == forge,
|
|
144
|
+
GitlabMergeRequestJobs.project_id == project_id,
|
|
145
|
+
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
async with transaction(commit=False) as session:
|
|
149
|
+
query_result = await session.execute(query)
|
|
150
|
+
comments = query_result.scalars().all()
|
|
150
151
|
|
|
151
152
|
return comments
|
|
152
153
|
|
|
153
154
|
@classmethod
|
|
154
|
-
def get_or_create(
|
|
155
|
+
async def get_or_create(
|
|
155
156
|
cls,
|
|
156
157
|
forge: Forge,
|
|
157
158
|
project_id: int,
|
|
@@ -167,10 +168,12 @@ class GitlabMergeRequestJobs(Base):
|
|
|
167
168
|
mr_iid: merge request forge iid
|
|
168
169
|
job_id: forge job id
|
|
169
170
|
"""
|
|
170
|
-
mr = GitlabMergeRequestJobs.get_by_details(
|
|
171
|
+
mr = await GitlabMergeRequestJobs.get_by_details(
|
|
172
|
+
forge, project_id, mr_iid, job_id
|
|
173
|
+
)
|
|
171
174
|
if mr is None:
|
|
172
|
-
id_ = GitlabMergeRequestJobs.create(forge, project_id, mr_iid, job_id)
|
|
173
|
-
mr = GitlabMergeRequestJobs.get_by_id(id_)
|
|
175
|
+
id_ = await GitlabMergeRequestJobs.create(forge, project_id, mr_iid, job_id)
|
|
176
|
+
mr = await GitlabMergeRequestJobs.get_by_id(id_)
|
|
174
177
|
return mr
|
|
175
178
|
|
|
176
179
|
|
|
@@ -197,7 +200,9 @@ class Comments(Base):
|
|
|
197
200
|
comment="The comment gitlab id",
|
|
198
201
|
)
|
|
199
202
|
created_at = Column(
|
|
200
|
-
DateTime
|
|
203
|
+
DateTime(timezone=True),
|
|
204
|
+
nullable=False,
|
|
205
|
+
comment="Timestamp when the comment was created",
|
|
201
206
|
)
|
|
202
207
|
|
|
203
208
|
__table_args__ = (
|
|
@@ -209,7 +214,7 @@ class Comments(Base):
|
|
|
209
214
|
|
|
210
215
|
@classmethod
|
|
211
216
|
@backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
|
|
212
|
-
def create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
217
|
+
async def create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
213
218
|
cls,
|
|
214
219
|
forge: Forge,
|
|
215
220
|
project_id: int,
|
|
@@ -230,8 +235,8 @@ class Comments(Base):
|
|
|
230
235
|
job_id: forge job id
|
|
231
236
|
comment_id: forge comment id
|
|
232
237
|
"""
|
|
233
|
-
with transaction(commit=True) as session:
|
|
234
|
-
mr_job = GitlabMergeRequestJobs.get_or_create(
|
|
238
|
+
async with transaction(commit=True) as session:
|
|
239
|
+
mr_job = await GitlabMergeRequestJobs.get_or_create(
|
|
235
240
|
forge, project_id, mr_iid, job_id
|
|
236
241
|
)
|
|
237
242
|
|
|
@@ -245,21 +250,23 @@ class Comments(Base):
|
|
|
245
250
|
comment.created_at = datetime.datetime.now(datetime.timezone.utc)
|
|
246
251
|
comment.merge_request_job_id = mr_job.id
|
|
247
252
|
session.add(comment)
|
|
248
|
-
session.flush()
|
|
253
|
+
await session.flush()
|
|
249
254
|
return comment.id
|
|
250
255
|
|
|
251
256
|
@classmethod
|
|
252
|
-
def get_by_id(
|
|
257
|
+
async def get_by_id(
|
|
253
258
|
cls,
|
|
254
259
|
id_: int,
|
|
255
260
|
) -> Optional["Comments"]:
|
|
256
261
|
"""Search for a given PostgreSQL id"""
|
|
257
|
-
|
|
258
|
-
|
|
262
|
+
query = select(cls).where(cls.id == id_)
|
|
263
|
+
async with transaction(commit=False) as session:
|
|
264
|
+
query_result = await session.execute(query)
|
|
265
|
+
comment = query_result.scalars().first()
|
|
259
266
|
return comment
|
|
260
267
|
|
|
261
268
|
@classmethod
|
|
262
|
-
def get_by_gitlab_id(
|
|
269
|
+
async def get_by_gitlab_id(
|
|
263
270
|
cls,
|
|
264
271
|
forge: Forge,
|
|
265
272
|
comment_id: str,
|
|
@@ -271,24 +278,21 @@ class Comments(Base):
|
|
|
271
278
|
forge: forge name
|
|
272
279
|
comment_id: forge comment id
|
|
273
280
|
"""
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
cls.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
280
|
-
)
|
|
281
|
-
.filter(
|
|
282
|
-
GitlabMergeRequestJobs.forge == forge,
|
|
283
|
-
cls.comment_id == comment_id,
|
|
284
|
-
)
|
|
285
|
-
.first()
|
|
281
|
+
query = (
|
|
282
|
+
select(cls)
|
|
283
|
+
.join(
|
|
284
|
+
GitlabMergeRequestJobs,
|
|
285
|
+
cls.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
286
286
|
)
|
|
287
|
-
|
|
287
|
+
.filter(GitlabMergeRequestJobs.forge == forge, cls.comment_id == comment_id)
|
|
288
|
+
)
|
|
289
|
+
async with transaction(commit=False) as session:
|
|
290
|
+
query_result = await session.execute(query)
|
|
291
|
+
comment = query_result.scalars().first()
|
|
288
292
|
return comment
|
|
289
293
|
|
|
290
294
|
@classmethod
|
|
291
|
-
def get_latest_comment(
|
|
295
|
+
async def get_latest_comment(
|
|
292
296
|
cls,
|
|
293
297
|
forge: Forge,
|
|
294
298
|
project_id: int,
|
|
@@ -301,26 +305,26 @@ class Comments(Base):
|
|
|
301
305
|
project_id: forge project id
|
|
302
306
|
mr_iid: merge request forge iid
|
|
303
307
|
"""
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
cls.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
310
|
-
)
|
|
311
|
-
.filter(
|
|
312
|
-
GitlabMergeRequestJobs.forge == forge,
|
|
313
|
-
GitlabMergeRequestJobs.project_id == project_id,
|
|
314
|
-
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
315
|
-
)
|
|
316
|
-
.order_by(desc(cls.created_at))
|
|
317
|
-
.first()
|
|
308
|
+
query = (
|
|
309
|
+
select(cls)
|
|
310
|
+
.join(
|
|
311
|
+
GitlabMergeRequestJobs,
|
|
312
|
+
cls.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
318
313
|
)
|
|
319
|
-
|
|
314
|
+
.filter(
|
|
315
|
+
GitlabMergeRequestJobs.forge == forge,
|
|
316
|
+
GitlabMergeRequestJobs.project_id == project_id,
|
|
317
|
+
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
318
|
+
)
|
|
319
|
+
.order_by(desc(cls.created_at))
|
|
320
|
+
)
|
|
321
|
+
async with transaction(commit=False) as session:
|
|
322
|
+
query_result = await session.execute(query)
|
|
323
|
+
comment = query_result.scalars().first()
|
|
320
324
|
return comment
|
|
321
325
|
|
|
322
326
|
@classmethod
|
|
323
|
-
def get_mr_comments(
|
|
327
|
+
async def get_mr_comments(
|
|
324
328
|
cls,
|
|
325
329
|
forge: Forge,
|
|
326
330
|
project_id: int,
|
|
@@ -333,26 +337,26 @@ class Comments(Base):
|
|
|
333
337
|
project_id: forge project id
|
|
334
338
|
mr_iid: merge request forge iid
|
|
335
339
|
"""
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
cls.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
342
|
-
)
|
|
343
|
-
.filter(
|
|
344
|
-
GitlabMergeRequestJobs.forge == forge,
|
|
345
|
-
GitlabMergeRequestJobs.project_id == project_id,
|
|
346
|
-
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
347
|
-
)
|
|
348
|
-
.order_by(desc(cls.created_at))
|
|
349
|
-
.all()
|
|
340
|
+
query = (
|
|
341
|
+
select(cls)
|
|
342
|
+
.join(
|
|
343
|
+
GitlabMergeRequestJobs,
|
|
344
|
+
cls.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
350
345
|
)
|
|
351
|
-
|
|
346
|
+
.filter(
|
|
347
|
+
GitlabMergeRequestJobs.forge == forge,
|
|
348
|
+
GitlabMergeRequestJobs.project_id == project_id,
|
|
349
|
+
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
350
|
+
)
|
|
351
|
+
.order_by(desc(cls.created_at))
|
|
352
|
+
)
|
|
353
|
+
async with transaction(commit=False) as session:
|
|
354
|
+
query_result = await session.execute(query)
|
|
355
|
+
comments = query_result.scalars().all()
|
|
352
356
|
return comments
|
|
353
357
|
|
|
354
358
|
@classmethod
|
|
355
|
-
def get_or_create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
359
|
+
async def get_or_create( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
356
360
|
cls,
|
|
357
361
|
forge: Forge,
|
|
358
362
|
project_id: int,
|
|
@@ -370,40 +374,31 @@ class Comments(Base):
|
|
|
370
374
|
job_id: forge job id
|
|
371
375
|
comment_id: forge comment id
|
|
372
376
|
"""
|
|
373
|
-
comment = Comments.get_by_gitlab_id(forge, comment_id)
|
|
377
|
+
comment = await Comments.get_by_gitlab_id(forge, comment_id)
|
|
374
378
|
if comment is None:
|
|
375
|
-
id_ = Comments.create(forge, project_id, mr_iid, job_id, comment_id)
|
|
376
|
-
comment = Comments.get_by_id(id_)
|
|
379
|
+
id_ = await Comments.create(forge, project_id, mr_iid, job_id, comment_id)
|
|
380
|
+
comment = await Comments.get_by_id(id_)
|
|
377
381
|
return comment
|
|
378
382
|
|
|
379
383
|
@classmethod
|
|
380
|
-
def get_since(cls, time: datetime.datetime) -> List[Self]:
|
|
384
|
+
async def get_since(cls, time: datetime.datetime) -> List[Self]:
|
|
381
385
|
"""Get all the comments created after the given time."""
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
Comments.created_at > time,
|
|
387
|
-
)
|
|
388
|
-
.all()
|
|
389
|
-
)
|
|
386
|
+
query = select(cls).filter(Comments.created_at > time)
|
|
387
|
+
async with transaction(commit=False) as session:
|
|
388
|
+
query_result = await session.execute(query)
|
|
389
|
+
comments = query_result.scalars().all()
|
|
390
390
|
|
|
391
391
|
return comments
|
|
392
392
|
|
|
393
393
|
@classmethod
|
|
394
|
-
def get_by_mr_job(
|
|
394
|
+
async def get_by_mr_job(
|
|
395
395
|
cls, merge_request_job: GitlabMergeRequestJobs
|
|
396
396
|
) -> Optional["Comments"]:
|
|
397
397
|
"""Get the comment added for the specified merge request's job."""
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
Comments.merge_request_job == merge_request_job,
|
|
403
|
-
)
|
|
404
|
-
.first() # just one
|
|
405
|
-
)
|
|
406
|
-
|
|
398
|
+
query = select(cls).filter(Comments.merge_request_job == merge_request_job)
|
|
399
|
+
async with transaction(commit=False) as session:
|
|
400
|
+
query_result = await session.execute(query)
|
|
401
|
+
comments = query_result.scalars().first()
|
|
407
402
|
return comments
|
|
408
403
|
|
|
409
404
|
|
|
@@ -440,7 +435,7 @@ class Reactions(Base):
|
|
|
440
435
|
|
|
441
436
|
@classmethod
|
|
442
437
|
@backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
|
|
443
|
-
def create_or_update( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
438
|
+
async def create_or_update( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
444
439
|
cls,
|
|
445
440
|
forge: Forge,
|
|
446
441
|
project_id: int,
|
|
@@ -462,11 +457,13 @@ class Reactions(Base):
|
|
|
462
457
|
reaction_type: a str, ex. thumb_up
|
|
463
458
|
count: number of reactions, of this type, given in the comment
|
|
464
459
|
"""
|
|
465
|
-
comment = Comments.get_or_create(
|
|
466
|
-
|
|
460
|
+
comment = await Comments.get_or_create(
|
|
461
|
+
forge, project_id, mr_iid, job_id, comment_id
|
|
462
|
+
)
|
|
463
|
+
reaction = await cls.get_reaction_by_type(
|
|
467
464
|
forge, project_id, mr_iid, job_id, comment_id, reaction_type
|
|
468
465
|
)
|
|
469
|
-
with transaction(commit=True) as session:
|
|
466
|
+
async with transaction(commit=True) as session:
|
|
470
467
|
if reaction:
|
|
471
468
|
reaction.count = count # just update
|
|
472
469
|
else:
|
|
@@ -475,11 +472,11 @@ class Reactions(Base):
|
|
|
475
472
|
reaction.reaction_type = reaction_type
|
|
476
473
|
reaction.count = count
|
|
477
474
|
session.add(reaction)
|
|
478
|
-
session.flush()
|
|
475
|
+
await session.flush()
|
|
479
476
|
return reaction.id
|
|
480
477
|
|
|
481
478
|
@classmethod
|
|
482
|
-
def get_all_reactions( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
479
|
+
async def get_all_reactions( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
483
480
|
cls,
|
|
484
481
|
forge: Forge,
|
|
485
482
|
project_id: int,
|
|
@@ -496,28 +493,28 @@ class Reactions(Base):
|
|
|
496
493
|
job_id: forge job id
|
|
497
494
|
comment_id: forge comment id
|
|
498
495
|
"""
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
506
|
-
)
|
|
507
|
-
.filter(
|
|
508
|
-
Comments.comment_id == comment_id,
|
|
509
|
-
GitlabMergeRequestJobs.forge == forge,
|
|
510
|
-
GitlabMergeRequestJobs.project_id == project_id,
|
|
511
|
-
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
512
|
-
GitlabMergeRequestJobs.job_id == job_id,
|
|
513
|
-
)
|
|
514
|
-
.all()
|
|
496
|
+
query = (
|
|
497
|
+
select(cls)
|
|
498
|
+
.join(Comments, cls.comment_id == Comments.id)
|
|
499
|
+
.join(
|
|
500
|
+
GitlabMergeRequestJobs,
|
|
501
|
+
Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
515
502
|
)
|
|
516
|
-
|
|
503
|
+
.filter(
|
|
504
|
+
Comments.comment_id == comment_id,
|
|
505
|
+
GitlabMergeRequestJobs.forge == forge,
|
|
506
|
+
GitlabMergeRequestJobs.project_id == project_id,
|
|
507
|
+
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
508
|
+
GitlabMergeRequestJobs.job_id == job_id,
|
|
509
|
+
)
|
|
510
|
+
)
|
|
511
|
+
async with transaction(commit=False) as session:
|
|
512
|
+
query_result = await session.execute(query)
|
|
513
|
+
reactions = query_result.scalars().all()
|
|
517
514
|
return reactions
|
|
518
515
|
|
|
519
516
|
@classmethod
|
|
520
|
-
def get_reaction_by_type( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
517
|
+
async def get_reaction_by_type( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
521
518
|
cls,
|
|
522
519
|
forge: Forge,
|
|
523
520
|
project_id: int,
|
|
@@ -537,30 +534,30 @@ class Reactions(Base):
|
|
|
537
534
|
comment_id: forge comment id
|
|
538
535
|
reaction_type: str like "thumb-up"
|
|
539
536
|
"""
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
547
|
-
)
|
|
548
|
-
.filter(
|
|
549
|
-
Comments.comment_id == comment_id,
|
|
550
|
-
GitlabMergeRequestJobs.forge == forge,
|
|
551
|
-
GitlabMergeRequestJobs.project_id == project_id,
|
|
552
|
-
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
553
|
-
GitlabMergeRequestJobs.job_id == job_id,
|
|
554
|
-
Reactions.reaction_type == reaction_type,
|
|
555
|
-
)
|
|
556
|
-
.first()
|
|
537
|
+
query = (
|
|
538
|
+
select(cls)
|
|
539
|
+
.join(Comments, cls.comment_id == Comments.id)
|
|
540
|
+
.join(
|
|
541
|
+
GitlabMergeRequestJobs,
|
|
542
|
+
Comments.merge_request_job_id == GitlabMergeRequestJobs.id,
|
|
557
543
|
)
|
|
558
|
-
|
|
544
|
+
.filter(
|
|
545
|
+
Comments.comment_id == comment_id,
|
|
546
|
+
GitlabMergeRequestJobs.forge == forge,
|
|
547
|
+
GitlabMergeRequestJobs.project_id == project_id,
|
|
548
|
+
GitlabMergeRequestJobs.mr_iid == mr_iid,
|
|
549
|
+
GitlabMergeRequestJobs.job_id == job_id,
|
|
550
|
+
Reactions.reaction_type == reaction_type,
|
|
551
|
+
)
|
|
552
|
+
)
|
|
553
|
+
async with transaction(commit=False) as session:
|
|
554
|
+
query_result = await session.execute(query)
|
|
555
|
+
reaction = query_result.scalars().first()
|
|
559
556
|
return reaction
|
|
560
557
|
|
|
561
558
|
@classmethod
|
|
562
559
|
@backoff.on_exception(backoff.expo, OperationalError, max_tries=DB_MAX_RETRIES)
|
|
563
|
-
def delete( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
560
|
+
async def delete( # pylint: disable=too-many-arguments disable=too-many-positional-arguments
|
|
564
561
|
cls,
|
|
565
562
|
forge: Forge,
|
|
566
563
|
project_id: int,
|
|
@@ -580,25 +577,27 @@ class Reactions(Base):
|
|
|
580
577
|
reaction_type: a str iterable, ex. ['thumbsup', 'thumbsdown']
|
|
581
578
|
"""
|
|
582
579
|
for reaction_type in reaction_types:
|
|
583
|
-
reaction = cls.get_reaction_by_type(
|
|
580
|
+
reaction = await cls.get_reaction_by_type(
|
|
584
581
|
forge, project_id, mr_iid, job_id, comment_id, reaction_type
|
|
585
582
|
)
|
|
586
|
-
with transaction(commit=True) as session:
|
|
587
|
-
session.delete(reaction)
|
|
588
|
-
session.flush()
|
|
583
|
+
async with transaction(commit=True) as session:
|
|
584
|
+
await session.delete(reaction)
|
|
585
|
+
await session.flush()
|
|
589
586
|
|
|
590
587
|
@classmethod
|
|
591
|
-
def get_since(
|
|
588
|
+
async def get_since(
|
|
592
589
|
cls, time: datetime.datetime
|
|
593
590
|
) -> List[Row[Tuple[datetime.datetime, Self]]]:
|
|
594
591
|
"""Get all the reactions on comments created after the given time
|
|
595
592
|
and the comment creation time."""
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
593
|
+
query = (
|
|
594
|
+
select(Comments.created_at, cls)
|
|
595
|
+
.join(Comments, cls.comment_id == Comments.id)
|
|
596
|
+
.filter(Comments.created_at > time)
|
|
597
|
+
)
|
|
598
|
+
|
|
599
|
+
async with transaction(commit=False) as session:
|
|
600
|
+
query_results = await session.execute(query)
|
|
601
|
+
reactions = query_results.all()
|
|
603
602
|
|
|
604
603
|
return reactions
|