Skip to content

Commit 8a18936

Browse files
committed
Only rely on provider_id
* [x] Update tests
1 parent 7146bc8 commit 8a18936

9 files changed

Lines changed: 62 additions & 46 deletions

File tree

backend/code_review_backend/issues/api.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,14 +206,14 @@ class IssueViewSet(
206206

207207
def get_queryset(self):
208208
# Required to generate the OpenAPI documentation
209-
if not self.kwargs.get("diff_id"):
209+
if not self.kwargs.get("diff_provider_id"):
210210
return Issue.objects.none()
211-
diff = get_object_or_404(Diff, id=self.kwargs["diff_id"])
211+
diff = get_object_or_404(Diff, provider_id=self.kwargs["diff_provider_id"])
212212
return (
213213
Issue.objects.filter(issue_links__diff=diff)
214214
.annotate(publishable=Q(issue_links__in_patch=True) & Q(level=LEVEL_ERROR))
215215
.values(
216-
"id",
216+
"provider_id",
217217
"hash",
218218
"analyzer",
219219
"analyzer_check",
@@ -503,7 +503,9 @@ def get_queryset(self):
503503
basename="revision-diffs",
504504
)
505505
router.register(r"diff", DiffViewSet, basename="diffs")
506-
router.register(r"diff/(?P<diff_id>\d+)/issues", IssueViewSet, basename="issues")
506+
router.register(
507+
r"diff/(?P<diff_provider_id>[0-9a-zA-Z-]+)/issues", IssueViewSet, basename="issues"
508+
)
507509
urls = router.urls + [
508510
path(
509511
"revision/<int:revision_id>/issues/",

backend/code_review_backend/issues/compare.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ def detect_new_for_revision(diff: Diff, path: str, hash: str) -> bool:
1212
assert diff is not None, "Missing diff"
1313
return not IssueLink.objects.filter(
1414
revision_id=diff.revision_id,
15-
diff_id__lt=diff.id,
15+
# Ideally we would rely on the diff integer ID, but that information was lost adding the Github support
16+
diff__created__lt=diff.created,
1617
issue__path=path,
1718
issue__hash=hash,
1819
).exists()

backend/code_review_backend/issues/management/commands/load_in_patch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ def process_diff(diff: Diff):
7979
detect_in_patch(issue_link, lines) for issue_link in diff.issue_links.all()
8080
]
8181
logging.info(
82-
f"Found {len([i for i in issue_links if i.in_patch])} issue link in patch for {diff.id}"
82+
f"Found {len([i for i in issue_links if i.in_patch])} issue link in patch for {diff.provider_id}"
8383
)
8484
IssueLink.objects.bulk_update(issue_links, ["in_patch"])
8585
except Exception as e:
86-
logging.info(f"Failure on diff {diff.id}: {e}")
86+
logging.info(f"Failure on diff {diff.provider_id}: {e}")
8787

8888

8989
class Command(BaseCommand):

backend/code_review_backend/issues/management/commands/load_issues.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,9 @@ def build_revision_and_diff(self, data, task_id):
224224
},
225225
)
226226
diff, _ = revision.diffs.get_or_create(
227-
id=data["diff_id"],
227+
provider_id=data["diff_phid"],
228228
defaults={
229229
"repository": head_repository,
230-
"provider_id": data["diff_phid"],
231230
"review_task_id": task_id,
232231
"mercurial_hash": data["mercurial_revision"],
233232
},

backend/code_review_backend/issues/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,10 @@ class Diff(models.Model):
136136
)
137137

138138
def __str__(self):
139-
return f"Diff {self.id}"
139+
return f"Diff {self.provider_id}"
140140

141141
class Meta:
142-
ordering = ("id",)
142+
ordering = ("created",)
143143

144144

145145
class IssueLink(models.Model):

backend/code_review_backend/issues/serializers.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,14 @@ class DiffSerializer(serializers.ModelSerializer):
135135
queryset=Repository.objects.all(), slug_field="url"
136136
)
137137
issues_url = serializers.HyperlinkedIdentityField(
138-
view_name="issues-list", lookup_url_kwarg="diff_id"
138+
view_name="issues-list",
139+
lookup_url_kwarg="diff_provider_id",
140+
lookup_field="provider_id",
139141
)
140142

141143
class Meta:
142144
model = Diff
143145
fields = (
144-
"id",
145146
"provider_id",
146147
"review_task_id",
147148
"repository",
@@ -163,7 +164,7 @@ class DiffLightSerializer(serializers.ModelSerializer):
163164

164165
class Meta:
165166
model = Diff
166-
fields = ("id", "repository", "revision")
167+
fields = ("provider_id", "repository", "revision")
167168

168169

169170
class DiffFullSerializer(serializers.ModelSerializer):
@@ -175,7 +176,9 @@ class DiffFullSerializer(serializers.ModelSerializer):
175176
revision = RevisionSerializer(read_only=True)
176177
repository = RepositorySerializer(read_only=True)
177178
issues_url = serializers.HyperlinkedIdentityField(
178-
view_name="issues-list", lookup_url_kwarg="diff_id"
179+
view_name="issues-list",
180+
lookup_url_kwarg="diff_provider_id",
181+
lookup_field="provider_id",
179182
)
180183
nb_issues = serializers.IntegerField(read_only=True)
181184
nb_issues_publishable = serializers.IntegerField(read_only=True)
@@ -185,9 +188,8 @@ class DiffFullSerializer(serializers.ModelSerializer):
185188
class Meta:
186189
model = Diff
187190
fields = (
188-
"id",
189-
"revision",
190191
"provider_id",
192+
"revision",
191193
"review_task_id",
192194
"repository",
193195
"mercurial_hash",
@@ -264,7 +266,8 @@ class SingleIssueBulkSerializer(IssueSerializer):
264266

265267

266268
class IssueBulkSerializer(serializers.Serializer):
267-
diff_id = serializers.PrimaryKeyRelatedField(
269+
diff_provider_id = serializers.SlugRelatedField(
270+
slug_field="provider_id",
268271
# Initialized depending on the revision used for the creation
269272
queryset=Diff.objects.none(),
270273
style={"base_template": "input.html"},
@@ -277,11 +280,11 @@ def __init__(self, *args, **kwargs):
277280
super().__init__(*args, **kwargs)
278281
if not self.context.get("revision"):
279282
return
280-
self.fields["diff_id"].queryset = self.context["revision"].diffs.all()
283+
self.fields["diff_provider_id"].queryset = self.context["revision"].diffs.all()
281284

282285
@transaction.atomic
283286
def create(self, validated_data):
284-
diff = validated_data.get("diff_id", None)
287+
diff = validated_data.get("diff_provider_id", None)
285288
link_attrs = defaultdict(list)
286289
# Separate attributes that are specific to the IssueLink M2M
287290
for issue in validated_data["issues"]:
@@ -340,7 +343,7 @@ def create(self, validated_data):
340343
output.append(output_link)
341344

342345
return {
343-
"diff_id": diff,
346+
"diff_provider_id": diff,
344347
"issues": output,
345348
}
346349

backend/code_review_backend/issues/tests/test_api.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ def setUp(self):
3838
base_repository=self.repo,
3939
)
4040
self.diff = self.revision.diffs.create(
41-
id=1234,
42-
provider_id="PHID-DIFF-xxx",
41+
provider_id="PHID-DIFF-1234",
4342
review_task_id="deadbeef123",
4443
mercurial_hash="coffee12345",
4544
repository=self.repo_try,
@@ -153,7 +152,7 @@ def test_create_diff(self):
153152
self.diff.delete()
154153
data = {
155154
"id": 1234,
156-
"provider_id": "PHID-DIFF-xxx",
155+
"provider_id": "PHID-DIFF-1234",
157156
"review_task_id": "deadbeef123",
158157
"mercurial_hash": "coffee12345",
159158
"repository": "http://repo.test/try",
@@ -181,12 +180,13 @@ def test_create_diff(self):
181180

182181
# Response should have url to create issues
183182
self.assertEqual(
184-
response.json()["issues_url"], "http://testserver/v1/diff/1234/issues/"
183+
response.json()["issues_url"],
184+
"http://testserver/v1/diff/PHID-DIFF-1234/issues/",
185185
)
186186

187187
# Check a diff has been created
188188
self.assertEqual(Diff.objects.count(), 1)
189-
diff = Diff.objects.get(pk=1234)
189+
diff = Diff.objects.get(provider_id="PHID-DIFF-1234")
190190
self.assertEqual(diff.mercurial_hash, "coffee12345")
191191
self.assertEqual(diff.revision, self.revision)
192192

@@ -204,13 +204,17 @@ def test_create_issue_disabled(self):
204204
}
205205

206206
# No auth will give a permission denied
207-
response = self.client.post("/v1/diff/1234/issues/", data, format="json")
207+
response = self.client.post(
208+
"/v1/diff/PHID-DIFF-1234/issues/", data, format="json"
209+
)
208210
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
209211

210212
# Once authenticated, creation will work
211213
self.assertEqual(Issue.objects.count(), 0)
212214
self.client.force_authenticate(user=self.user)
213-
response = self.client.post("/v1/diff/1234/issues/", data, format="json")
215+
response = self.client.post(
216+
"/v1/diff/PHID-DIFF-1234/issues/", data, format="json"
217+
)
214218
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
215219

216220
# Do not check the content of issue created as it's a random UUID
@@ -281,7 +285,7 @@ def test_create_issue_bulk(self):
281285
self.assertDictEqual(
282286
issue_data,
283287
{
284-
"diff_id": None,
288+
"diff_provider_id": None,
285289
"issues": [
286290
{
287291
"analyzer": "remote-flake8",
@@ -334,7 +338,7 @@ def test_create_issue_bulk_with_diff(self):
334338
Check we can create issues on a revision with a reference to a diff
335339
"""
336340
data = {
337-
"diff_id": 1234,
341+
"diff_provider_id": "PHID-DIFF-1234",
338342
"issues": [
339343
{
340344
"hash": "somemd5hash",
@@ -360,7 +364,7 @@ def test_create_issue_bulk_with_diff(self):
360364
self.assertDictEqual(
361365
response.json(),
362366
{
363-
"diff_id": 1234,
367+
"diff_provider_id": "PHID-DIFF-1234",
364368
"issues": [
365369
{
366370
"analyzer": "remote-flake8",
@@ -551,7 +555,7 @@ def test_create_issue_bulk_duplicate(self):
551555
self.assertDictEqual(
552556
issue_data,
553557
{
554-
"diff_id": None,
558+
"diff_provider_id": None,
555559
# The same issue link is returned twice in the resulting payload
556560
"issues": 2
557561
* [

backend/code_review_backend/issues/tests/test_diff.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_list_diffs(self):
6767
"previous": None,
6868
"results": [
6969
{
70-
"id": 3,
70+
"provider_id": "PHID-DIFF-3",
7171
"revision": {
7272
"id": 1,
7373
"base_repository": "http://repo.test/myrepo",
@@ -87,18 +87,17 @@ def test_list_diffs(self):
8787
"slug": "myrepo-try",
8888
"url": "http://repo.test/try",
8989
},
90-
"provider_id": "PHID-DIFF-3",
9190
"review_task_id": "task-2",
9291
"mercurial_hash": "30b501affc4d3b9c670fc297ab903b406afd5f04",
93-
"issues_url": "http://testserver/v1/diff/3/issues/",
92+
"issues_url": "http://testserver/v1/diff/PHID-DIFF-3/issues/",
9493
"nb_issues": 0,
9594
"nb_issues_publishable": 0,
9695
"nb_warnings": 0,
9796
"nb_errors": 0,
9897
"created": self.now,
9998
},
10099
{
101-
"id": 2,
100+
"provider_id": "PHID-DIFF-2",
102101
"revision": {
103102
"id": 2,
104103
"base_repository": "http://repo.test/myrepo",
@@ -118,18 +117,17 @@ def test_list_diffs(self):
118117
"slug": "myrepo-try",
119118
"url": "http://repo.test/try",
120119
},
121-
"provider_id": "PHID-DIFF-2",
122120
"review_task_id": "task-1",
123121
"mercurial_hash": "32d2a594cfef74fcb524028d1521d0d4bd98bd35",
124-
"issues_url": "http://testserver/v1/diff/2/issues/",
122+
"issues_url": "http://testserver/v1/diff/PHID-DIFF-2/issues/",
125123
"nb_issues": 0,
126124
"nb_issues_publishable": 0,
127125
"nb_warnings": 0,
128126
"nb_errors": 0,
129127
"created": self.now,
130128
},
131129
{
132-
"id": 1,
130+
"provider_id": "PHID-DIFF-1",
133131
"revision": {
134132
"id": 1,
135133
"base_repository": "http://repo.test/myrepo",
@@ -149,10 +147,9 @@ def test_list_diffs(self):
149147
"slug": "myrepo-try",
150148
"url": "http://repo.test/try",
151149
},
152-
"provider_id": "PHID-DIFF-1",
153150
"review_task_id": "task-0",
154151
"mercurial_hash": "a2ac78b7d12d6e55b9b15c1c2048a16c58c6c803",
155-
"issues_url": "http://testserver/v1/diff/1/issues/",
152+
"issues_url": "http://testserver/v1/diff/PHID-DIFF-1/issues/",
156153
"nb_issues": 0,
157154
"nb_issues_publishable": 0,
158155
"nb_warnings": 0,
@@ -172,7 +169,10 @@ def test_filter_repo(self):
172169
response = self.client.get("/v1/diff/?repository=myrepo")
173170
self.assertEqual(response.status_code, status.HTTP_200_OK)
174171
self.assertEqual(response.json()["count"], 3)
175-
self.assertEqual([d["id"] for d in response.json()["results"]], [3, 2, 1])
172+
self.assertEqual(
173+
[d["provider_id"] for d in response.json()["results"]],
174+
["PHID-DIFF-3", "PHID-DIFF-2", "PHID-DIFF-1"],
175+
)
176176

177177
# Missing repo
178178
response = self.client.get("/v1/diff/?repository=missing")
@@ -188,13 +188,18 @@ def test_search(self):
188188
response = self.client.get("/v1/diff/?search=10001")
189189
self.assertEqual(response.status_code, status.HTTP_200_OK)
190190
self.assertEqual(response.json()["count"], 1)
191-
self.assertEqual([d["id"] for d in response.json()["results"]], [2])
191+
self.assertEqual(
192+
[d["provider_id"] for d in response.json()["results"]], ["PHID-DIFF-2"]
193+
)
192194

193195
# In title
194196
response = self.client.get("/v1/diff/?search=revision 1")
195197
self.assertEqual(response.status_code, status.HTTP_200_OK)
196198
self.assertEqual(response.json()["count"], 2)
197-
self.assertEqual([d["id"] for d in response.json()["results"]], [3, 1])
199+
self.assertEqual(
200+
[d["provider_id"] for d in response.json()["results"]],
201+
["PHID-DIFF-3", "PHID-DIFF-1"],
202+
)
198203

199204
def test_filter_issues(self):
200205
"""
@@ -205,7 +210,10 @@ def test_filter_issues(self):
205210
response = self.client.get("/v1/diff/?issues=no")
206211
self.assertEqual(response.status_code, status.HTTP_200_OK)
207212
self.assertEqual(response.json()["count"], 3)
208-
self.assertEqual([d["id"] for d in response.json()["results"]], [3, 2, 1])
213+
self.assertEqual(
214+
[d["provider_id"] for d in response.json()["results"]],
215+
["PHID-DIFF-3", "PHID-DIFF-2", "PHID-DIFF-1"],
216+
)
209217

210218
# Any issues
211219
response = self.client.get("/v1/diff/?issues=any")

backend/code_review_backend/issues/tests/test_stats.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,6 @@ def check_issue(issue):
245245
diffs = issue["diffs"]
246246
self.assertEqual(len(diffs), 1)
247247
diff = diffs[0]
248-
self.assertTrue(diff["id"] > 0)
249248
self.assertEqual(diff["repository"], "http://repo.test/myrepo-try")
250249

251250
# Revision

0 commit comments

Comments
 (0)