From: Stephen Finucane <[email protected]>

Signed-off-by: Franciszek Stachura <[email protected]>
---
 patchwork/parser.py                 | 18 ++++++++++++++++++
 patchwork/tests/unit/test_parser.py | 16 ++++++++++++++++
 patchwork/tests/utils.py            | 15 +++++++++++++++
 3 files changed, 49 insertions(+)

diff --git a/patchwork/parser.py b/patchwork/parser.py
index 703d07c1..c4d5686b 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -17,6 +17,7 @@ import re
 from urllib.parse import urlparse, parse_qs
 
 from django.contrib.auth.models import User
+from django.db.models import Q
 from django.db.utils import IntegrityError
 from django.db import transaction
 from django.utils import timezone as tz_utils
@@ -26,6 +27,7 @@ from patchwork.models import Cover
 from patchwork.models import CoverComment
 from patchwork.models import DelegationRule
 from patchwork.models import get_default_initial_patch_state
+from patchwork.models import Label
 from patchwork.models import Patch
 from patchwork.models import PatchComment
 from patchwork.models import Person
@@ -627,6 +629,17 @@ def parse_version(subject, subject_prefixes):
     return 1
 
 
+def parse_labels(subject_prefixes, project):
+    """Extract labels from subject.
+
+    Args:
+        subject_prefixes: List of subject prefixes to extract tags from
+    """
+    return Label.objects.filter(
+        Q(project=project) | Q(project=None), name__in=subject_prefixes
+    )
+
+
 def _find_content(mail):
     """Extract the payload(s) from a mail.
 
@@ -1270,6 +1283,8 @@ def parse_mail(mail, list_id=None):
             if Patch.objects.filter(project=project, msgid=msgid):
                 raise DuplicateMailError(msgid=msgid)
 
+            labels = parse_labels(prefixes, project)
+
             patch = Patch.objects.create(
                 msgid=msgid,
                 project=project,
@@ -1283,6 +1298,9 @@ def parse_mail(mail, list_id=None):
                 delegate=delegate,
                 state=find_state(mail),
             )
+            if labels:
+                patch.labels.set(labels)
+
             logger.debug('Patch saved')
 
         for attempt in range(1, 11):  # arbitrary retry count
diff --git a/patchwork/tests/unit/test_parser.py 
b/patchwork/tests/unit/test_parser.py
index 1411ef0b..5e104b64 100644
--- a/patchwork/tests/unit/test_parser.py
+++ b/patchwork/tests/unit/test_parser.py
@@ -28,6 +28,7 @@ from patchwork.parser import find_patch_content as 
find_content
 from patchwork.parser import find_comment_content
 from patchwork.parser import find_project
 from patchwork.parser import find_series
+from patchwork.parser import parse_labels
 from patchwork.parser import parse_mail as _parse_mail
 from patchwork.parser import parse_pull_request
 from patchwork.parser import parse_series_marker
@@ -41,6 +42,7 @@ from patchwork.tests.utils import create_cover
 from patchwork.tests.utils import create_cover_comment
 from patchwork.tests.utils import create_patch
 from patchwork.tests.utils import create_patch_comment
+from patchwork.tests.utils import create_label
 from patchwork.tests.utils import create_project
 from patchwork.tests.utils import create_series
 from patchwork.tests.utils import create_series_reference
@@ -1199,6 +1201,20 @@ class SubjectTest(TestCase):
         self.assertEqual(parse_version('Hello, world (v2)', []), 2)
         self.assertEqual(parse_version('Hello, world (V6)', []), 6)
 
+    def test_labels(self):
+        label = create_label(name='RFC')
+
+        self.assertEqual(list(parse_labels(['RFC'], label.project)), [label])
+        self.assertEqual(list(parse_labels(['rfcx'], label.project)), [])
+
+        project = create_project()
+
+        self.assertEqual(list(parse_labels(['RFC'], project)), [])
+
+        label = create_label(name='stuff', project=None)
+
+        self.assertEqual(list(parse_labels(['stuff'], project)), [label])
+
 
 class SubjectMatchTest(TestCase):
     def setUp(self):
diff --git a/patchwork/tests/utils.py b/patchwork/tests/utils.py
index 4f404891..d4d5029f 100644
--- a/patchwork/tests/utils.py
+++ b/patchwork/tests/utils.py
@@ -15,6 +15,7 @@ from patchwork.models import Bundle
 from patchwork.models import Check
 from patchwork.models import Cover
 from patchwork.models import CoverComment
+from patchwork.models import Label
 from patchwork.models import Patch
 from patchwork.models import PatchComment
 from patchwork.models import PatchRelation
@@ -319,6 +320,20 @@ def create_relation(**kwargs):
     return PatchRelation.objects.create(**kwargs)
 
 
+def create_label(**kwargs):
+    """Create a 'Label' object."""
+    num = Label.objects.count()
+
+    values = {
+        'name': 'label%d' % num,
+        'project': create_project() if 'project' not in kwargs else None,
+        'color': '#fff',
+    }
+    values.update(**kwargs)
+
+    return Label.objects.create(**values)
+
+
 def _create_submissions(create_func, count=1, **kwargs):
     """Create 'count' SubmissionMixin-based objects.
 
-- 
2.55.0

_______________________________________________
Patchwork mailing list
[email protected]
https://lists.ozlabs.org/listinfo/patchwork

Reply via email to