diff options
author | Milo Casagrande <milo.casagrande@linaro.org> | 2014-11-06 16:19:54 +0100 |
---|---|---|
committer | Milo Casagrande <milo.casagrande@linaro.org> | 2014-11-06 16:20:37 +0100 |
commit | b199ffd3901e4614e2cad2bce420cfebaa4e9665 (patch) | |
tree | efc305cc17403215c236185b62a6330f4f7e9298 /app | |
parent | b9a32346a62647f2b45e1669b0091352ae4cd598 (diff) |
subscription: Model refactoring.
Change-Id: I19444d61c77f59ff9174f5380ae8365882d60582
Diffstat (limited to 'app')
-rw-r--r-- | app/models/__init__.py | 2 | ||||
-rw-r--r-- | app/models/subscription.py | 122 | ||||
-rw-r--r-- | app/models/tests/test_subscription_model.py (renamed from app/models/tests/test_models.py) | 111 | ||||
-rw-r--r-- | app/tests/__init__.py | 2 |
4 files changed, 161 insertions, 76 deletions
diff --git a/app/models/__init__.py b/app/models/__init__.py index 3d43a9e..1366962 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -44,6 +44,7 @@ DOC_ID_KEY = 'doc_id' DTB_ADDR_KEY = 'dtb_addr' DTB_KEY = 'dtb' EMAIL_KEY = 'email' +EMAIL_LIST_KEY = 'emails' ENDIANNESS_KEY = 'endian' ERRORS_KEY = 'errors' EXPIRED_KEY = 'expired' @@ -142,6 +143,7 @@ BISECT_BAD_COMMIT_URL = 'bad_commit_url' JOB_DOCUMENT_NAME = '%(job)s-%(kernel)s' BOOT_DOCUMENT_NAME = '%(board)s-%(job)s-%(kernel)s-%(defconfig)s' DEFCONFIG_DOCUMENT_NAME = '%(job)s-%(kernel)s-%(defconfig)s' +SUBSCRIPTION_DOCUMENT_NAME = 'sub-%(job)s-%(kernel)s' # Valid build status. VALID_BUILD_STATUS = [ diff --git a/app/models/subscription.py b/app/models/subscription.py index 66cd136..3960c6c 100644 --- a/app/models/subscription.py +++ b/app/models/subscription.py @@ -1,5 +1,3 @@ -# Copyright (C) 2014 Linaro Ltd. -# # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the @@ -21,36 +19,92 @@ import types from bson import json_util -from models import ( - ID_KEY, - SUBSCRIPTION_COLLECTION, -) -from models.base import BaseDocument +import models +import models.base as modb -class SubscriptionDocument(BaseDocument): +class SubscriptionDocument(modb.BaseDocument): """This class represents a subscription document in the mongodb database. A subscription document contains a list of emails that shoule be notified. It contains an external ID that points to the job ID. """ - SUBSCRIPTION_ID_FORMAT = 'sub-%s' - - def __init__(self, name, job_id): - super(SubscriptionDocument, self).__init__(name) - self._job_id = job_id + def __init__(self, job, kernel): + doc_name = { + models.JOB_KEY: job, + models.KERNEL_KEY: kernel + } + self._name = models.SUBSCRIPTION_DOCUMENT_NAME % doc_name + self._created_on = None + self._id = None + self._job_id = None + self._job = job + self._kernel = kernel self._emails = [] @property def collection(self): - return SUBSCRIPTION_COLLECTION + return models.SUBSCRIPTION_COLLECTION + + @property + def name(self): + """The name of the object.""" + return self._name + + @name.setter + def name(self, value): + """Set the name of the document.""" + self._name = value + + @property + def id(self): + """The ID of this object as returned by mongodb.""" + return self._id + + @id.setter + def id(self, value): + """Set the ID of this object with the ObjectID from mongodb. + + :param value: The ID of this object. + :type value: str + """ + self._id = value + + @property + def job(self): + """The real job name as found on the file system.""" + return self._job + + @property + def kernel(self): + """The real kernel name as found on the file system.""" + return self._kernel + + @property + def created_on(self): + """When this object was created.""" + return self._created_on + + @created_on.setter + def created_on(self, value): + """Set the creation date of this object. + + :param value: The lab creation date, in UTC time zone. + :type value: datetime + """ + self._created_on = value @property def job_id(self): """The job ID this subscriptions belong to.""" return self._job_id + @job_id.setter + def job_id(self, value): + """Set the ID of the associated job.""" + self._job_id = value + @property def emails(self): """The list of emails subscribed.""" @@ -70,9 +124,18 @@ class SubscriptionDocument(BaseDocument): self._emails = list(set(self._emails)) def to_dict(self): - sub_dict = super(SubscriptionDocument, self).to_dict() - sub_dict['emails'] = self._emails - sub_dict['job_id'] = self._job_id + sub_dict = { + models.CREATED_KEY: self.created_on, + models.EMAIL_LIST_KEY: self.emails, + models.JOB_ID_KEY: self.job_id, + models.JOB_KEY: self.job, + models.KERNEL_KEY: self.kernel, + models.NAME_KEY: self.name, + } + + if self.id: + sub_dict[models.ID_KEY] = self.id + return sub_dict @staticmethod @@ -82,15 +145,26 @@ class SubscriptionDocument(BaseDocument): :param json_obj: The JSON object to start from. :return An instance of `SubscriptionDocument`. """ + sub_doc = None + if isinstance(json_obj, types.StringTypes): json_obj = json_util.loads(json_obj) - name = json_obj.pop(ID_KEY) - job_id = json_obj.pop('job_id') - - sub_doc = SubscriptionDocument(name, job_id) - - for key, value in json_obj.iteritems(): - setattr(sub_doc, key, value) + if isinstance(json_obj, types.DictionaryType): + json_pop = json_obj.pop + job = json_pop(models.JOB_KEY) + kernel = json_pop(models.KERNEL_KEY) + doc_id = json_pop(models.ID_KEY) + # Remove the name key. + json_pop(models.NAME_KEY) + + sub_doc = SubscriptionDocument(job, kernel) + sub_doc.id = doc_id + + for key, value in json_obj.iteritems(): + try: + setattr(sub_doc, key, value) + except AttributeError: + print key return sub_doc diff --git a/app/models/tests/test_models.py b/app/models/tests/test_subscription_model.py index c4b1d66..e02dfc6 100644 --- a/app/models/tests/test_models.py +++ b/app/models/tests/test_subscription_model.py @@ -1,5 +1,3 @@ -# Copyright (C) 2014 Linaro Ltd. -# # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the @@ -16,99 +14,110 @@ import types import unittest -from bson import ( - json_util, -) +from bson import json_util -from models.base import BaseDocument -from models.subscription import SubscriptionDocument +import models.base as modb +import models.subscription as mods class TestSubscriptionModel(unittest.TestCase): def test_subscription_document_emails_attribute(self): - sub_doc = SubscriptionDocument('sub', 'job') + sub_doc = mods.SubscriptionDocument("job", "kernel") self.assertIsInstance(sub_doc.emails, types.ListType) self.assertItemsEqual([], sub_doc.emails) def test_subscription_document_emails_attribute_set(self): - sub_doc = SubscriptionDocument('sub', 'job') + sub_doc = mods.SubscriptionDocument("job", "kernel") self.assertIsInstance(sub_doc.emails, types.ListType) self.assertNotIsInstance(sub_doc.emails, types.StringTypes) def test_subscription_document_emails_extended(self): - sub_doc = SubscriptionDocument('sub', 'job') - sub_doc.emails = 'email2' + sub_doc = mods.SubscriptionDocument("job", "kernel") + sub_doc.emails = "email2" self.assertIsInstance(sub_doc.emails, types.ListType) - self.assertEquals(['email2'], sub_doc.emails) + self.assertEquals(["email2"], sub_doc.emails) def test_subscription_document_emails_setter_str(self): - sub_doc = SubscriptionDocument('sub', 'job') - sub_doc.emails = 'an_email' + sub_doc = mods.SubscriptionDocument("job", "kernel") + sub_doc.emails = "an_email" self.assertIsInstance(sub_doc.emails, types.ListType) - self.assertEqual(['an_email'], sub_doc.emails) + self.assertEqual(["an_email"], sub_doc.emails) def test_subscription_document_emails_setter_tuple(self): - sub_doc = SubscriptionDocument('sub', 'job') - sub_doc.emails = ('an_email', 'another_email') + sub_doc = mods.SubscriptionDocument("sub", "job") + sub_doc.emails = ("an_email", "another_email") self.assertIsInstance(sub_doc.emails, types.ListType) - self.assertEqual(['an_email', 'another_email'], sub_doc.emails) + self.assertEqual(["an_email", "another_email"], sub_doc.emails) def test_subscription_document_to_dict(self): - expected = dict(_id='sub', emails=[], job_id='job', created_on=None) - sub_doc = SubscriptionDocument('sub', 'job') + expected = { + "job": "job", + "kernel": "kernel", + "name": "sub-job-kernel", + "emails": [], + "job_id": None, + "created_on": None + } + sub_doc = mods.SubscriptionDocument("job", "kernel") self.assertEqual(expected, sub_doc.to_dict()) - def test_subscription_document_to_json(self): - expected = ( - '{"created_on": null, "_id": "sub", "emails": [], "job_id": "job"}' - ) - sub_doc = SubscriptionDocument('sub', 'job') - self.assertEqual(expected, sub_doc.to_json()) - def test_subscription_document_from_json(self): - json_str = ( - '{"_id": "sub", "emails": [], "job_id": "job"}' - ) - json_obj = json_util.loads(json_str) - - sub_doc = SubscriptionDocument.from_json(json_obj) - - self.assertIsInstance(sub_doc, SubscriptionDocument) - self.assertIsInstance(sub_doc, BaseDocument) - - self.assertEqual(sub_doc.name, 'sub') - self.assertEqual(sub_doc.job_id, 'job') + json_obj = { + "_id": "id", + "name": "sub-job-kernel", + "job": "job", + "kernel": "kernel", + "emails": [], + "job_id": "job-id", + "cerated_on": "now" + } + + sub_doc = mods.SubscriptionDocument.from_json(json_obj) + + self.assertIsInstance(sub_doc, mods.SubscriptionDocument) + self.assertIsInstance(sub_doc, modb.BaseDocument) + + self.assertEqual(sub_doc.name, 'sub-job-kernel') + self.assertEqual(sub_doc.job_id, 'job-id') self.assertIsInstance(sub_doc.emails, types.ListType) def test_subscription_document_from_json_with_emails(self): - json_obj = dict( - _id='sub', - job_id='job', - emails=['a@example.org', 'b@example.org'], - created_on=None, - ) - - sub_doc = SubscriptionDocument.from_json(json_obj) + json_obj = { + "_id": "id", + "job_id": "job-id", + "name": "sub-job-kernel", + "job": "job", + "kernel": "kernel", + "created_on": None, + "emails": [ + "a@example.org", "b@example.org" + ] + } + + sub_doc = mods.SubscriptionDocument.from_json(json_obj) self.assertIsInstance(sub_doc.emails, types.ListType) self.assertEqual(len(sub_doc.emails), 2) def test_subscription_doc_from_json_string(self): json_obj = dict( - _id='sub', - job_id='job', + _id='id', + job="job", + kernel="kernel", + name="sub-job-kernel", + job_id='job-id', emails=['a@example.org', 'b@example.org'], created_on=None, ) json_string = json_util.dumps(json_obj) - sub_doc = SubscriptionDocument.from_json(json_string) + sub_doc = mods.SubscriptionDocument.from_json(json_string) - self.assertIsInstance(sub_doc, SubscriptionDocument) + self.assertIsInstance(sub_doc, mods.SubscriptionDocument) self.assertIsInstance(sub_doc.emails, types.ListType) diff --git a/app/tests/__init__.py b/app/tests/__init__.py index 089d5c1..18ad1ff 100644 --- a/app/tests/__init__.py +++ b/app/tests/__init__.py @@ -35,7 +35,7 @@ def test_modules(): 'models.tests.test_defconfig_model', 'models.tests.test_job_model', 'models.tests.test_lab_model', - 'models.tests.test_models', + 'models.tests.test_subscription_model', 'models.tests.test_token_model', 'utils.batch.tests.test_batch_common', 'utils.bisect.tests.test_bisect', |