Skip to content

Commit 65dcede

Browse files
stephenfinfstachura
authored andcommitted
parser: Extract and save labels
1 parent cb9686f commit 65dcede

3 files changed

Lines changed: 49 additions & 0 deletions

File tree

‎patchwork/parser.py‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from urllib.parse import urlparse, parse_qs
1818

1919
from django.contrib.auth.models import User
20+
from django.db.models import Q
2021
from django.db.utils import IntegrityError
2122
from django.db import transaction
2223
from django.utils import timezone as tz_utils
@@ -26,6 +27,7 @@
2627
from patchwork.models import CoverComment
2728
from patchwork.models import DelegationRule
2829
from patchwork.models import get_default_initial_patch_state
30+
from patchwork.models import Label
2931
from patchwork.models import Patch
3032
from patchwork.models import PatchComment
3133
from patchwork.models import Person
@@ -627,6 +629,17 @@ def parse_version(subject, subject_prefixes):
627629
return 1
628630

629631

632+
def parse_labels(subject_prefixes, project):
633+
"""Extract labels from subject.
634+
635+
Args:
636+
subject_prefixes: List of subject prefixes to extract tags from
637+
"""
638+
return Label.objects.filter(
639+
Q(project=project) | Q(project=None), name__in=subject_prefixes
640+
)
641+
642+
630643
def _find_content(mail):
631644
"""Extract the payload(s) from a mail.
632645
@@ -1270,6 +1283,8 @@ def parse_mail(mail, list_id=None):
12701283
if Patch.objects.filter(project=project, msgid=msgid):
12711284
raise DuplicateMailError(msgid=msgid)
12721285

1286+
labels = parse_labels(prefixes, project)
1287+
12731288
patch = Patch.objects.create(
12741289
msgid=msgid,
12751290
project=project,
@@ -1283,6 +1298,9 @@ def parse_mail(mail, list_id=None):
12831298
delegate=delegate,
12841299
state=find_state(mail),
12851300
)
1301+
if labels:
1302+
patch.labels.set(labels)
1303+
12861304
logger.debug('Patch saved')
12871305

12881306
for attempt in range(1, 11): # arbitrary retry count

‎patchwork/tests/unit/test_parser.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from patchwork.parser import find_comment_content
2929
from patchwork.parser import find_project
3030
from patchwork.parser import find_series
31+
from patchwork.parser import parse_labels
3132
from patchwork.parser import parse_mail as _parse_mail
3233
from patchwork.parser import parse_pull_request
3334
from patchwork.parser import parse_series_marker
@@ -41,6 +42,7 @@
4142
from patchwork.tests.utils import create_cover_comment
4243
from patchwork.tests.utils import create_patch
4344
from patchwork.tests.utils import create_patch_comment
45+
from patchwork.tests.utils import create_label
4446
from patchwork.tests.utils import create_project
4547
from patchwork.tests.utils import create_series
4648
from patchwork.tests.utils import create_series_reference
@@ -1199,6 +1201,20 @@ def test_version(self):
11991201
self.assertEqual(parse_version('Hello, world (v2)', []), 2)
12001202
self.assertEqual(parse_version('Hello, world (V6)', []), 6)
12011203

1204+
def test_labels(self):
1205+
label = create_label(name='RFC')
1206+
1207+
self.assertEqual(list(parse_labels(['RFC'], label.project)), [label])
1208+
self.assertEqual(list(parse_labels(['rfcx'], label.project)), [])
1209+
1210+
project = create_project()
1211+
1212+
self.assertEqual(list(parse_labels(['RFC'], project)), [])
1213+
1214+
label = create_label(name='stuff', project=None)
1215+
1216+
self.assertEqual(list(parse_labels(['stuff'], project)), [label])
1217+
12021218

12031219
class SubjectMatchTest(TestCase):
12041220
def setUp(self):

‎patchwork/tests/utils.py‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from patchwork.models import Check
1616
from patchwork.models import Cover
1717
from patchwork.models import CoverComment
18+
from patchwork.models import Label
1819
from patchwork.models import Patch
1920
from patchwork.models import PatchComment
2021
from patchwork.models import PatchRelation
@@ -319,6 +320,20 @@ def create_relation(**kwargs):
319320
return PatchRelation.objects.create(**kwargs)
320321

321322

323+
def create_label(**kwargs):
324+
"""Create a 'Label' object."""
325+
num = Label.objects.count()
326+
327+
values = {
328+
'name': 'label%d' % num,
329+
'project': create_project() if 'project' not in kwargs else None,
330+
'color': '#fff',
331+
}
332+
values.update(**kwargs)
333+
334+
return Label.objects.create(**values)
335+
336+
322337
def _create_submissions(create_func, count=1, **kwargs):
323338
"""Create 'count' SubmissionMixin-based objects.
324339

0 commit comments

Comments
 (0)